• <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>
            今天在QQ群里有人問(wèn)怎樣實(shí)現(xiàn)將自己的窗口嵌入桌面,讓它和桌面融為一體,就像很多桌面日歷軟件那樣。

            我當(dāng)時(shí)想到的就是建立一個(gè)Child  Window,將他的父窗口設(shè)置成桌面Shell窗口就可以了。但是后來(lái)想想覺(jué)得不對(duì),因?yàn)楹芏嘧烂嫒諝v窗口都有半透明和陰影效果,明顯是用Layered Window實(shí)現(xiàn)的,而大家知道Layered Window一定要用Pop Up Window才能實(shí)現(xiàn)的。

            那么如何用Pop up Window實(shí)現(xiàn)這種效果呢? 這里關(guān)鍵的一點(diǎn)就是要將該窗口的Owner設(shè)置成桌面的Shell 窗口。

            很多以為Pop Up Window的Owner窗口只能在Create時(shí)關(guān)聯(lián), 建立后沒(méi)法動(dòng)態(tài)修改,實(shí)際上微軟是有接口讓我們改的,只是他們不建議我們動(dòng)態(tài)改,因?yàn)檫@樣會(huì)影響窗口的層次關(guān)系,尤其是對(duì)于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;
            }

            另外還有一個(gè)問(wèn)題是一般Pop up窗口在Show出來(lái)時(shí)會(huì)顯示在最上面,而我們是要讓它顯示在最下面, 所以要設(shè)置下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);

            這樣上面的代碼就實(shí)現(xiàn)了的窗口永遠(yuǎn)在桌面上,即使你點(diǎn)“顯示桌面”或是WIN+D,也不受影響。

            另外,如果你要讓你的窗口在激活時(shí)也不會(huì)跑到其他窗口上面,只要?jiǎng)?chuàng)建時(shí)設(shè)置WS_EX_NOACTIVATE屬性就可以了。

            還有個(gè)問(wèn)題是桌面Shell有可能重啟,比如我們Kill掉Explorer.exe進(jìn)程,所以我們最好一開(kāi)始就啟一個(gè)定時(shí)器,然后不停調(diào)用CheckParent(HWND hWnd)。

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

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

            感謝分享啊!  回復(fù)  更多評(píng)論
              
            # re: 桌面上嵌入窗口(桌面日歷)原理探索
            2012-09-29 16:17 | Richard Wei
            在Win7的Aero模式下因?yàn)樽烂娴拇翱趯哟斡凶兓? 上面的代碼會(huì)找不到窗口"SHELLDLL_DefView"窗口

            簡(jiǎn)單改了下,未完全測(cè)試:
            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;
            }  回復(fù)  更多評(píng)論
              
            久久精品国产99久久无毒不卡| 久久99精品国产麻豆蜜芽| 99久久综合国产精品免费| 综合网日日天干夜夜久久| 久久人人爽人人爽人人片av麻烦| 亚洲AV无一区二区三区久久| 久久99精品国产99久久6男男| 久久久久亚洲精品无码网址| 国产成人精品综合久久久久| 狠狠色丁香久久综合婷婷| 久久综合久久综合亚洲| 国产精品青草久久久久婷婷| 要久久爱在线免费观看| 久久精品国产免费一区| 久久九九兔免费精品6| 99久久夜色精品国产网站| 人妻无码αv中文字幕久久琪琪布 人妻无码久久一区二区三区免费 人妻无码中文久久久久专区 | 久久久久人妻一区精品色| 久久国产一片免费观看| 久久精品国产亚洲av高清漫画| 欧美大战日韩91综合一区婷婷久久青草 | 人人狠狠综合久久亚洲| 国产精品久久网| 国产一区二区三区久久精品| 亚洲AV无码久久精品蜜桃| 综合人妻久久一区二区精品| 亚洲一级Av无码毛片久久精品| 久久亚洲国产成人影院网站| 伊人热人久久中文字幕| 久久99精品国产麻豆宅宅| 国产午夜精品理论片久久影视| 久久久国产乱子伦精品作者| 99久久国产综合精品女同图片| 亚洲欧美精品一区久久中文字幕 | 一本久久a久久精品vr综合| 亚洲国产天堂久久综合| 久久夜色精品国产| 亚洲午夜久久久| 无码精品久久久久久人妻中字| 亚洲人成网亚洲欧洲无码久久| 99蜜桃臀久久久欧美精品网站|