【发布时间】:2010-01-27 02:30:45
【问题描述】:
我希望我的 C# 程序在继续之前关闭某个遗留应用程序。使用 ctrl+x 可以立即关闭旧版应用程序。我可以使用 Sendkeys 来做到这一点,但有人告诉我 sendkeys 可能有点不稳定。我是否可以通过其他方式发送此组合键并关闭旧版应用程序?
【问题讨论】:
标签: c#
我希望我的 C# 程序在继续之前关闭某个遗留应用程序。使用 ctrl+x 可以立即关闭旧版应用程序。我可以使用 Sendkeys 来做到这一点,但有人告诉我 sendkeys 可能有点不稳定。我是否可以通过其他方式发送此组合键并关闭旧版应用程序?
【问题讨论】:
标签: c#
如果您知道标题栏上的窗口标题是什么,例如“Foo”,那么您可以使用 p/invoke 查找窗口并从中获取句柄“FindWindow”。获得句柄后,您可以使用 'SendMessage' 向该句柄发送一个表示 Ctrl+X 的 'WM_KEYUP'。
希望这会有所帮助, 最好的祝福, 汤姆。
【讨论】:
如果这是一个 GUI 应用程序。它还可以通过 SendKeys 响应 Alt+F4。
与 ctrl+x 不同,Alt+F4 将不依赖于哪个窗口具有焦点。这是 Windows 应用程序的标准加速器,大多数较旧的 GUI 应用程序都支持它。 SendKey 被认为是 flakey 的主要原因是因为击键被传递到焦点窗口,它可能理解也可能不理解它们。但是 Alt+F4 是一个加速器,所以无论哪个窗口有焦点,它都应该工作。
如果您可以获得主窗口的句柄。 (如果您还没有,请使用FindWindow)。你可以
PostMessage(hwndApp, WM_SYSCOMMAND, SC_CLOSE, 0);
这相当于从窗口的系统菜单中选择关闭选项。 SendMessage 应该也可以,但是 PostMessage 更安全,因为您的应用程序不会等待消息被传递。
【讨论】:
其他选项包括:
System.Diagnostics.Process.Kill
System.Diagnostics.Process.CloseMainWindow
如果后者有效,请使用它。如果没有,并且直接杀死进程不会有任何损失,则使用 Kill()。
【讨论】:
killing 与它相关的数据,说它是与例如 dBase 或 paradox 或 Clipper 相关联,o.g.k,是否值得这样做?
Kill()的存在吗?