2013-08-18 21 views
-1

我已閱讀this article如何將按鈕添加到另一個應用程序。當按鈕被添加到父應用程序時,一切似乎都正常,但是當此按鈕被添加到另一個名爲Labform(TLabForm)的應用程序時,單擊後的代碼不會被執行。我還創建了一個後代來實現點擊後的簡單行爲,但沒有成功:在另一個應用程序中添加控件的功能缺失

TButton2 = class (TButton) 
    public 
    procedure Click; override; 
    end; 


procedure TButton2.Click; 
begin 
inherited; 
MessageBox(ParentWindow, 'Hello', 'Window', MB_OK); 
end; 


procedure TForm1.btn1Click(Sender: TObject); 
var 
    Button2 : TButton2 ; 
    Hand: THandle; 
begin 
    // Hand:= FindWindow('TLabForm', 'Labform'); // button added, but SHOWS NO message after click 
    Hand:= FindWindow('TForm1', 'Form1'); // button added, and SHOWS message after click 
    if Hand <> 0 then 
    begin 
    Button2 := TButton2.Create(self); 
    Button2.ParentWindow := hand; 
    Button2.BringToFront; 
    end 
    else 
    ShowMessage('handle not found'); 
end; 

如何解決它?

感謝名單

回答

1

雖然在技術上可以做到你想要什麼,這是難以忍受的困難。 Raymond Chen wrote about this at some length。執行摘要:

在不同流程的窗口之間建立父/子或擁有者/擁有關係在技術上是否合法?是的,這在技術上是合法的。玩鏈鋸也是技術上合法的。

所以,你正在嘗試類似於雜耍鏈鋸的困難。除非你對Win32有深入的理解,否則你沒有成功的機會。因此,如果您想要修改現有流程的GUI,並且無法使用不同流程中的代碼來處理這些操作,那麼您可以做什麼?那麼,你需要在目標進程中執行代碼。

這很容易做到DLL注入。將DLL注入進程並從該DLL修改它的UI。仍然不平凡。如果通過用您自己的窗口過程替換現有的窗口過程來爲窗口創建子類,那麼您將有最好的成功機會。這將允許您在UI線程中運行UI修改代碼。

+1

謝謝你給我直觀的問題... – lyborko

相關問題