2016-09-28 5 views
4

Я пытаюсь создать приложение WPF GUI для размещения уже существующего приложения QT GUI как часть основного пользовательского интерфейса.Возможно ли разместить приложение QT в приложении WPF?

Приложение QT не нужно иметь дело с вводом мышки/клавиатуры.

Я пробовал подход, упомянутый в этом SO Post. Кажется, что все эти подходы не работают для приложения QT.

enter image description here

ответ

0

Я не знаю, если это то, что нужно делать, но это то, что я использовал несколько раз возможность размещения других приложений (найдено в интернете):

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

Просто измените это скелет к вашим потребностям. Сообщите мне, если это работает.

+0

Благодаря Лука, это работает для меня, хотя есть еще некоторые незначительные проблемы. Я приму это как ответ и дам награды позже, если нет лучшего решения. – ricky

+0

@ ricky Хорошо спасибо –

+0

Это не «найдено в Интернете», он находится на SO здесь: http://stackoverflow.com/questions/5028598/hosting-external-app-in-wpf-window –

0

Да. Возможно. Очень простой способ для быстрого запуска без усилий по кодированию.

Проверьте эту ссылку: Хостинг EXE-приложений в приложении окна WPF (http://www.codeproject.com/Tips/673701/Hosting-EXE-Applications-in-a-WPF-Window-Applicati). Загрузите проект. Найдите «notepad.exe» в проекте и замените его именем файла вашего приложения QT. Напомним: для WPF exe для запуска приложения QT вам, возможно, потребуется позаботиться о переменных среды, требуемых QT.

Как это выглядит: enter image description here

+0

Я попробовал это, прежде чем задавать этот вопрос. И, похоже, это не работает с приложением QT – ricky

+0

в этом файле: TestWpfAppControl \ MainWindow.xaml.cs, регистрирует переменные среды, требуемые вашим QT. В моем случае я поместил все мои исполняемые файлы QT под папку моего WPF exe. И я изменяю файл MainWindow.xaml.cs как: appControl.ExeName = "myQT.exe"; Environment.SetEnvironmentVariable («PATH», «bin»); –

 Смежные вопросы

  • Нет связанных вопросов^_^