2010-11-12 61 views
1

我有一個用.Net編寫的遺留應用程序。沒有可用的來源。它使用VB腳本通過事件處理擴展它的內部邏輯。所以它是com和.net的混合體。WinForms:Form.FromHandle爲加載到.net可執行代碼的進程主窗體返回null

我使用SpyUI應用程序,並觀察到用戶界面是用Windows窗體編寫的。控件標題爲.Net風格&它看起來像windows窗體(vC++和vb UI看起來完全不同)。

我想通過實現主窗體的System.Windows.Forms.Form實例來擴展應用程序UI並修改控件樹。

所以我寫VB腳本代碼創建我的COM對象,像:

Set obj = CreateObject("MyUiExtender") 
obj.InjectIntoUi() 

我試圖讓該進程對象的主要形式手柄裝入這個代碼的工作:

Process.GetCurrentProcess().MainWindowHandle; // a meaningfull value 
Process.GetCurrentProcess().MainWindowTitle; // the title of the application 

到目前爲止好,但下面不工作 - >返回null

var mainForm = Control.FromHandle(Process.GetCurrentProcess().MainWindowHandle) 

我OBJE ct被加載到可執行文件中,並嘗試爲同一進程獲取表單實例。我想這是一種應用邊界問題。我的代碼工作完美的,如果我的COM對象通過

t = Type.GetTypeFromProgID("MyUiExtender") 
dynamic c = Activator.CreateInstance(t) 
c.InjectIntoUi(); 

加載到.NET應用程序,我想用VB腳本遺址應用程序邊界莫名其妙......

是否仍然有可能得到主要應用形式,例如作爲Windows.Forms.Form類的實例?

回答

1

問題是,Control.FromHandle只適用於當前進程。如果你想獲得另一個.Net進程的主要形式,你必須將你的代碼注入到其他進程中。

有幾種方法。最常見的是使用CreateRemoteThread將非託管dll加載到其他進程地址空間,然後加載.NET程序集。爲了使它成爲可能,你必須使用C++管理。

如果你是初學者,我會建議使用現有的庫。看看CodePlex上的Hawkeye項目:http://hawkeye.codeplex.com/ 你可以在那裏找到一個現成的圖書館。

你也可以看看http://smuxplugins.codeplex.com/這是.NET代碼注入的又一個例子。