无法在wpf容器

时间:2017-02-16 17:08:49

标签: c# wpf winforms vb6 exe

(这不是评论中解释的转贴)

我的目的是在WPF中的容器中托管一个旧的.exe(VB6生成的一个很好的.exe,它可以很好地工作)。

我的解决方案非常适合像记事本这样的应用程序,但不使用目标VB6 .exe,VB6窗口永远不会托管在我的应用程序中,经过2或3次尝试后,她将崩溃,仅此而已。

这是我的WPF容器中的代码:

查看:

<WindowsFormsHost Grid.Row="1" x:Name="windowsFormsHost1" Height="500" Width="650" ></WindowsFormsHost>

代码背后:

        [DllImport("user32.dll", SetLastError = true)]
    internal static extern bool MoveWindow(IntPtr hWnd, int X, int Y, int nWidth, int nHeight, bool bRepaint);

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

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


private void button1_Click(object sender, RoutedEventArgs e)
{
    try
    {
        Process p = Process.GetProcessById(Int32.Parse(ProcessNameTextBox.Text));

        // Get the main handle
        var appWin = p.MainWindowHandle;

        System.Windows.Forms.Panel _panel = new System.Windows.Forms.Panel();
        windowsFormsHost1.Child = _panel;

        // Put it into this form
        SetParent(appWin, windowsFormsHost1.Child.Handle);
        MessageBox.Show(appWin.ToString());

        // Remove border and whatnot

        SetWindowLong(appWin, GWL_STYLE, WS_VISIBLE);

        // Move the window to overlay it on this window
        MoveWindow(appWin, 0, 0, (int)this.Width, (int)this.Height, true);

    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message, "Error");
    }
}

我尝试了几个代码示例和不同的方法(比如从我的代码后面启动.exe,放一个计时器,......)但是我无法实现它,我想我应该错过一个特异性或什么...

非常感谢你的帮助!

编辑: SetParent之后的MessageBox向我提供了它可以“定位”我的目标vb6 .exe并具有一致值的信息。

0 个答案:

没有答案