“綁架窗體”:顧名思義,就是將其它應用程序甚至系統程序的窗體活生生地拖進本程序的窗體內。這種未征得其它程序同意的強行“綁架”行為在某些場合下卻能發揮出非常獨特的作用。本文將討論“綁架”窗體的技術及應用,並給出了一個完整的“強盜”程序的例子。
從技術上講,為了實現“綁架”,“強盜”程序中必須要有一個 MDIForm對象。
實現“綁架”的第二個條件,是必須知道被“綁架”窗體的句柄。做到這一點並不難。比如,當鼠標在屏幕上滑動時,我們可以用 API函數GetCursorPos來獲得鼠標指針的當前位置坐標,然後用另一個 API函數 WindowFromPoint來獲得指定點窗口的句柄。或者使用FindWindow獲得窗口句柄。
有了上述兩個條件,“強盜”程序就可以開始實施“綁架”了:首先用 API函數GetWindow 的GW_CHILD命令來尋找本程序第一個子窗口的句柄;然後用另一個 API函數 SetParent為被“綁架”窗體指定一個“新父”,即指向上面的子窗口的句柄。立刻,兩個原本毫無關系的窗體具有了“父子”關系:被“綁架”窗口出現在“強盜”窗體內部!
二、“綁架”的安全性
不分青紅皂白地進行“綁架”是非常危險的。但只要遵守以下兩個原則就可以保證安全性:
第一,在關閉“強盜”程序之前,把被“綁架”窗體用 SetParent函數“釋放”掉,即恢復被“綁架”者的原來的“父親”。
第二,不要“綁架”系統窗口。系統窗口一般有:任務欄窗口、按下“開始”產生的窗口、按下“Ctrl+Alt+Del”產生的窗口,點擊鼠標右鍵產生的窗口,等等。
綁架”技術在VB中有廣泛的應用,例如,可在程序運行中將控件置入容器控件內部(比如將一個按鈕設成圖象或窗體控件的子窗口),或者將控件從一個容器移至窗體中的另一個。
代碼:
在窗體的private中定義
hwndOldParent:HWND;
hwndNotePad:HWND;
將窗口的FormStyle設為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;