顯示桌面的困惑,不響應“顯示桌面”(ToggleDesktop)

需求:
在桌面放一個WS_EX_LAYERED風格的窗口,置底(一直在其他窗口下面),不響應Win+D,始終保持在桌面。

分析:
1、Win+D或者快速啓動欄上的“顯示桌面”,其實最終調用的是個Shell方法(IShellDispatch4.ToggleDesktop()),而且你的窗口不會收到任何與此相關的消息。
2、調用IShellDispatch4.ToggleDesktop()時,系統會給Desktop(Progman)發送一條消息 DTM_RAISE message (WM_USER + 83) ,用於把桌面置前。
3、IShellDispatch4.ToggleDesktop()還不是簡單的窗口置前,我還沒有找到對於這個函數的更具體的解釋。(誰知道的話,一定要告訴我,謝謝~~~)


不響應“顯示桌面”的解決方案:

--方案1--
將窗口設置成WS_EX_TOPMOST風格,或者用SetWindowPos(hWnd, HWND_TOPMOST, ...),都可以做到不響應“顯示桌面”。

可惜,我的需求是“置底”,這個方案不適合我。

--方案2--
將窗口設置成桌面ListView的子窗口

HWND hProgman = ::FindWindow(L"Progman", L"Program Manager");
HWND hDefView = FindWindowEx(hProgman, NULL, L"SHELLDLL_DefView", NULL);
HWND hFloderViews = FindWindowEx(hDefView, NULL, L"SysListView32", NULL);
// 用hFloderViews作爲CreateWindow時的父窗口就可以達到不響應“顯示桌面”的效果

可惜,用這種方法,窗口繼承自桌面ListView後會導致無法使用WS_EX_LAYERED窗口風格。


針對我的需求的解決方案:
方案1(可行的方案):

去掉WS_EX_LAYERED風格,把窗口設成桌面ListView的子窗口。這個方案肯定是可以的,但去掉WS_EX_LAYERED就以爲着半透明窗口需要自己實現,這個就得多麻煩點。

方案2
修改需求

 

__THE END__

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章