qcjlh:=Findwindow(nil,'全程记录显示');
SendMessage(qcjlh,WM_SYSCOMMAND, SC_CLOSE,0);这样无法立即关闭指定窗体,等待循环都无法解决。只有这样
  qcjlh:=Findwindow(nil,'全程记录显示');
  if qcjlh>0 then
  begin
    SendMessage(qcjlh,WM_SYSCOMMAND, SC_CLOSE,0);//关闭
    Dm.bsSkinMessage1.MessageDlg2(' 全程记录显示已打开,请确认!', '提示', mtWarning, [mbOk], 0);
    Exit;
  end;
才能够正常关闭指定的窗体.

解决方案 »

  1.   

    试试
    SendMessage(qcjlh,WM_CLOSE,0,0);
      

  2.   

    这个是一个DLL的封装的窗体,用CB6做的。
    是我的程序调用DLL显示出来的。
      

  3.   

    就是说代码都是可控的了。
    你DLL中这个窗体在OnClose事件中做了某些处理?
    你用了皮肤控件?皮肤控件可能接管了WM_SYSCOMMAND消息,你查看下它的源码。
    自定义个消息,在消息处理函数中关闭窗口,看是否正常。
      

  4.   

    DLL中这个窗体在OnClose事件中没有做任何处理。
    现在是接收到了消息,只是必须在我的主程序中,弹出一个对话框出来才行。
    否则他就是不自动关闭。因为DLL是我主程序调用的。
      

  5.   

    给dll中定义个消息来自己处理关闭窗口,这样试过正常不,dll是你写的,改两笔看看嘛SendMessage(qcjlh,WM_SYSCOMMAND, SC_CLOSE,0);看看返回值是不是0,如果是0表示程序处理了这个消息
      

  6.   

    FindWindow是相当不靠谱的,同一个时刻,可能存在多个同类名甚至同标题的窗口,你不能保证找到的窗口句柄就是你需要的那个。
      

  7.   


    是有这样的可能性,但我们是行业的名字,基本重复性很少。目前通过修改DLL已经实现自动关闭功能。谢谢各位。