2009-02-09 102 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; 
} 
相關問題