近来,看到一些桌面秀的软件,可以把窗体钉在桌面上。
觉得很不错,请问高手,这个功能如何实现呢?

解决方案 »

  1.   

    重载Createparams,改变窗体风格,设置父句柄为桌面,代码大概如下:private 
       procedure Createparams(var params: TCreateParams);override;procedure TForm1.Createparams(var params: TCreateParams);
    begin
      inherited CreateParams(Params);
      with params do
      begin
        params.Style:=WS_POPUP {or WS_BORDER};
        params.ExStyle := WS_EX_TOOLWINDOW or WS_EX_TOPMOST or WS_EX_NOACTIVATE or WS_EX_WINDOWEDGE;
        params.WndParent:=getDeskTopWindow;
      end;
    end;
      

  2.   

    Createparams方法不错,我刚试过没有问题
      

  3.   


    Createparams这个方法很好。
      

  4.   

    通过重载Createparams方法可以实现很多窗口功能
      

  5.   

    首先,谢谢liangqingzhi(老之)的回答,还有各位的参与。
    我刚刚试了一下,有点意思了,不过和我说的还有一点差别。
    我希望的钉在桌面上:
    是钉在桌面上,感觉像是桌面的图标一样,
    按“显示桌面”按钮的时候,它也和其它图标一样,显示在桌面上。
    同时,它又是一个窗体。我可以设置的我右键菜单,对它进行控制,这这样。按照liangqingzhi的方法,会使窗体总在最前,
    如果改成如下形式,即去掉WS_EX_TOPMOST。
    //params.ExStyle := WS_EX_TOOLWINDOW or WS_EX_TOPMOST or WS_EX_NOACTIVATE or WS_EX_WINDOWEDGE;
        params.ExStyle := WS_EX_TOOLWINDOW or WS_EX_NOACTIVATE or WS_EX_WINDOWEDGE;
    按“显示桌面”按钮的时候,这个窗体又无法停留在桌面上。希望liangqingzhi和各位高手再帮帮忙,不胜感激。
      

  6.   

    改了一下:procedure TForm1.Createparams(var params: TCreateParams);
    begin
      inherited CreateParams(Params);
      with params do
      begin
        Style:=WS_POPUP;
        ExStyle :=  WS_EX_TOOLWINDOW or WS_EX_TOPMOST or WS_EX_NOACTIVATE or WS_EX_WINDOWEDGE;
        WndParent := GetWindow(FindWindow('Progman', nil), GW_CHILD);
      end;
    end;
      

  7.   

    感谢 liangqingzhi(老之),问题已经解决。
    也感谢各位的参与。WndParent := GetWindow(FindWindow('Progman', nil), GW_CHILD);
    这句代码的意思,还不太明白