在試用某些App時,發現有些Ap的窗口可以嵌入桌面,這樣Win+D鍵的時候就可以看到,很方便。在網上搜索了一下,原理就是將窗口的父窗口設置成桌面。
這個父窗口在Xp下通過FindWindow("Program manager","progman")找到,但是在win7下這個方法找到的父窗口就不好用了。用spy++看了之后,寫了下面一段代碼findDesktopIconWnd(),在xp和win7下都可以找到這個父窗口。子窗口再調用SetParent(child,parent)就可以在桌面上看到了。
在Qt中實踐下:
理論:
0、#include <windows.h>
1、調用Win32 API獲取桌面句柄,通過QWidget::winId()獲得窗口句柄
2、調用Win32 API設置兩窗口父子關系
實踐:
在頭文件私有部分加入函數聲明:
static BOOL enumUserWindowsCB(HWNDhwnd,LPARAMlParam); //靜態全局函數
HWND findDesktopIconWnd();
函數實現:
BOOL Widget::enumUserWindowsCB(HWND hwnd,LPARAM lParam)
{
long wflags = GetWindowLong(hwnd, GWL_STYLE);
if(!(wflags & WS_VISIBLE)) return TRUE;
HWND sndWnd;
if( !(sndWnd=FindWindowEx(hwnd, NULL, L"SHELLDLL_DefView", NULL)) ) return TRUE;
HWND targetWnd;
if( !(targetWnd=FindWindowEx(sndWnd, NULL, L"SysListView32", L"FolderView")) ) return TRUE;
HWND* resultHwnd = (HWND*)lParam;
*resultHwnd = targetWnd;
return FALSE;
}
HWND Widget::findDesktopIconWnd()
{
HWND resultHwnd = NULL;
EnumWindows((WNDENUMPROC)enumUserWindowsCB, (LPARAM)&resultHwnd);
return resultHwnd;
}
有了上面兩個函數的輔助,下面的工作就簡單了,在需要的地方加入如下代碼就可以實現了:
HWND desktopHwnd = findDesktopIconWnd();
if(desktopHwnd) SetParent(this->winId(), desktopHwnd);