Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 如何关闭标题相同的所有窗口_Delphi - Fatal编程技术网

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

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

我的应用程序中有线程在另一个应用程序中显示MessageBox,在线程创建它的每个事件上都有标题“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;
而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是关闭非您自己拥有的窗口(不同线程、不同进程等)的唯一可接受的方法。这些消息框的具体用途是什么?(如果您真的要在不同的应用程序中启动消息框:请注意死锁等副作用。)