哪吒2之魔童闹海|哪吒2之魔童归来免费观看|哪吒2在线观看|哪吒2魔童闹海电影免费观看|哪吒2免费观看完整版大电影|哪吒1免费观看完整版

新疆軟件開(kāi)發(fā)

本站首頁(yè) 軟件開(kāi)發(fā) 成功案例 公司新聞 公司簡(jiǎn)介 客服中心 軟件技術(shù) 網(wǎng)站建設(shè)
  您現(xiàn)在的位置: 新疆二域軟件開(kāi)發(fā)公司 >> 開(kāi)發(fā)語(yǔ)言 >> 文章正文

在桌面中嵌入窗體

前幾天在網(wǎng)上看到一個(gè)軟件的介紹:可以嵌入桌面,即使是“顯示桌面”也不會(huì)影響此程序?醋髡哒f(shuō)的好像有多么的神奇一樣。周未就回來(lái)試一下。最后發(fā)現(xiàn),Windows這個(gè)桌面還真是復(fù)雜和有意思。
  首先要分析Windows桌面。
  打開(kāi)老牌軟件"Spy Window"。查看一下桌面。取得一個(gè)“SysListView32”類(lèi)的句柄(本系統(tǒng)為XP版本)。將其最小化,可以看出剛才取得的控件好像是透明的。因?yàn)閷⑵渥钚』,還可以看到你所設(shè)置的桌面圖片。
  重新用"Spy Window"獲取桌面上的控件句柄(也可以直接點(diǎn)擊"Parent Window"取得其父窗口句柄),得到一個(gè)"SHELLDLL_DefView"類(lèi)的句柄。將其最小化,可以看到桌面圖片依然存在,難道又是一個(gè)透明控件嗎?先不理會(huì)它,我們繼續(xù)向“下”找。再一次取得“桌面”上一個(gè)類(lèi)名為“Progman”的控件句柄。而且此時(shí)你會(huì)發(fā)現(xiàn)Spy Window的"Parent Window"按鈕已不可用了。
  這個(gè)類(lèi)為“Progman”的窗口“下面”真的沒(méi)有其它窗口了嗎?按“Ctrl+Alt+Del“在任務(wù)管理器里結(jié)束“explorer”,后再使用“Spy Window”看一下,是不是又有一個(gè)類(lèi)名為“#32769”的窗口出了。試著對(duì)此窗口進(jìn)行禁用,最小化,隱藏操作試一下。好像一切都是無(wú)效的。
  到此為至,應(yīng)該說(shuō)把這張桌面的結(jié)構(gòu)搞清楚了。相當(dāng)于圖像處理中的四個(gè)圖層,而且是透明圖層。
  按類(lèi)名由前至里的排序?yàn)椋?BR>  SysListView32
  SHELLDLL_DefView
  Progman
  #32769
  看來(lái)這個(gè)桌面果然不是一般的復(fù)雜。
  回憶一下以前用代碼來(lái)隱藏桌面的操作:
  FindWindow(''''Progman'''',Nil);
  ShowWindow(...);
  這里的''''Progman''''就是第三層(本文中我們就以層來(lái)稱(chēng)呼它們)的窗口了。在結(jié)束進(jìn)程“Explorer”時(shí),此窗口消失,說(shuō)明此窗口是由“Explorer.exe”建立的。
  下面進(jìn)行將程序嵌入到桌面里的操作。
  這里所需要的只有一個(gè)語(yǔ)句:
  FrmMain.ParentWindow:=ParentHandle;其中,ParentHandle是你所要嵌人的控件句柄。
  按此實(shí)現(xiàn),可以建立一個(gè)窗體,拖入一個(gè)TButton,一個(gè)TEdit。在Button的Click事件中寫(xiě)入代碼FrmMain.ParentWindow:=StrToInt(EdtHandle.Text);
  下面,先來(lái)嵌入“第一層桌面”看一下。用"Spy Window”取得當(dāng)前桌面句柄,也就是第一層''''SysListView32''''。轉(zhuǎn)為十進(jìn)制后復(fù)制到EdtHandle。點(diǎn)擊按鈕。
  程序是不是轉(zhuǎn)為非焦點(diǎn)狀態(tài)了。按一下“Win+D”(顯示桌面)。是不是窗口仍停留在桌面上。
  好像文章開(kāi)頭的目的已經(jīng)實(shí)現(xiàn)了。
  仔細(xì)測(cè)試一下當(dāng)前的窗體,是不是與原來(lái)有很大的不同。首先,窗口的標(biāo)題欄總是非焦點(diǎn)狀態(tài)。第二窗體上的右擊被桌面攔截了下來(lái)。
  第三Edit里表顯不出TEdit本身對(duì)消息的響應(yīng)。如點(diǎn)擊時(shí),拖動(dòng)時(shí),按鍵時(shí)右擊時(shí),Edit缺少相應(yīng)的閃爍輸入光標(biāo),抹黑所選字符,文字處理,顯示上下文菜單等。這是因?yàn)榇绑w得不到焦點(diǎn),而得不到焦點(diǎn)對(duì)于TEdit控件來(lái)說(shuō),一切都是無(wú)效的。
  動(dòng)態(tài)取得第一層控件句柄的方法是:
  TmpHandle:=FindWindow(''''Progman'''',Nil);
  TmpHandle:=GetWindow(TmpHandle,GW_CHILD);
  TmpHandle:=GetWindow(TmpHandle,GW_CHILD);
  此時(shí)TmpHandle即是桌面的句柄了。
  依照此方法,我們可以將窗體嵌入第二層''''SHELLDLL_DefView''''了。當(dāng)嵌入第二層時(shí),你會(huì)發(fā)現(xiàn)。所嵌入的程序窗口不見(jiàn)了。當(dāng)我們把第一層最小化時(shí),可以看到我們所嵌入的窗口是存在的。只是被第一層所遮住了。所以說(shuō),第一層并不是透明的!
  第一層最小化之后,可以看到,桌面上的圖標(biāo)都不見(jiàn)了。再看一下第一層的類(lèi)名“SysListView32”,可以確定,第一層這個(gè)控件的作用主要就是列出系統(tǒng)桌面上的圖標(biāo)。我們?cè)诋?dāng)前第二層中點(diǎn)擊一下右鍵。桌面菜單出來(lái)了吧?原來(lái)一切的消息及處理都是在這一層接收和處理的。這時(shí)可以用“新建”命令新建一個(gè)文檔,之后再恢復(fù)第一層桌面,可以看到,新建的文檔出現(xiàn)了。
  可以這樣理解,第一層是“顯示層”,第二層是“功能層”。我們的窗體在這里是顯示不出來(lái)的。而且同樣得不到焦點(diǎn)。
  現(xiàn)在,將我們的程序嵌入到第三層''''Progman'''',嵌入之后,出現(xiàn)了和第二層相同的結(jié)果,按功能來(lái)說(shuō)這一層應(yīng)該沒(méi)有什么實(shí)際的用途,可能只是給上面兩層提供一個(gè)容器,F(xiàn)在''''Progman''''中有了兩個(gè)窗體,一個(gè)是原有的''''SHELLDLL_DefView'''',另一個(gè)便是這個(gè)嵌入窗體。但是前者用盡了所有的可視區(qū)域,所以才使得嵌入的窗體顯示不出來(lái)。這種情況似乎平時(shí)也會(huì)遇到,那我們?cè)谇度霑r(shí)加入一句:BringWindowToTop(FrmMain.Handle);試試;
  呵呵,看到了什么?是不是嵌入的窗口出現(xiàn)了?按一下"Win+D"看一下。如何?還在吧?如果桌面上有圖標(biāo)的話,此時(shí)這個(gè)窗體應(yīng)該是擋遮住了一部分圖標(biāo)的。
處理的辦法就是將上一層窗體縮小。如:
  TmpHandle:=FindWindow(''''Progman'''',Nil);
  TmpHandle:=GetWindow(TmpHandle,GW_CHILD);
  MoveWindow(TmpHandle,0,20,1024,740,False);
  這樣,在窗體頂部留出了二十象素的高度?梢苑乓粋(gè)任務(wù)欄式的窗體了。
  現(xiàn)在只剩下最后一層"#32769"了。只要在系統(tǒng)登陸前的啟動(dòng)程序不變,此窗口的句柄應(yīng)該是不變化的(有可能系統(tǒng)登陸前啟動(dòng)的程序有變化此句柄也不變,具體情況沒(méi)試過(guò))。
  按前面的方法將窗體嵌入到此窗口中。
  窗體又是得不到焦點(diǎn)的狀態(tài)了?梢钥闯鰜(lái)這和嵌入到第一層差不多。但是我們拖動(dòng)一下窗體看一下。此時(shí)窗體并不是實(shí)時(shí)跟隨鼠標(biāo)的。再仔細(xì)看一下,任務(wù)欄上出現(xiàn)了兩個(gè)此程序的按鈕。一個(gè)是程序的名稱(chēng),一個(gè)是窗口的名稱(chēng)。這是一種奇怪的現(xiàn)象,從來(lái)沒(méi)有見(jiàn)過(guò)的;蛟S我們可以這樣解釋它。Explorer會(huì)將符合要求的窗體顯示在任務(wù)欄上(非ToolsWindows,并且可見(jiàn))。本窗體就符合,而且Explorer又會(huì)將窗口"#32769"里的所有窗口放到任務(wù)欄上而不管它是否復(fù)。所以才會(huì)得到此結(jié)果。
  總結(jié)一下:
  Windows的桌面是分四層的。嵌入的窗體如果嵌入到第三層,并將Z軸順序移到最上的話,程序就會(huì)一個(gè)正常的嵌入桌面的程序。這符合我們的要求。而且可以通過(guò)調(diào)整第二層的大小來(lái)使窗體不遮住桌面圖標(biāo)。所以,將窗體嵌入到此是很理想的。
  第一層的嵌入也是可以的。但是在這里窗體會(huì)得不到焦點(diǎn)和使用不了右鍵。所以這里的窗體受很多限制。
  第二層是一個(gè)根本不考慮嵌入窗體的地方,因?yàn)檫@里的窗體根本顯示不出來(lái)。而且與第一層相同的得不到焦點(diǎn)。
  第四層是個(gè)意外的層。嵌在這里的窗體會(huì)表顯出異樣的情況。唯一值得我們嵌入的理由是:它不會(huì)隨Explorer.exe進(jìn)程的結(jié)束而關(guān)閉。


用mfc實(shí)現(xiàn)就是這樣的代碼
HWND hDesktop = ::FindWindow("Progman", NULL);
hDesktop = ::GetWindow(hDesktop, GW_CHILD);
CWnd* pWndDesktop = CWnd::FromHandle(hDesktop);
this->SetParent(pWndDesktop);

作者:未知 | 文章來(lái)源:未知 | 更新時(shí)間:2007-10-24 11:44:08

  • 上一篇文章:

  • 下一篇文章:

  • 相關(guān)文章:
    軟件開(kāi)發(fā)中項(xiàng)目經(jīng)理有那些職責(zé)
    “七分選型,三分軟件”的ERP法則
    C++函數(shù)對(duì)象count_if
    語(yǔ)法C# 問(wèn)關(guān)鍵字之:base、this
    優(yōu)化Ajax 為網(wǎng)站減負(fù)
    .Net下的分布式緩存
    復(fù)制SQL 數(shù)據(jù)庫(kù)時(shí)的問(wèn)題
    認(rèn)識(shí)Java中native方法
    p2p軟件如何穿透內(nèi)網(wǎng)進(jìn)行通信
    軟件程序編寫(xiě)者的思路需要變化
    軟件技術(shù)
    · 開(kāi)發(fā)語(yǔ)言
    · Java技術(shù)
    · .Net技術(shù)
    · 數(shù)據(jù)庫(kù)開(kāi)發(fā)
    最新文章  
    ·搜集整理的asp.net的驗(yàn)證方
    ·各種FOR循環(huán)結(jié)構(gòu)的整理
    ·軟件項(xiàng)目開(kāi)發(fā)中應(yīng)該考慮那
    ·搜集整理的javascript sel
    ·軟件開(kāi)發(fā)中項(xiàng)目經(jīng)理有那些
    ·學(xué)習(xí)如何在Lambda表達(dá)式進(jìn)
    ·C++基礎(chǔ)知識(shí):結(jié)構(gòu)體數(shù)據(jù)的
    ·C#實(shí)現(xiàn)短信發(fā)送程序的例子
    ·sun最近修補(bǔ)了一部分java的
    ·rss定制的另外一種實(shí)現(xiàn)方式
    ·delphi實(shí)現(xiàn)利用arp欺騙來(lái)實(shí)
    ·基礎(chǔ)學(xué)習(xí):基于WF的流程框
    ·網(wǎng)絡(luò)編程中怎樣得知一次數(shù)
    ·如何逆序輸出單鏈表?
    ·軟件開(kāi)發(fā)過(guò)程中的性能設(shè)計(jì)
    關(guān)于我們 | 軟件開(kāi)發(fā) | 下載試用 | 客服中心 | 聯(lián)系我們 | 友情鏈接 | 網(wǎng)站地圖 | 新疆電子地圖 | RSS訂閱
    版權(quán)所有 © 2016 新疆二域軟件開(kāi)發(fā)網(wǎng) www.pg11qqq.com All Rights Reserved 新ICP備14003571號(hào)
    新疆軟件開(kāi)發(fā)總機(jī):0991-4842803、4811639.
    客服QQ:596589785 ;地址:新疆烏魯木齊北京中路華聯(lián)大廈A-5C 郵編:830000