我有一个 WPF 应用程序,我希望它看起来像是运行在另一个非 WPF 应用程序中。在现实生活中,这个非 WPF 应用程序是 Internet Explorer 中的 ActiveX,但是为了说明问题,我使用了一个简单的 Windows Forms 应用程序。
我使用了 Windows API 函数 SetParent,关于它已经有很多线程了。然而,我找不到任何关于我的确切问题的解决方案:WPF 应用程序的右下角有一小部分没有被绘制在非 WPF 应用程序的窗口内。
WPF 窗口自己运行时的截图:
WPF 窗口作为 WinForm 应用程序的父窗口时的截图:
如果我使用 WinForms 应用程序或纯 Win32 应用程序(如记事本)替换 WPF 应用程序,则不会出现此问题。
WinForm 代码如下:
我使用了 Windows API 函数 SetParent,关于它已经有很多线程了。然而,我找不到任何关于我的确切问题的解决方案:WPF 应用程序的右下角有一小部分没有被绘制在非 WPF 应用程序的窗口内。
WPF 窗口自己运行时的截图:
![alt text](https://istack.dev59.com/3bb9t.webp)
![alt text](https://istack.dev59.com/nIyaQ.webp)
WinForm 代码如下:
private void Form1_Load(object sender, EventArgs e)
{
// Start process
var psi = new ProcessStartInfo("c:\\wpfapp\\wpfapp\\bin\\Debug\\wpfapp.exe");
psi.WindowStyle = ProcessWindowStyle.Normal;
_process = Process.Start(psi);
// Sleep until new process is ready
Thread.Sleep(1000);
// Set new process's parent to this window
SetParent(_process.MainWindowHandle, this.Handle);
// Remove WS_POPUP and add WS_CHILD window style to child window
const int GWL_STYLE = -16;
const long WS_POPUP = 0x80000000;
const long WS_CHILD = 0x40000000;
long style = GetWindowLong(_process.MainWindowHandle, GWL_STYLE);
style = (style & ~(WS_POPUP)) | WS_CHILD;
SetWindowLong(_process.MainWindowHandle, GWL_STYLE, style);
// Move and resize child window to fit into parent's
MoveWindow(_process.MainWindowHandle, 0, 0, this.Width, this.Height, true);
}
注意:我知道使用SetParent不一定是推荐的做法,但我想要并且需要找出如何以这种方式实现它,所以请允许我 :)