2016-06-10 3 views
1

J'ai besoin d'encapsuler exe sur mon application wpf. Mon application wpf est très grande et avec de nombreux UserControls. Pour ce faire, j'ai démarré l'exe de mon code, puis récupère le handle et utilisé le "setParent" pour "lier" l'exe à mon application, mais le seul effet est d'afficher le menu déroulant de l'exe, mais pas la page principale. Par exemple: j'ai essayé d'incorporer le bloc-notes, mais n'apparaît que dans le menu déroulant lorsque je clique dans la zone (notez que la barre de menu principale n'apparaît pas).L'encapsulation C# exe dans wpf ne fonctionne pas

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); 

Notez que j'ai essayé ce morceau de code dans d'autres applications C# et fonctionne très bien! Je pense qu'il y a un problème de redessiner/mettre à jour la fenêtre. De quelle façon puis-je forcer ce redessin de l'exe externe dans mon application? Pouvez-vous m'aider, même pour trouver une solution alternative à l'exe intégré? Merci

enter image description here

J'ai essayé la solution pour exécuter l'exe dans un onglet séparé (here), mais même cette solution fonctionne pas. Est-ce que je peux résoudre ceci avec un "SendMessage"??

Pouvez-vous me suggérer un test à faire?

Je vous demande une chose: aidez-moi !!!

+0

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

+0

ou est-ce un problème Z-index? Je ne suis pas sûr à 100% ce que vous essayez d'atteindre ... – tolanj

+0

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

Répondre

0

Ce qui suit fonctionne pour moi, peut vous fournir un exemple de projet si nécessaire. La pièce manquante semble être soit que vous avez un problème d'index z OU que votre placement de fenêtre initial dans votre bureau co-oridinates est tel qu'il est en dehors de votre «fenêtre externe».

cela apportera-ce le la de et faire FILL votre fenêtre:

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

La valeur par défaut (IntPtr) est pour le ZIndex et dit « mettre en avant »

Vous pouvez ensuite faire que les petits en passant dans les décalages de votre commande contenant, à savoir si this.grid était ce que vous vouliez notepad apparaître sur:

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

Cette solution ne fonctionne pas .... – ste

+0

Cela fonctionne pour moi dans un exemple de projet trivial enveloppant bloc-notes, sans une version complète de votre code, je ne peux vraiment aller plus loin, avez-vous par exemple le code où vous essayez la solution ci-dessus? – tolanj

0

En utilisant AllowsTransparency = « false » au lieu AllowsTransparency = « true » à l'intérieur du WPF de la fenêtre, je suis en mesure de résoudre partiellement le problème

Maintenant, j'ai intégré l'exe externe (par exemple: « bloc-notes. exe ") en utilisant cette approche (WindowsFormHost approche):

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); 

maintenant, le nouveau problème peut être l'ordre Z du contrôle de l'utilisateur. En fait, quand un autre utilisateur se déplace au dessus du "bloc-note", il est en dessous et pas au dessus ...

enter image description here

Notez que aussi l'arrière-plan de l'WindowsFormHost respecte pas le 'z-order':

enter image description here

toute suggestion est la bienvenue

Merci

+0

C'est la raison: http://stackoverflow.com/questions/9920480/windowsformshost-is-always-the-most-top-from-wpf-element – ste