我在DLL创建了一些窗体,想在主窗体中通过发消息的方式把在DLL中创建的窗体关闭:
var
  Frm:THandle;
begin
 Frm:= Findwindowex(0,0,nil,'生产单'); //这样写可以找到句柄,但下面一句确没有反映,不知道为什么
 sendMessage(Frm,WM_CLOSE,0,0);
//备注:生产单是我在DLL中创建的窗体的名称
//-----------下面为DLL创建窗体的代码--------------------
 procedure CreateJobFrm(AHandle:THandle;AOwner:TWinControl);stdcall;
  i:Integer;
 begin
    Application.Handle   :=   AHandle;
   if FrmJob=nil then
     begin
       FrmJob:=TFrmJob.Create(Application);
       FrmJob.BorderStyle:=bsNone;
       frmjob.ParentWindow:=AOwner.Handle;
       FrmJob.Show;
       FrmJob.Align:=alClient;
       end   end;//------主窗体调DLL------------
  //调用dll声明
  InvokeDLLForm = procedure(AHandle:THandle;AOwner:TWinControl);stdcall;  DLLHandle:= LoadLibrary(PChar(DllName));                                      //调用dll
  if DLLHandle <> 0 then
  begin
    @DLLsub := GetProcAddress(DLLHandle,PChar(FrmName));               //调用dll中的函数
    if  Assigned(DLLsub) then
    begin
      DLLsub(Application, Screen,RzTabSheet1,PageList);                       
    end;
  end;

解决方案 »

  1.   

    應該是 你的 Findwindowex(0,0,nil,'生产单'); 用的不對,沒有取得正確的句柄。Findwindowex第一個參數若為0,WIN OS會以desktop為父窗口,尋找他下面的子窗口。而delphi下,一般情況,父窗口(hWndParent的指向)都是application創建的那個看不見的窗口。所以會找不到。建議使用Findwindow(nil,'生产单')
      

  2.   

    也可以Findwindowex(application.handle,0,nil,'生产单'); 試看看
      

  3.   

    to  Avan_Lau  kfcoffevar
      hbutton:THandle;
    begin
      h := FindWindow(nil, '生产单');
     sendMessage(h,WM_CLOSE,0,0);
    end;
    上面这样写,我跟踪了,H是大于0,不知道算不算找到真正的句柄,但发消息依然没有反映
    FrmJob:=TFrmJob.Create(Application); 
    FrmJob.BorderStyle:=bsNone; 
    frmjob.ParentWindow:=AOwner.Handle; 
    FrmJob.Show; 
    FrmJob.Align:=alClient;
    我不知道是不是上面几句产生窗体有问题,但我怎么试还是没有反映
      

  4.   

    var
      Frm:THandle;
      h: HWND;
      hbutton:THandle;
    begin
      //h := FindWindow(nil, '生产单');
     Frm:= Findwindowex(Application.Handle,0,nil,'生产单');
     sendMessage(Frm,WM_CLOSE,0,0);
    上面这样写确找不到句柄,FRM都是为0
      

  5.   

    可能Findwindowex找的是WS_Child风格的窗口,所以会找不到,而用FindWindow应是寻找WS_OVER...、WS_POPUP这类窗口。这个再验证看看。用FindWindow无效,看到你有调试,猜测你的IDE有开着这个“生产单”form,所以,找到的可能是IDE的。