2009-09-16 46 views
2

我目前這樣做如下:更好的方式來「停靠」在windows.forms面板中運行應用程序的第三方?


// _Container is the panel that the program is to be displayed in. 

System.Diagnostics.Process procTest = new System.Diagnostics.Process(); 
procTest.StartInfo.FileName = "TEST.EXE"; 
procTest.StartInfo.CreateNoWindow = false; 
procTest.StartInfo.WindowStyle = ProcessWindowStyle.Normal; 
procTest.Start(); 

procTest.WaitForInputIdle(); 
SetParent(procTest.MainWindowHandle, _Container.Handle); 
MoveWindow(procTest.MainWindowHandle, 
      0, 0, _Container.Width, _Container.Height, true); 

我這段代碼遇到的問題是,應用程序UI不再起作用的某些部分正確,一旦我改變MainWindowHandle(即:按鈕缺少文字)。

有沒有辦法做到這一點,而不會造成停靠的應用程序的問題? (通過.net或user32)?

+0

+1 ...我嘗試了使用AHK的其他應用程序,但總是想知道如何在C#中。最終,我會用它來獲取windows的任務欄,托盤,啓動按鈕等等,並創建一個自定義的UI。 – Sivvy 2009-09-16 20:48:36

回答

1

首先,不要簡單地等待1.5秒,而是嘗試呼叫 procTest. WaitForInputIdle等到其消息循環是空閒的。 你已經是。

一般來說,我認爲不用修改您所託管的程序就可以做到這一點。

編輯:你可以嘗試從任務欄隱藏的,除去其標題欄,讓您的託管區域上方的其他程序,移動它作爲你的程序的動作,等等。但是,這仍然不能很好地工作;我建議你嘗試找一些替代品。

嘗試與第三方應用程序的原始開發人員聯繫並詢問他們的建議。

+0

謝謝,我已經注意到了這一點,並在您發佈您的回覆的同一時間修改爲WaitForInput,否則我會將它留在那裏讓其他人看到您在說什麼。抱歉! 現在,我所託管的大部分程序(包括UI)都在我更改MainWindowHandle時正常工作,但有些部分卻沒有。有沒有辦法在不改變MainWindowHandle的情況下主持? – cabgef 2009-09-16 21:13:37

+0

看起來你是對的。第三方應用程序在啓動時抓取它的MainWindowHandle,並在相當多的地方使用這個存儲的句柄,所以它使用這個存儲值的所有代碼都出現故障。幸運的是,我能夠與原始開發人員合作。我們使用的解決方案是添加在託管應用程序的API中更改存儲的MainWindowHandle(源代碼中包含幾行C++代碼)的功能,其餘代碼現在可以正常工作。 – cabgef 2009-09-20 20:36:05