將窗體嵌入桌面


    在試用某些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);

 

來自:悠然博客http://mypyg.blog.51cto.com/820446/263349


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM