回 帖 发 新 帖 刷新版面

主题:如何在程序启动时关闭前一次启动的同名实例

请注意:
1.不是关闭自己,而是关闭前一次启动的相同程序。
2.两个实例窗体的类名与标题都是相同的(VCD播放器)

我的代码是:

Private Sub Form_Initialize()
If App.PrevInstance Then SendMessage FindWindow(vbNullString, "VCD播放器"), WM_CLOSE, 0, 0
End Sub

在刚完成时,曾经是成功的,后来不知怎么回事,没有效了,我还试验过将这段代码放到模块的Sub Main过程中,将Sub Main设置为启动过程,但也没有效
向各位求教!

回复列表 (共4个回复)

沙发

用Delphi给写了一个代码(不一定完善哈),你先看一下。我VB不熟悉,我再试着给改VB代码试一下:

function CallBkProc(H, hSelf : hwnd): boolean; stdcall;
var
  tempArr : array[0..255] of char;
  tempCpt : string;
begin
  Result := H > 0;
  if H > 0 then begin
    GetWindowText(H, tempArr, 256);
    tempCpt := StrPas(@tempArr[0]);
    if (H <> hSelf) and (tempCpt = 'VCD播放器') then
      SendMessage(H, WM_Close, 0, 0);
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  hSelf : hwnd;
begin
  hSelf := Self.Handle;
  EnumWindows(@CallBkProc, hSelf);
end;

板凳

惭愧啊....我改不成VB的代码。哪位好心人可以帮楼主改一下?

思路就是:

在Form的OnLoad里,使用EnumWindows调用回调函数并将当前程序主窗体句柄做为附加参数传入,在回调函数里判断列举的顶层窗口句柄是否等于附加参数,如不相等,且用GetWindowText获得的窗口标题等于设定的窗口标题,则发消息关闭......

3 楼

经过反复试验,终于成功!好高兴!
说起来很简单,用VB窗体的类名(ThunderRT6FormDC)替换代码中的vbNullString即可
谢谢长尾免的热心帮助!

4 楼

你可以试试去掉If App.PrevInstance Then 
在sub main中直接
SendMessage FindWindow(vbNullString, "VCD播放器"), WM_CLOSE, 0, 0

我来回复

您尚未登录,请登录后再回复。点此登录或注册