我的应用程序中的线程在另一个应用程序中显示消息框,在线程创建的每个事件上都标题为“Test”,在此线程结束时我想关闭所有这些消息。
我试图像这样创建循环
while FindWindow(Nil,PChar('Test')) <> 0 do
begin
Sleep(5); //if i remove the sleep the application will hanging and froze.
SendMessage(FindWindow(Nil,PChar('Test')), WM_CLOSE, 0, 0); // close the window message
end;
但是这个循环只有在我手动关闭最后一条消息时才有效
注意:消息框来自另一个不在同一个应用程序中的应用程序。
答案 0 :(得分:4)
请改为尝试:
var
Wnd: HWND;
begin
Wnd := FindWindow(Nil, 'Test');
while Wnd <> 0 do
begin
PostMessage(Wnd, WM_CLOSE, 0, 0);
Wnd := FindWindowEx(0, Wnd, Nil, 'Test');
end;
end;
或者:
function CloseTestWnd(Wnd: HWND; Param: LPARAM): BOOL; stdcall;
var
szText: array[0..5] of Char;
begin
if GetWindowText(Wnd, szText, Length(szText)) > 0 then
if StrComp(szText, 'Test') = 0 then
PostMessage(Wnd, WM_CLOSE, 0, 0);
Result := True;
end;
begin
EnumWindows(@CloseTestWnd, 0);
end;
答案 1 :(得分:0)
你的逻辑似乎有点......关闭。 :-)您可能会也可能不会将WM_CLOSE
发送到同一个窗口,因为您正在使用一个FindWindow
来查看它是否存在以及对FindWindow
的不同呼叫发送消息。
我建议更喜欢这样做:
var
Wnd: HWnd;
begin
Wnd := FindWindow(nil, 'Test'); // Find the first window (if any)
while Wnd <> 0 do
begin
SendMessage(Wnd, WM_CLOSE, 0, 0); // Send the message
Sleep(5); // Allow time to close
Wnd := FindWindow(nil, 'Test'); // See if there's another one
end;
end;
根据其他应用程序的操作,您可能需要增加Sleep
时间,以便允许窗口时间接收和处理WM_CLOSE
消息;否则,您只需将其多次发送到同一窗口即可。 (我怀疑5毫秒的时间太少了。)