2016-09-28 7 views
4

J'essaie de créer une application GUI WPF pour héberger une application GUI QT déjà existante dans le cadre de l'interface utilisateur principale.Est-il possible d'héberger une application QT dans une application WPF?

L'application QT n'a pas besoin de gérer les entrées souris/clavier.

J'ai essayé l'approche mentionnée dans ce SO Post. Il semble que toutes ces approches ne fonctionnent pas pour une application QT.

enter image description here

Répondre

0

Je ne sais pas si c'est une bonne chose à faire, mais c'est ce que j'utilisé quelques fois pour embedd d'autres applications (trouvées sur internet):

public partial class MainWindow : Window 
{ 
private Process _process; 

[DllImport("user32.dll")] 
private static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong); 

[DllImport("user32.dll", SetLastError = true)] 
private static extern int GetWindowLong(IntPtr hWnd, int nIndex); 

[DllImport("user32")] 
private static extern IntPtr SetParent(IntPtr hWnd, IntPtr hWndParent); 

[DllImport("user32")] 
private static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, int uFlags); 

private const int SWP_NOZORDER = 0x0004; 
private const int SWP_NOACTIVATE = 0x0010; 
private const int GWL_STYLE = -16; 
private const int WS_CAPTION = 0x00C00000; 
private const int WS_THICKFRAME = 0x00040000; 
const string patran = "patran"; 
public MainWindow() 
{ 
    InitializeComponent(); 

    Loaded += (s, e) => LaunchChildProcess(); 
} 

private void LaunchChildProcess() 
{ 
    _process = Process.Start("/path/to/QtExecutable.exe"); 
    _process.WaitForInputIdle(); 

    var helper = new WindowInteropHelper(this); 

    SetParent(_process.MainWindowHandle, helper.Handle); 

    // remove control box 
    int style = GetWindowLong(_process.MainWindowHandle, GWL_STYLE); 
    style = style & ~WS_CAPTION & ~WS_THICKFRAME; 
    SetWindowLong(_process.MainWindowHandle, GWL_STYLE, style); 
    // resize embedded application & refresh 
    ResizeEmbeddedApp(); 
} 

private void ResizeEmbeddedApp() 
{ 
    if (_process == null) 
     return; 
    SetWindowPos(_process.MainWindowHandle, IntPtr.Zero, 0, 0, (int)ActualWidth, (int)ActualHeight, SWP_NOZORDER | SWP_NOACTIVATE); 
} 

protected override Size MeasureOverride(Size availableSize) 
{ 
    Size size = base.MeasureOverride(availableSize); 
    ResizeEmbeddedApp(); 
    return size; 
} 

Il suffit de modifier cette squelette à vos besoins. Dites-moi si cela fonctionne.

+0

Merci Luca, ça marche pour moi, bien qu'il y ait encore quelques problèmes mineurs. Je l'accepterai comme réponse et je donnerai les prix plus tard s'il n'y a pas de meilleure solution. – ricky

+0

@ricky Ok merci –

+0

Ce n'est pas "trouvé sur internet", il se trouve sur SO ici: http://stackoverflow.com/questions/5028598/hosting-external-app-in-wpf-window –

0

Oui. C'est possible. Un moyen très simple pour démarrer rapidement sans effort de codage.

Cochez ce lien: Héberger des applications EXE dans une application de fenêtre WPF (http://www.codeproject.com/Tips/673701/Hosting-EXE-Applications-in-a-WPF-Window-Applicati). Télécharger le projet Recherchez "notepad.exe" dans le projet et remplacez-le par le nom de fichier de votre application QT. Juste un rappel: pour le WPF exe pour lancer l'application QT, vous devrez peut-être prendre soin des variables d'environnement requises par QT.

à quoi il ressemble: enter image description here

+0

J'ai essayé ceci avant de poser cette question. Et il ne semble pas fonctionner avec une application QT – ricky

+0

dans ce fichier: TestWpfAppControl \ MainWindow.xaml.cs, enregistrer les variables d'environnement requises par votre QT. Pour mon cas, j'ai mis tous mes exécutables QT sous le dossier de mon exe WPF. Et je modifie le fichier MainWindow.xaml.cs en tant que: appControl.ExeName = "myQT.exe"; Environment.SetEnvironmentVariable ("PATH", "bin"); –