3

我正在尝试使用 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。但这似乎并没有改变行为。

行为:

  1. Notepad.exe:应用程序在面板内打开。我可以在面板内拖动它,但它不会超出面板

  2. 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 相同。

任何线索将不胜感激。

4

0 回答 0