青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

今天在QQ群里有人問怎樣實現將自己的窗口嵌入桌面,讓它和桌面融為一體,就像很多桌面日歷軟件那樣。

我當時想到的就是建立一個Child  Window,將他的父窗口設置成桌面Shell窗口就可以了。但是后來想想覺得不對,因為很多桌面日歷窗口都有半透明和陰影效果,明顯是用Layered Window實現的,而大家知道Layered Window一定要用Pop Up Window才能實現的。

那么如何用Pop up Window實現這種效果呢? 這里關鍵的一點就是要將該窗口的Owner設置成桌面的Shell 窗口。

很多以為Pop Up Window的Owner窗口只能在Create時關聯, 建立后沒法動態修改,實際上微軟是有接口讓我們改的,只是他們不建議我們動態改,因為這樣會影響窗口的層次關系,尤其是對于Modal Dialog。

我們將窗口Owner改成桌面Shell窗口的代碼如下:
BOOL CheckParent(HWND hWnd)
{
    static HWND s_hWndOldParent = NULL;

   HWND hWndProgram = NULL;
   HWND hWndShellDLL = NULL;
   hWndProgram = FindWindow(_T("Progman"), _T("Program Manager"));
   if(hWndProgram != NULL)
   {
       hWndShellDLL = FindWindowEx(hWndProgram, NULL, _T("SHELLDLL_DefView"), NULL);
   }

   if(hWndShellDLL != NULL
       && hWndShellDLL != s_hWndOldParent)
   {
        SetWindowLong(hWnd, GWL_HWNDPARENT, (LONG)hWndShellDLL);
        s_hWndOldParent = hWndShellDLL;
        return TRUE;
   }

   return FALSE;
}

另外還有一個問題是一般Pop up窗口在Show出來時會顯示在最上面,而我們是要讓它顯示在最下面, 所以要設置下Z-Order:
   hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);


    CheckParent(hWnd);

   SetWindowPos(hWnd, HWND_BOTTOM, 0, 0, 0, 0,
       SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE | SWP_SHOWWINDOW);

這樣上面的代碼就實現了的窗口永遠在桌面上,即使你點“顯示桌面”或是WIN+D,也不受影響。

另外,如果你要讓你的窗口在激活時也不會跑到其他窗口上面,只要創建時設置WS_EX_NOACTIVATE屬性就可以了。

還有個問題是桌面Shell有可能重啟,比如我們Kill掉Explorer.exe進程,所以我們最好一開始就啟一個定時器,然后不停調用CheckParent(HWND hWnd)。

測試代碼下載: source code
posted on 2012-05-03 22:07 Richard Wei 閱讀(8670) 評論(8)  編輯 收藏 引用 所屬分類: windows desktop

FeedBack:
# re: 桌面上嵌入窗口(桌面日歷)原理探索
2012-05-19 08:28 | 請教一下
看到你的這個說明,有兩個問題,第一個是界面如果要半透明如何處理,設定桌面為父窗口。半透明就失效了,
第二個問題:現在360安全衛士下這個會失效,好像是讓360給攔截了  回復  更多評論
  
# re: 桌面上嵌入窗口(桌面日歷)原理探索
2012-05-19 08:29 | 請教一下
方便可以聯系QQ:460502163, 告訴我一下解決方案嗎?  回復  更多評論
  
# re: 桌面上嵌入窗口(桌面日歷)原理探索
2012-05-19 10:41 | Richard Wei
@請教一下
好像沒有你說的半透明失效問題,可以參照我上傳的測試代碼。
至于360是否攔截,我就不知道了, 理論上這個不是安全問題,不該攔截的。  回復  更多評論
  
# re: 桌面上嵌入窗口(桌面日歷)原理探索
2012-05-19 11:21 | 請教一下
我已經測試了,360攔截,您可以試一下,估計是他們要做360桌面,攔截消息  回復  更多評論
  
# re: 桌面上嵌入窗口(桌面日歷)原理探索
2012-05-19 11:22 | Richard Wei
@請教一下
沒環境,讓客戶不要裝360吧 :)  回復  更多評論
  
# re: 桌面上嵌入窗口(桌面日歷)原理探索
2012-05-19 11:25 | 請教一下
你的代碼測試怎么就可以呢?我自己寫的代碼就攔截。,悲哀  回復  更多評論
  
# re: 桌面上嵌入窗口(桌面日歷)原理探索
2012-05-31 17:24 | wxdvc
強人

感謝分享啊!  回復  更多評論
  
# re: 桌面上嵌入窗口(桌面日歷)原理探索
2012-09-29 16:17 | Richard Wei
在Win7的Aero模式下因為桌面的窗口層次有變化, 上面的代碼會找不到窗口"SHELLDLL_DefView"窗口

簡單改了下,未完全測試:
HWND GetShellDLLForWin7()
{
HWND hWndShell = NULL;
HWND hWndDesktop = GetDesktopWindow();
if(hWndDesktop == NULL) return NULL;

HWND hWndWorkerW = NULL;
while(TRUE)
{
hWndWorkerW = FindWindowEx(hWndDesktop, hWndWorkerW, _T("WorkerW"), NULL);
if(hWndWorkerW == NULL) break;

if(::GetWindowLong(hWndWorkerW, GWL_STYLE) & WS_VISIBLE)
{
break;
}
else
{
continue;
}
}

if(hWndWorkerW != NULL)
{
hWndShell = FindWindowEx(hWndWorkerW, NULL, _T("SHELLDLL_DefView"), NULL);
}

return hWndShell;
}

BOOL CheckParent(HWND hWnd)
{
static HWND s_hWndOldParent = NULL;

HWND hWndProgram = NULL;
HWND hWndShellDLL = NULL;
hWndProgram = FindWindow(_T("Progman"), _T("Program Manager"));
if(hWndProgram != NULL)
{
hWndShellDLL = FindWindowEx(hWndProgram, NULL, _T("SHELLDLL_DefView"), NULL);

//Win7
if(hWndShellDLL == NULL)
{
hWndShellDLL = GetShellDLLForWin7();
}
}

if(hWndShellDLL != NULL
&& hWndShellDLL != s_hWndOldParent)
{
SetWindowLong(hWnd, GWL_HWNDPARENT, (LONG)hWndShellDLL);
s_hWndOldParent = hWndShellDLL;
return TRUE;
}

return FALSE;
}  回復  更多評論
  
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美电影在线免费观看网站| 久久一区二区三区超碰国产精品| 亚洲美女在线国产| 性欧美video另类hd性玩具| 亚洲高清影视| 久久噜噜噜精品国产亚洲综合| 国产精品视频免费观看www| 亚洲视频视频在线| 日韩视频一区| 欧美日韩ab片| 亚洲视频国产视频| 99视频在线精品国自产拍免费观看 | ●精品国产综合乱码久久久久| 久久国产欧美| 久久久99免费视频| 狠狠噜噜久久| 亚洲第一精品久久忘忧草社区| 久久婷婷影院| 亚洲精品在线免费| 亚洲精品视频一区| 国产精品久久77777| 亚洲第一黄色网| 亚洲一区二区久久| 欧美激情一区二区三区蜜桃视频| 亚洲国产精品久久久久秋霞蜜臀 | 久久一区免费| 亚洲国产日韩综合一区| 欧美国产精品va在线观看| 美女图片一区二区| 99综合视频| 亚洲小视频在线| 激情综合色丁香一区二区| 欧美成人精品激情在线观看 | 亚洲精品美女在线观看| 亚洲精品亚洲人成人网| 国产精品国产三级国产aⅴ入口| 香蕉久久夜色精品国产| 久久精品官网| 日韩午夜黄色| 亚洲欧美日韩国产综合精品二区| 国内激情久久| 99热精品在线| 亚洲第一精品影视| 在线亚洲欧美视频| 在线日韩中文字幕| 亚洲天堂黄色| 91久久久久久国产精品| 亚洲网站啪啪| 亚洲国产99| 亚洲视频欧美视频| 在线播放日韩| 亚洲午夜精品17c| 91久久久精品| 欧美一级久久久| 一区二区三区www| 久久精品一区二区三区不卡牛牛| 亚洲欧洲综合另类在线| 亚洲一区免费视频| 亚洲三级国产| 久久精品夜色噜噜亚洲aⅴ| 在线中文字幕一区| 久久综合电影| 久久久99久久精品女同性| 欧美日韩高清在线播放| 嫩草影视亚洲| 国产亚洲欧洲一区高清在线观看 | 久久精品99国产精品日本| 中文一区二区| 欧美第一黄色网| 免费不卡亚洲欧美| 国产香蕉久久精品综合网| 亚洲乱码精品一二三四区日韩在线 | 午夜精品国产更新| 亚洲在线视频观看| 欧美阿v一级看视频| 午夜精彩视频在线观看不卡| 欧美精品日韩一区| 欧美激情第3页| 在线激情影院一区| 久久久久国产精品一区三寸 | 亚洲影院色在线观看免费| 一区二区三区精品| 欧美日韩中文在线| 亚洲免费av观看| 99热精品在线观看| 欧美日本网站| 亚洲美女视频在线观看| 99伊人成综合| 欧美偷拍一区二区| 制服丝袜亚洲播放| 欧美亚洲网站| 国产亚洲精品资源在线26u| 欧美一区二区精品在线| 久久精品国产一区二区三| 国产精品嫩草99a| 亚洲免费视频在线观看| 欧美中文在线观看| 激情久久久久久| 老司机一区二区三区| 欧美激情第9页| 日韩午夜三级在线| 欧美视频二区36p| 亚洲永久免费精品| 久久久久久香蕉网| 亚洲精品乱码久久久久久黑人 | 激情视频一区二区三区| 久久久精彩视频| 女人香蕉久久**毛片精品| 亚洲福利视频网| 欧美激情精品久久久久久大尺度| 亚洲破处大片| 亚洲综合欧美日韩| 国产一区二区三区在线观看网站 | 欧美日韩一区二区在线观看| 亚洲欧洲一区二区天堂久久| 中国成人黄色视屏| 国产欧美在线观看| 老**午夜毛片一区二区三区| 亚洲人成在线影院| 午夜亚洲精品| 亚洲电影专区| 国产精品久久久久高潮| 久久久午夜精品| 一本色道久久| 欧美顶级少妇做爰| 性视频1819p久久| 亚洲激情图片小说视频| 国产精品久久久久久久久久久久| 久久九九热免费视频| 亚洲精品三级| 久久综合久久综合九色| 亚洲一区久久| 最近中文字幕日韩精品 | 国产精品久久婷婷六月丁香| 欧美在线观看网站| 亚洲色无码播放| 亚洲欧美在线免费| 久久精品国产欧美激情| 91久久中文| 国产欧美在线观看一区| 欧美国产91| 99精品国产高清一区二区| 美女任你摸久久| 欧美大片一区二区| 欧美高清视频一区二区| 欧美电影免费观看| 亚洲国产精品传媒在线观看| 欧美激情一区二区三区不卡| 亚洲国产精品免费| 亚洲美女av黄| 亚洲欧美国产高清| 久久精品av麻豆的观看方式| 久久免费精品视频| 欧美激情片在线观看| 欧美日韩一区二区视频在线| 国产精品久久久久免费a∨大胸 | 欧美黄色影院| **性色生活片久久毛片| 亚洲三级色网| 亚洲午夜av电影| 欧美一区二区福利在线| 久久久www免费人成黑人精品| 久久蜜臀精品av| 亚洲国产精品一区| 亚洲一区二区视频| 久久久亚洲精品一区二区三区| 欧美不卡在线视频| 国产精品国码视频| 一区二区亚洲精品国产| 9久草视频在线视频精品| 午夜精品久久久久久久蜜桃app| 久久久精品视频成人| 亚洲国产精品久久久久| 亚洲一区观看| 欧美成人一区二区三区片免费| 国产精品sm| 在线欧美日韩| 免费不卡亚洲欧美| 国产精品久久久久久久久久久久久久| 国产日韩欧美在线播放| 亚洲精品日韩在线| 欧美在线一区二区三区| 亚洲七七久久综合桃花剧情介绍| 亚洲欧美日本国产有色| 欧美成人精品1314www| 国产精品蜜臀在线观看| 亚洲激情电影在线| 欧美在线www| 亚洲国产专区| 久久aⅴ国产欧美74aaa| 欧美午夜片在线观看| 亚洲第一网站| 欧美在线观看日本一区| 最新成人av网站| 久久精品亚洲热| 国产欧美一区二区三区久久| 在线一区日本视频| 亚洲国产高清一区二区三区| 欧美亚洲系列| 国产精品一区二区男女羞羞无遮挡|