【问题标题】:Better way to "dock" a third party running application inside a windows.forms panel?在 windows.forms 面板中“停靠”第三方运行应用程序的更好方法?
【发布时间】:2010-11-28 22:52:14
【问题描述】:

我目前这样做如下:


// _Container is the panel that the program is to be displayed in.

System.Diagnostics.Process procTest = new System.Diagnostics.Process();
procTest.StartInfo.FileName = "TEST.EXE";
procTest.StartInfo.CreateNoWindow = false;
procTest.StartInfo.WindowStyle = ProcessWindowStyle.Normal;
procTest.Start();

procTest.WaitForInputIdle();
SetParent(procTest.MainWindowHandle, _Container.Handle);
MoveWindow(procTest.MainWindowHandle, 
           0, 0, _Container.Width, _Container.Height, true);

我在使用此代码时遇到的问题是,一旦我更改 MainWindowHandle(即:按钮缺少文本),应用程序 UI 的某些部分将不再正常工作。

有没有办法做到这一点而不会导致停靠的应用程序出现问题? (通过 .net 或 user32)?

【问题讨论】:

  • +1... 我尝试使用 AHK 合并其他应用程序,但一直想知道如何在 C# 中。最终,我将使用它来获取 Windows 的任务栏、托盘、开始按钮等...并创建自定义 UI。

标签: c# winapi user32


【解决方案1】:

首先,不要简单地等待 1.5 秒,而是尝试调用 procTest.WaitForInputIdle 等待它的消息循环空闲。你已经空闲了。

一般来说,如果不修改您托管的程序,我认为不可能做到这一点。

编辑:您可以尝试通过从任务栏隐藏、删除其标题栏、在您的程序移动时移动它等方式将其他程序保持在您的托管区域之上。但是,这仍然不会不能完美地工作;我建议您尝试寻找替代方案。

尝试联系第三方应用的原始开发者并征求他们的意见。

【讨论】:

  • 谢谢,我注意到了这一点,并在您发布回复的同时修改为 WaitForInput,否则我会把它留在那里让其他人看到您在说什么。对不起!现在,当我更改 MainWindowHandle 时,我托管的大多数程序(包括 UI)都可以正常工作,但有些部分却没有。有什么方法可以在不更改 MainWindowHandle 的情况下进行托管?
  • 看来你是对的。第三方应用程序在启动时抓取它的 MainWindowHandle 并在很多地方使用这个存储的句柄,所以它所有使用这个存储值的代码都会出现故障。幸运的是,我能够与最初的开发人员一起工作。我们使用的解决方案是在托管应用程序的 API 中添加更改存储的 MainWindowHandle 的功能(源代码中的几行 C++ 代码),其余代码现在可以正常工作了。
猜你喜欢
  • 1970-01-01
  • 2018-06-06
  • 2011-01-19
  • 2022-12-01
  • 1970-01-01
  • 2018-02-07
  • 1970-01-01
  • 2013-11-24
  • 1970-01-01
相关资源
最近更新 更多