我正在尝试使用 C# 在我的 exe 中嵌入一个外部程序。这似乎在少数情况下有效,但在其他情况下无效。2个EXE有区别吗?
这是我的代码。
Process p = new Process();
p.StartInfo.FileName = "calc.exe"; // Does not work.
// p.StartInfo.FileName = "notepad.exe"; // works.
p.Start();
if (!p.HasExited)
{
p.WaitForInputIdle();
SetParent(p.MainWindowHandle, this.panel1.Handle);
bool ret = MoveWindow(p.MainWindowHandle, 0, 10, this.panel1.Width, this.panel1.Height - 10, true);
}
我也尝试添加和删除 WaitForInputIdle 和 Thread.Sleep。但这似乎并没有改变行为。
行为:
Notepad.exe:应用程序在面板内打开。我可以在面板内拖动它,但它不会超出面板
Calc.exe:在进程外打开。它不绑定到面板。
我有 3 个需要嵌入的客户提供的 exe。我使用“calc.exe”和“notepad.exe”只是为了提供可重现的代码。
操作系统:Windows 10 Visual Studio 社区版:16.9.4
如果 C# 不是要走的路,关于什么最适合这个要求的任何建议。
谢谢你。
编辑 1:基于更多搜索,我将样式从 WS_POPUP 更改为 WS_CHILD。但仍然没有成功。
代码:
uint style = GetWindowLong(p.MainWindowHandle, GWL_STYLE);
style = (style | WS_POPUP) & (~WS_CHILD);
SetWindowLong(p.MainWindowHandle, GWL_STYLE, style);
我发现的一件奇怪的事情是 GetParent 总是返回 0(表示根应用程序),但 SetParent 却返回了不同的结果。我认为 SetParent 应该返回当前的父级,这与 GetParent 相同。
任何线索将不胜感激。