主窗口:Form_Main
我想在主窗口上浮动一个窗口Form_Mask在Create事件里创建Form_Mask如下:  Form_Mask:=TForm_Mask.Create(Form_Main);
  setwindowpos(Form_Mask.handle,Hwnd_Topmost,0,0,0,0,SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE);//窗口置顶
  Form_Mask.Show;但是当我点其它程序的窗口(比如我的电脑)时,Form_Mask还是在上面,结果我的电脑夹在了两个窗口中间!如何才能使Form_Mask一直在Form_Main之上,但我点其它程序时,Form_Main和Form_Mask就都到后面去?

解决方案 »

  1.   

    哎~~~暂时解决了。procedure  WMActivate(var  Msg:  TMessage);  message  WM_ACTIVATE;procedure TForm_Main.WMActivate(var Msg: TMessage);
    begin
      inherited;
      //如果当前线程是激活的
      if IsCurrentProcess then
      begin
        setwindowpos(Form_Mask.handle,Hwnd_Topmost,0,0,0,0,SWP_NOACTIVATE or SWP_NOMOVE  or  SWP_NOSIZE);
      end
      else
      begin
        //要用两次,先移到后面再放到前面,不然会出现我说的直接把其它窗口拖过来会夹在中间:(
        setwindowpos(Form_Mask.handle,Hwnd_Bottom,0,0,0,0,SWP_NOACTIVATE or SWP_NOMOVE  or  SWP_NOSIZE);
        setwindowpos(Form_Mask.handle,Hwnd_NoTopmost,0,0,0,0,SWP_NOMOVE  or  SWP_NOSIZE);
      end;
    end;//下面是判断当前是线程是否是活动的
    function TForm_Main.IsCurrentProcess: Boolean;
    var
      Fore_hWnd:HWND;
      dwProcessID:integer;
      tutuProcessID:integer;
    begin
      //获取当前窗口
      Fore_hWnd := GetForegroundWindow();
      //获取当前窗口的进程ID
      GetWindowThreadProcessId(Fore_hWnd,@dwProcessID);
      GetWindowThreadProcessId(Application.Handle,@tutuProcessID);  if dwProcessID=tutuProcessID then
        result:=true
      else
        result:=false;
    end;
      

  2.   

    Mark下,ShowModal不行。。这样的话,后边的窗口就不能操作了
      

  3.   

    我就不明白 lz为何会出现夹在中间的情况,反正我不出现夹在中间...procedure TForm1.Button1Click(Sender: TObject);
    begin
      Form2 := TForm2.Create(Form1);
      Form2.Show;
    end;procedure TForm1.OnActivate(var _M:TMessage);//message WM_Activate;
    begin
      if _M.WParam = WA_INACTIVE then
      begin
        if assigned(Form2) then
          setwindowpos(Form2.Handle,HWND_NOTOPMOST,0,0,0,0,SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE);
      end
      else
      begin
        if assigned(Form2) then
          setwindowpos(Form2.Handle,HWND_TOPMOST,0,0,0,0,SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE);
      end;
    //  inherited;
    end;
      

  4.   

    用不着这么复杂吧!窗体有一个属性FormStyle,把此项选为:fsStayOnTop就可以,窗体Show出来。这样只会在软件在起作用,不会影响其他应用程序!
      

  5.   

    确实不用这么复杂,只要将Form_Mask.FormStyle := fsStayOnTop就可以了,测试通过
      

  6.   

    这个测了下,我这貌似有时是OK,有时又不行,还出现了lz描述的夹在中间的情况...(Win7+D7)
    哎,不说了...还是期待高人吧....