需求:
在桌面放一個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__