2016-06-10 54 views
1

我需要將exe封裝在我的wpf應用程序中。 我的wpf應用程序非常大,並有許多UserControls。 要做到這一點,我已經從我的代碼啓動exe,然後獲取句柄,並使用「setParent」將exe綁定到我的應用程序,但唯一的影響是顯示exe的下拉菜單,但不是主頁面。例如:我試圖嵌入記事本,但當我點擊該區域時只出現下拉菜單(請注意,不出現在主菜單欄中)。在wpf中的c#exe封裝不起作用

var procInfo = new System.Diagnostics.ProcessStartInfo(this.exeName); 
    procInfo.WorkingDirectory = System.IO.Path.GetDirectoryName(this.exeName); 

    // Start the process 
    _childp = System.Diagnostics.Process.Start(procInfo); 

    // Wait for process to be created and enter idle condition 
    _childp.WaitForInputIdle(); 

    // Get the main handle 
    _appWin = _childp.MainWindowHandle; 

    // Get main window handle 
    var helper = new WindowInteropHelper(Window.GetWindow(this.AppContainer)); 

    // Incapsulate 
    SetWindowLongA(_appWin, -20, 0x00000040 | 0x00000008); 
    SetParent(_appWin, helper.Handle); 

請注意,我已經嘗試在其他C#應用程序中的這段代碼,並且工作正常! 我認爲有重繪/更新視口的問題。 我可以用這種方法強制重新繪製我的應用程序中的外部exe文件? 你能幫助我,甚至找到一個替代解決方案來嵌入exe文件嗎?由於

enter image description here

我試圖運行在一個單獨的標籤(here)exe文件的解決方案,但即使這個解決方案行不通。

我可以使用「SendMessage」解決這個問題嗎? 你能建議我做一個測試嗎?

我問你一件事:幫幫我!

+0

HTTP:/ /www.pinvoke.net/default.aspx/user32.RedrawWindow? – tolanj

+0

或者這是Z指數的問題?我不是100%確定你正在努力實現什麼...... – tolanj

+0

http://www.pinvoke.net/default.aspx/user32/BringWindowToTop.html ?? – tolanj

回答

0

以下適用於我,如有必要可以爲您提供示例項目。缺失的部分似乎是你有z索引問題,或者你的桌面co-oridinates中的初始窗口位置是這樣的,它在你的「外部窗口」之外。

這將在從把它和讓它FILL你的窗口:

SetWindowPos(_appWin, default(IntPtr), 0, 0, (int)Application.Current.MainWindow.Width, (int)Application.Current.MainWindow.Height, SetWindowPosFlags.FrameChanged); 

默認(IntPtr的)是Z-索引並說「帶來正面」

然後,您可以作出這樣的較小通過從包含控制,即在偏移如果通過了this.grid你想記事本出現在:

var desiredPos = this.grid.TranslatePoint(new Point(0, 0), Window.GetWindow(this.grid)); 
    SetWindowPos(_appWin, default(IntPtr), 
     (int)desiredPos.X, (int)desiredPos.Y, 
     (int)this.grid.ActualWidth, (int)this.grid.ActualHeight, SetWindowPosFlags.FrameChanged); 
+0

此解決方案不起作用.... – ste

+0

它適用於我的一個簡單的項目示例包裝記事本,沒有您的代碼的完整版本我不能真的走得更遠,你有例如有代碼在哪裏你正在嘗試上述解決方案? – tolanj

0

使用AllowsTransparency =「假」代替AllowsTransparency =「真」的WPF窗口的我已經能夠部分地解決問題

裏面現在,我已經嵌入外部exe文件(例如:「記事本。使用這種方法(WindowsFormHost的方法)的exe「):

System.Windows.Forms.Panel _pnlSched = new System.Windows.Forms.Panel(); 

System.Windows.Forms.Integration.WindowsFormsHost windowsFormsHost1 = 
       new System.Windows.Forms.Integration.WindowsFormsHost(); 
windowsFormsHost1.Child = _pnlSched; 
_grid.Children.Add(windowsFormsHost1); 
ProcessStartInfo psi = new ProcessStartInfo(@"notepad.exe"); 
psi.WindowStyle = ProcessWindowStyle.Normal; 
Process PR = Process.Start(psi); 
PR.WaitForInputIdle(); 
SetParent(PR.MainWindowHandle, _pnlSched.Handle); 

現在問題可以是用戶控制的Z次序。事實上,當另一個用戶控制移動到「記事本」上方時,它低於並且不高於...

enter image description here

注意,也WindowsFormHost的背景不尊重 'Z順序':

enter image description here

任何建議,歡迎

感謝

+0

這是原因:http://stackoverflow.com/questions/9920480/windowsformshost-is-always-the-most-top-from-wpf-element – ste