「綁架窗體」:顧名思義,就是將其它應用程式甚至系統程式的窗體活生生地拖進本程式的窗體內。這種未徵得其它程序同意的強行「綁架」行為在某些場合下卻能發揮出非常獨特的作用。本文將討論「綁架」窗體的技術及應用,並舉出了一個完整的「強盜」程序的例子。
從技術上講,為了實現“綁架”,“強盜”程序中必須要有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;
更多請見:http://lincosoft.go.nease.net/