MS WIN32 SDK:
SetWindowPos(&wndTopMost, 0, 0, 0, 0,SWP_NOSIZE | SWP_NOMOVE);

解决方案 »

  1.   

    可以将form的属性设为bsStayOnTop.
      

  2.   

    不是直接设置form的属性吗?我不知道你是什么意思
      

  3.   

    直接设置Form的属性会使窗口闪一下的,所以还是用API吧。Carmack的是VC++代码,我下面的是BCB代码喔!SetWindowPos(Handle,HWND_TOPMOST,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE); 最前面
    SetWindowPos(Handle,HWND_NOTOPMOST,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE); 取消在最前面
      

  4.   

    将form的属性设为bsStayOnTop只能对本应用程序中的窗口可以,但如果切换到其它应用程序时,
    这个form便不到最前面了
    to:carmack
    假如有form1,form2,将form2设置成总在最前面
    setwindowpos函数应该怎么用?
    请写段代码好吗?
      

  5.   

    to:hotyei
    我用你的方法试了还是只能对本应用程序起作用,不能象netants的小浮动窗口一样,在
    主窗口最小化后,仍然保持显示,而且还能放在其它应用程序窗口前,能反BCB例子
    或delphi例子给一个吗,谢谢
      

  6.   

    (1)MyForm.FormStyle := fsStayOnTop; 可以把窗口放在最前。(2)在Form上放一个TImage(ImageCatAniMouseDown),捕捉它的mouse left key,按下
    做拖动。TImage可以是一只蚂蚁。  :)
    procedure TFormMain.ImageCatAniMouseDown(Sender: TObject;
      Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    const
      Sc_DragMove = $f012;
    begin
      if Shift = [ssLeft] then
      begin
        ReleaseCapture;
        TControl(Self).Perform(WM_SYSCOMMAND, Sc_DragMove, 0);
      end;
    end;(3)
    (2)在FormMain的Active事件把FormMain大小设置为和上面的TImage一样大。
    procedure TFormMain.FormActivate(Sender: TObject);
    begin
      Self.Width := ImageCatAni.Width;
      Self.Height := ImageCatAni.Height;
      Self.Top := Screen.Height - Self.Height - 30;
      Self.Left := 2;
      Self.Update;
    end;(3) FormCreate事件加入:
        Self.BorderIcons := [];
        Self.BorderStyle := bsNone;
      

  7.   

    to:ether你的方法我试过了,发现只有myform为主窗口时才能总在前面,
    可是如果假设mainform为主窗口时,在mainform上打开myform
    即myform.show,就不行了,还是不行,只打开其它应用程序或
    切换到其它应用程序一样不能放在其它应用程序窗口前面,但
    切换到mainform时,就行了,不知为什么?而且当主窗口mainform
    最小化时,myform也随之隐藏了.
      

  8.   

    用SetWindowPos(Application.Handle,HWND_TOPMOST,0,0,0,0,SWP_NOSIZE¦SWP_NOMOVE);试试 ,我以前写过这种程序,测试时没有异常,但给用户使用时有时会被别的窗口覆盖 ,不知为什么
      

  9.   

    源码:protected:
            virtual void __fastcall CreateParams(TCreateParams & Param);void __fastcall TForm2::CreateParams(TCreateParams & Param)
    {
      //调用基类
      TForm::CreateParams(Param);      //去掉窗口标题区
      Param.Style=Param.Style & ~WS_CAPTION;
      Param.Style=Param.Style ¦ WS_POPUP;
      //设为总在最上面
      Param.ExStyle=Param.ExStyle ¦ WS_EX_TOPMOST;
      //设Windows Owner为Desktop Window
      Param.WndParent=GetDesktopWindow();
    }注意:
      1、Windows Owner与Windows Parent不同,用::SetParent函数和设置Form?->Parent这能设置Windows Parent,不能设置Windows Owner,要实现FlashGet的悬浮窗必须要设置Windows Owner。
      2、Form的BorderStyle要设为bsToolWindow,不然在任务栏上会显示出这个窗口的标题,将Caption设为空也没有用。 这个问题问过很多遍了。
      

  10.   

    你要注意的是:
        仅仅将窗口属性设为bsTopMost是不行的,这只能在本应用程序内起作用,因为当TApplication收到WM_SYSCOMMAND,SC_DEACTIVEAPP(好像是这个东西)消息时,会先调用NormalizeTopMost,去掉所有属于它自己的Form的TopMost属性,这一点非常讨厌,这就是为什么当你的Form设为bsTopMost后只能作用于自己的应用程序的原因。
        另外,当Window's Owner最小化时,你的窗口会被hidden,而且收不到WM_SHOW...消息或WM_SYSCOMMAND,SC_ICON消息。所以一定要将Windows' owner设为NULL或Desktop。
      

  11.   

    to:SAsura
    谢谢你的讲解,我很笨,你的例子我不能转成delphi语言,能否帮忙解决,我才能试一试了
      

  12.   

    protected
          procedure CreateParams(var Param:TCreateParams); override;procedure TForm1.CreateParams(var Param:TCreateParams);
    begin
      //调用基类
      inherited CreateParams(Param);  //去掉窗口标题区
      Param.Style:=Param.Style and (not WS_CAPTION);
      Param.Style:=Param.Style or WS_POPUP;
      //设为总在最上面
      Param.ExStyle:=Param.ExStyle or WS_EX_TOPMOST;
      //设Windows Owner为Desktop Window
      Param.WndParent:=GetDesktopWindow();
    end;
      

  13.   

    to bigfox:
         还有一种比较弱智的方法,是用timer去定时去setwindowpos....不过呢,比较耗费资源,
    但可以顺便实现一些很有用的功能:如自动贴边,自动隐藏等。时间设为大概400ms就看不出任何停滞。to SAsura(SAsura):
         这种方法我知道,可是我没自己试过,请问在主程序退出时,需不需要向那个alwaysontop
    并且脱离父子关系的窗体发送一个WM_CLOSE消息?