主题:如何在程序启动时关闭前一次启动的同名实例
一江秋水
[专家分:9680] 发布于 2008-02-13 22:13:00
请注意:
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个回复)
沙发
长尾兔 [专家分:3630] 发布于 2008-02-14 09:18:00
用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;
板凳
长尾兔 [专家分:3630] 发布于 2008-02-14 10:35:00
惭愧啊....我改不成VB的代码。哪位好心人可以帮楼主改一下?
思路就是:
在Form的OnLoad里,使用EnumWindows调用回调函数并将当前程序主窗体句柄做为附加参数传入,在回调函数里判断列举的顶层窗口句柄是否等于附加参数,如不相等,且用GetWindowText获得的窗口标题等于设定的窗口标题,则发消息关闭......
3 楼
一江秋水 [专家分:9680] 发布于 2008-02-14 14:33:00
经过反复试验,终于成功!好高兴!
说起来很简单,用VB窗体的类名(ThunderRT6FormDC)替换代码中的vbNullString即可
谢谢长尾免的热心帮助!
4 楼
家人 [专家分:6760] 发布于 2008-02-14 14:45:00
你可以试试去掉If App.PrevInstance Then
在sub main中直接
SendMessage FindWindow(vbNullString, "VCD播放器"), WM_CLOSE, 0, 0
我来回复