3

我正在编写一个 C# 应用程序,它将聚合对多个应用程序(WMP、Google Earth 等)的控制。对于不是我自己编写的应用程序,我作为一个进程启动,所以我有它们的句柄(handle = Process.Start("C:\whatever.exe"); 是代码,我相信)。

为了让它顺利工作,我需要能够控制每个窗口的最小化/最大化状态,包括我使用 Process.Start() 启动的那些。我见过几种声称可以做到这一点的方法,通常需要导入 user32.dll 并应用 ShowWindow(handle, state)。

我问两个问题。这是最好的方法吗?我是 .NET/Windows 编程的新手(来自 *nix)。此外,我无法让它工作,那么有什么怪癖会抓住新手吗?

(仅供参考:Windows 7 RTM 上的 VS 2008)

4

3 回答 3

2

如果您正在寻找窗口的句柄,那么获取进程的句柄可能是错误的句柄。

早在我的 VB6 时代,我使用的库可以让你通过标题找到窗口,然后你可以从那里将消息传递给 min/max/close/activate 等,但是自从迁移到 .Net 后我还没有做过类似的事情,尽管我确保.Net 存在相同类型的库

对评论的回应:
是的,我看到有一个 GetMainWindowHandle 属性,所以这是一个步骤。接下来,您需要查看 Windows 消息传递,这是您发送“消息”以执行各种 Windows 操作的地方。我没有方便的消息传递代码,但是一旦您知道每条消息的代码,它就相当简单了。

于 2009-10-09T18:25:19.023 回答
1

您可能还想查看Windows 辅助功能API。它们在 Microsoft 中广泛用于自动化 UI 测试。

于 2009-10-09T20:04:37.217 回答
1

如果你想要一个更自然的 API 来做到这一点,你可能会比 White 做得更糟。它主要针对功能测试(并基于 Jim 提到的 Windows 辅助功能 API),但应该用于您的目的。看看这个关于使用 windows 的页面。你可能会写这样的东西:

var application = Application.Attach(processID);
var window = application.GetWindow(windowName);
window.DisplayState = DisplayState.Minimized;
于 2009-10-09T20:20:28.717 回答