(这不是评论中解释的转贴)
我的目的是在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并具有一致值的信息。