“綁架窗體”:顧名思義,就是將其它應(yīng)用程序甚至系統(tǒng)程序的窗體活生生地拖進(jìn)本程序的窗體內(nèi)。這種未征得其它程序同意的強(qiáng)行“綁架”行為在某些場(chǎng)合下卻能發(fā)揮出非常獨(dú)特的作用。本文將討論“綁架”窗體的技術(shù)及應(yīng)用,并給出了一個(gè)完整的“強(qiáng)盜”程序的例子。
從技術(shù)上講,為了實(shí)現(xiàn)“綁架”,“強(qiáng)盜”程序中必須要有一個(gè) MDIForm對(duì)象。
實(shí)現(xiàn)“綁架”的第二個(gè)條件,是必須知道被“綁架”窗體的句柄。做到這一點(diǎn)并不難。比如,當(dāng)鼠標(biāo)在屏幕上滑動(dòng)時(shí),我們可以用 API函數(shù)GetCursorPos來獲得鼠標(biāo)指針的當(dāng)前位置坐標(biāo),然后用另一個(gè) API函數(shù) WindowFromPoint來獲得指定點(diǎn)窗口的句柄。或者使用FindWindow獲得窗口句柄。
有了上述兩個(gè)條件,“強(qiáng)盜”程序就可以開始實(shí)施“綁架”了:首先用 API函數(shù)GetWindow 的GW_CHILD命令來尋找本程序第一個(gè)子窗口的句柄;然后用另一個(gè) API函數(shù) SetParent為被“綁架”窗體指定一個(gè)“新父”,即指向上面的子窗口的句柄。立刻,兩個(gè)原本毫無關(guān)系的窗體具有了“父子”關(guān)系:被“綁架”窗口出現(xiàn)在“強(qiáng)盜”窗體內(nèi)部!
二、“綁架”的安全性
不分青紅皂白地進(jìn)行“綁架”是非常危險(xiǎn)的。但只要遵守以下兩個(gè)原則就可以保證安全性:
第一,在關(guān)閉“強(qiáng)盜”程序之前,把被“綁架”窗體用 SetParent函數(shù)“釋放”掉,即恢復(fù)被“綁架”者的原來的“父親”。
第二,不要“綁架”系統(tǒng)窗口。系統(tǒng)窗口一般有:任務(wù)欄窗口、按下“開始”產(chǎn)生的窗口、按下“Ctrl+Alt+Del”產(chǎn)生的窗口,點(diǎn)擊鼠標(biāo)右鍵產(chǎn)生的窗口,等等。
綁架”技術(shù)在VB中有廣泛的應(yīng)用,例如,可在程序運(yùn)行中將控件置入容器控件內(nèi)部(比如將一個(gè)按鈕設(shè)成圖象或窗體控件的子窗口),或者將控件從一個(gè)容器移至窗體中的另一個(gè)。
代碼:
在窗體的PRivate中定義
hwndOldParent:HWND;
hwndNotePad:HWND;
將窗口的FormStyle設(shè)為fsMDIForm
procedure TForm1.Button1Click(Sender: TObject);
begin
hwndNotePad:=FindWindow(PChar('Notepad'),0);
hwndOldParent:=GetParent(hwndNotePad);
Windows.SetParent(hwndNotePad,handle);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
Windows.SetParent(hwndNotePad,hwndOldParent);
end;
更多請(qǐng)見:http://lincosoft.go.nease.net/
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注