如何关闭所有具有相同标题的窗口

时间:2014-08-21 07:36:49

标签: delphi

我的应用程序中的线程在另一个应用程序中显示消息框,在线程创建的每个事件上都标题为“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;

但是这个循环只有在我手动关闭最后一条消息时才有效

注意:消息框来自另一个不在同一个应用程序中的应用程序。

2 个答案:

答案 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毫秒的时间太少了。)