如何在wpf应用程序中运行应用程序?

use*_*275 14 wpf

我的问题是如何在WPF应用程序中运行应用程序(.exe).我的意思是在应用程序的窗口内运行,而不是在外部运行应用程序.

提前致谢

You*_*ngy 19

你想要做的事情是完全可能的,但它确实带来了一些错误,所以不要指望轻松骑行.您需要做的是创建一个继承HwndHost和覆盖该BuildWindowCore()方法的类.请参阅Microsoft的示例,网址http://msdn.microsoft.com/en-us/library/ms752055.aspx

在上面的示例中,它们为您提供了能够将Win32控件放在WPF表单中的概念,但您可以使用相同的体系结构将MainWindowhandle创建的记事本进程加载到边框的子级中.像这样:

protected override HandleRef BuildWindowCore(HandleRef hwndParent)
    {
        ProcessStartInfo psi = new ProcessStartInfo("notepad.exe");
        psi.WindowStyle = ProcessWindowStyle.Minimized;
        _process = Process.Start(psi);
        _process.WaitForInputIdle();

        // The main window handle may be unavailable for a while, just wait for it
        while (_process.MainWindowHandle == IntPtr.Zero)
        {
            Thread.Yield();
        }

        IntPtr notepadHandle = _process.MainWindowHandle;

        int style = GetWindowLong(notepadHandle, GWL_STYLE);
        style = style & ~((int)WS_CAPTION) & ~((int)WS_THICKFRAME); // Removes Caption bar and the sizing border
        style |= ((int)WS_CHILD); // Must be a child window to be hosted

        SetWindowLong(notepadHandle, GWL_STYLE, style);
        SetParent(notepadHandle, hwndParent.Handle);

        this.InvalidateVisual();

        HandleRef hwnd = new HandleRef(this, notepadHandle);
        return hwnd;
    }
Run Code Online (Sandbox Code Playgroud)

请记住,您需要从User32.dll导入一些函数,以便能够设置窗口的样式并设置父窗口句柄:

[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);
Run Code Online (Sandbox Code Playgroud)

还要确保包括:

using System.Windows.Interop;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Threading;
Run Code Online (Sandbox Code Playgroud)

这是我在论坛上的第一个答案,如果需要一些工作,请告诉我.另请参阅WPF窗口中的托管外部应用程序,但不要担心DwayneNeed的东西.只需使用上面代码中的SetParent().如果您尝试在应用页面中嵌入应用,请务必小心.你会在那里遇到一些乐趣.

  • 常量在哪里定义? (5认同)