2016-06-10 3 views
1

Мне нужно инкапсулировать exe в мое приложение wpf. Мое приложение wpf очень велико и имеет множество UserControls. Для этого я запустил exe из своего кода, затем достал дескриптор и использовал «setParent» для привязки exe к моему приложению, но единственный эффект - показать выпадающее меню exe, но не на главной странице. Например: я попытался внедрить блокнот, но при нажатии в области появляется только раскрывающееся меню (обратите внимание, что не отображается строка главного меню).C# exe encapsulation in wpf не работает

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), но даже это решение не работает.

Можно ли разрешить это с помощью «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-индексом, или ваше начальное размещение окна на вашем компьютере со-ордитана такое, что оно находится вне вашего «внешнего окна».

это приведет НЕГО от и сделать его ЗАПОЛНЕНИЯ ваше окно:

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

по умолчанию (IntPtr) предназначен для ZIndex и говорит: «на передний план»

Вы можете затем сделать это меньше, передавая смещения от вашего содержащего контроля, т.е. если 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 = «False» вместо AllowsTransparency = «True» внутри WPF из окна я смог частично решить проблему

Теперь я встроен внешний ехе (например: «блокнота. ехе "), используя этот подход (WindowsFormHost подход):

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 не уважать 'г-порядка':

enter image description here

любое предложение приветствуется

Благодаря

+0

Это причина: http://stackoverflow.com/questions/9920480/windowsformshost-is-always-the-most-top-from-wpf -element – ste