简体   繁体   中英

How to close all windows with the same title

i have thread in my application shows messageboxs in another application with title 'Test' on every event the thread create it,by the end of this thread i wanna close all of this messages.

i tried to create loop like this

  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;

but this loop works only if i close the last message manually

Note: the messageboxs comes from another applaction not in the same application have this thread.

Try this instead:

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;

Or:

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;

Your logic seems to be somewhat... off. :-) You may or may not be sending the WM_CLOSE to the same window, since you're using one FindWindow to see if it exists and a different call to FindWindow to send the message.

I'd suggest doing it more like this:

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;

Depending on what the other application is doing, you may need to increase the Sleep time in order to allow the window time to receive and process the WM_CLOSE message; otherwise, you'll be simply sending it multiple times to the same window. (I'm suspecting that 5 ms is far too little time.)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM