2009-02-09 84 views
5

是否有人知道如何使'永远在底部'窗口或固定在桌面上的窗口?它应该获得焦点和鼠标点击,但应该停留在Z顺序的底部。即使在用户最小化所有操作或显示桌面操作时,它也可以保留在桌面上。如何使'始终在底部'窗口

delphi和c#解决方案(或部分解决方案/提示)会很好。

+0

如果可能的话,你应该使用别的东西,但德尔福,因为隐藏的应用程序窗口和主窗口之间的相互作用将使东西变得更加复杂。这其中大部分都是forms.pas中的私人内容,很难改变。 – mghie 2009-02-09 13:33:01

+0

使用Show Desktop时不可能。它可以,但是当最小化全部使用时 - 通过将MinimizeBox属性设置为false,您可以禁用表单的最小化。 – configurator 2009-02-09 14:07:10

+0

重复:http://stackoverflow.com/questions/365094/window-on-desktop – 2009-02-09 17:06:20

回答

12

警告有人建议您通过调用SetParent并将该窗口设置为桌面的子项来完成此操作。如果你这样做,你会在Win32窗口管理器到桌面的输入队列相结合,你的子窗口,这是一个坏事 - Raymond Chen explains why.

另外,请记住,调用SetWindowPos与HWND_BOTTOM是不完整的。只要你的窗口正在改变zorder,你就需要这样做。处理WM_WINDOWPOSCHANGING事件,查看SWP_NOZORDER获取更多信息。

7

SetWindowPos可以使Windows AlwaysOnTop。它很可能会给出相反的结果。试试沿着这些线路:

[DllImport("user32.dll")] 
static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, 
    int Y, int cx, int cy, uint uFlags); 


public const uint SWP_NOSIZE   = 0x0001; 
public const uint SWP_NOMOVE   = 0x0002; 
public const uint SWP_NOACTIVATE  = 0x0010; 
public const int HWND_BOTTOM = 1; 


SetWindowPos(hWnd, HWND_BOTTOM, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE); 

注:

  • 没有测试过这种方法(因为总是在底部进行窗口)
  • 如果碰巧工作,那么最有可能的显示桌面操作会隐藏窗口。所以,也许你应该更深入地了解这个'不错'的API。

编辑:完成一些搜索沿着这些行来确认它是否会做的伎俩,并发现一些有趣的事情 - a duplicate

1

这是ATL窗口的解决方案。 如果你可以申请到C#,它会帮助你。


BEGIN_MSG_MAP(...) 
    ... 
    MESSAGE_HANDLER(WM_WINDOWPOSCHANGING, OnWindowPosChanging) 
    ... 
END_MSG_MAP() 

LRESULT OnWindowPosChanging(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) 

{ 

    if (_bStayOnBottom) 
    { 
     auto pwpos = (WINDOWPOS*)lParam; 

     pwpos->hwndInsertAfter = HWND_BOTTOM; 

     pwpos->flags &= (~SWP_NOZORDER); 

    } 
    return 0; 
} 
相关问题