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


但是此循环仅在我手动关闭最后一条消息时有效

注意:消息框来自另一个应用程序,而不是在同一应用程序中具有此线程。

最佳答案

尝试以下方法:

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;

关于delphi - 如何关闭所有具有相同标题的窗口,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25420731/

10-09 09:29