根据窗体 TMyForm, 创建了多个非modal的窗体:
win := TfrmChat.Create(Application);
....问题:
我想关闭所有该类型的窗体:
var
  HandleT:HWND;
begin
  HandleT := findwindow(‘TMyForm’,nil);
  while HandleT<>0 do begin
   SendMessage(HandleT, WM_CLOSE, 0, 0);
   HandleT := findwindow('TfrmChat',nil);   //这里总是返回同一个句柄!我用destroywindow也没有用
   end;
谢谢!

解决方案 »

  1.   

    procedure TMyForm.Button2Click(Sender: TObject);
    var
      hCurrentWindow:HWnd;
      szText:array[0..254] of char;
    begin
      hCurrentWindow:=Getwindow(handle,GW_HWNDFIRST);
      while hCurrentWindow <> 0 do
      begin
        hCurrentWindow:=Getwindow(hCurrentwindow,GW_HWndNext);
        GetClassName(hCurrentWindow,@sztext,254);
        if StrPas(@sztext)='TfrmChat' then  SendMessage(hCurrentWindow,WM_CLOSE,0,0);
      end;
    end;
      

  2.   

    我的方法比较笨。先查所有的进程,找到进程的ID,然后判断窗体的类名。如果是TfrmChat就关了它,呵呵。
      

  3.   

    很好,不过有个小问题,就是没有判断进程,如果打开了两个相同应用的实例,则他们的所有同类窗体都被关闭。改进如下:
    var
      HandleT:HWND;
      hCurrentWindow:HWnd;
      szText:array[0..254] of char;
      pIDTemp,pIDCur:integer;
    begin
      PIDCur := GetCurrentProcessID();
      hCurrentWindow:=Getwindow(handle,GW_HWNDFIRST);
      while hCurrentWindow <> 0 do begin
        hCurrentWindow:=Getwindow(hCurrentwindow,GW_HWndNext);
        GetClassName(hCurrentWindow,@sztext,254);
        GetWindowThreadProcessId(hCurrentWindow, @pIDTemp);
        if (StrPas(@sztext)='TfrmChat') and (pIDTemp=pIDCur) then  SendMessage(hCurrentWindow,WM_CLOSE,0,0);
      end;
    end;