主窗口setWindowPos后,正常情况下显示子窗口,提示框都会在主窗口前面的。可有时不明原因执行了SetForegroundWindow(主窗口句柄),子窗口或提示就被主窗口盖住了,这时,由于主窗口在前面,程序就象是程序死了一样,鼠标点不动,有什么办法检查到这种情况时自动把子窗口或提示窗口恢复到前面?

解决方案 »

  1.   

    演示程序:
    uunit Unit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls, ExtCtrls;type
      TForm1 = class(TForm)
        Button1: TButton;
        Timer1: TTimer;
        Button2: TButton;
        Button3: TButton;
        procedure Button1Click(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        procedure Timer1Timer(Sender: TObject);
        procedure Button2Click(Sender: TObject);
        procedure Button3Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation
    uses Unit2;
    {$R *.DFM}procedure TForm1.Button1Click(Sender: TObject);
    begin
      Timer1.Enabled:=true;
      showmessage('OK');
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
    SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE)end;procedure TForm1.Timer1Timer(Sender: TObject);
    begin
    Timer1.Enabled:=false;
    SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE)end;procedure TForm1.Button2Click(Sender: TObject);
    begin
      Timer1.Enabled:=true;
       with TForm2.Create(self) do
       begin
         ShowModal;
         Free;
       end;
    end;procedure TForm1.Button3Click(Sender: TObject);
    begin
      Timer1.Enabled:=true;
      messagebox(self.handle,'ÌáʾÐÅÏ¢','Ìáʾ£º',mb_ok);
    end;end.
    任意点一个按钮,程序就会象死掉一样。有什么办法检查到这种情况时自动把子窗口或提示恢复到前面?
      

  2.   

    Timer1Timer只是演示,在实际中不可预料
      

  3.   

    SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE)
    这个要不得
      

  4.   

    SetWindowPos(Handle,   HWND_TOPMOST,   0,   0,   0,   0,   SWP_NOMOVE   Or   SWP_NOSIZE) 好像少了一句,真的!很久以前碰到过的!你看一下WINDOWS大全 DELPHI版的!