Delphi 如何关闭标题相同的所有窗口
我的应用程序中有线程在另一个应用程序中显示MessageBox,在线程创建它的每个事件上都有标题“Test”,在这个线程结束时,我想关闭所有这些消息 我试图创建这样的循环Delphi 如何关闭标题相同的所有窗口,delphi,Delphi,我的应用程序中有线程在另一个应用程序中显示MessageBox,在线程创建它的每个事件上都有标题“Test”,在这个线程结束时,我想关闭所有这些消息 我试图创建这样的循环 while FindWindow(Nil,PChar('Test')) <> 0 do begin Sleep(5); //if i remove the sleep the application will hanging and froze. SendMessage(FindWindo
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;
而FindWindow(Nil,PChar('Test'))0执行
开始
睡眠(5)//如果我删除睡眠,应用程序将挂起并冻结。
SendMessage(FindWindow(Nil,PChar('Test')),WM_CLOSE,0,0);//关闭窗口消息
结束;
但是这个循环只有在我手动关闭最后一条消息时才起作用
注意:MessageBox来自另一个applaction,但不在同一个应用程序中,因此具有此线程 你的逻辑似乎有点。。。关闭。:-)您可能会也可能不会将
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;
var
Wnd:HWnd;
开始
Wnd:=FindWindow(nil,“Test”);//查找第一个窗口(如果有)
而Wnd 0做什么
开始
SendMessage(Wnd,WM_CLOSE,0,0);//发送消息
睡眠(5);//留出时间关闭
Wnd:=FindWindow(nil,“Test”);//看看还有没有别的
结束;
结束;
根据其他应用程序正在执行的操作,您可能需要增加
睡眠
时间,以便允许窗口时间接收和处理WM_CLOSE
消息;否则,您只需将其多次发送到同一窗口。(我怀疑5毫秒的时间太少了。)你的逻辑似乎有点。。。关闭。:-)您可能会也可能不会将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;
var
Wnd:HWnd;
开始
Wnd:=FindWindow(nil,“Test”);//查找第一个窗口(如果有)
而Wnd 0做什么
开始
SendMessage(Wnd,WM_CLOSE,0,0);//发送消息
睡眠(5);//留出时间关闭
Wnd:=FindWindow(nil,“Test”);//看看还有没有别的
结束;
结束;
根据其他应用程序正在执行的操作,您可能需要增加睡眠
时间,以便允许窗口时间接收和处理WM_CLOSE
消息;否则,您只需将其多次发送到同一窗口。(我怀疑5毫秒的时间太少了。)试试这个:
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;
请尝试以下方法:
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;
当然不需要睡觉。为什么要给芬德温打两次电话呢。你为什么把这些留言窗口喷得到处都是?也许OutputDebugString是一种更好的策略。发送WM_CLOSE是关闭非您自己拥有的窗口(不同线程、不同进程等)的唯一可接受的方法。这些消息框的具体用途是什么?(如果你真的要在另一个应用程序中启动一个消息框:小心死锁等副作用。)当然不需要睡眠。为什么要给芬德温打两次电话呢。你为什么把这些留言窗口喷得到处都是?也许OutputDebugString是一种更好的策略。发送WM_CLOSE是关闭非您自己拥有的窗口(不同线程、不同进程等)的唯一可接受的方法。这些消息框的具体用途是什么?(如果您真的要在不同的应用程序中启动消息框:请注意死锁等副作用。)