【问题标题】:What is an alternative to Sendkeys for closing a legacy application?关闭旧应用程序的 Sendkeys 替代方法是什么?
【发布时间】:2010-01-27 02:30:45
【问题描述】:

我希望我的 C# 程序在继续之前关闭某个遗留应用程序。使用 ctrl+x 可以立即关闭旧版应用程序。我可以使用 Sendkeys 来做到这一点,但有人告诉我 sendkeys 可能有点不稳定。我是否可以通过其他方式发送此组合键并关闭旧版应用程序?

【问题讨论】:

    标签: c#


    【解决方案1】:

    如果您知道标题栏上的窗口标题是什么,例如“Foo”,那么您可以使用 p/invoke 查找窗口并从中获取句柄“FindWindow”。获得句柄后,您可以使用 'SendMessage' 向该句柄发送一个表示 Ctrl+X 的 'WM_KEYUP'。

    希望这会有所帮助, 最好的祝福, 汤姆。

    【讨论】:

    • Ctrl+X相对于CloseMainWindow()有什么优势?复杂性?
    • CloseMainWindow() 用于,如果您使用 system.Diagnostics.Process 类实例化进程,根据您包含的链接,它不能用于应用程序之外的任何其他进程。跨度>
    • 这也暗示 OP 已经使用 Process 类来外壳和运行遗留应用程序,但事实并非如此!
    • 我不明白这是在哪里暗示的。在 c# 中获取对 Process 的引用比使用 SendMessage 更容易。
    • 使用从 'FindWindow' 获得的句柄并发送消息比遍历进程列表更容易和有效(这在循环方面可能非常大,有多少进程正在运行机器......并试图找到进程的ID来杀死它)这就是OP正在寻找的,我希望! :)
    【解决方案2】:

    如果这是一个 GUI 应用程序。它还可以通过 SendKeys 响应 Alt+F4。

    与 ctrl+x 不同,Alt+F4 将不依赖于哪个窗口具有焦点。这是 Windows 应用程序的标准加速器,大多数较旧的 GUI 应用程序都支持它。 SendKey 被认为是 flakey 的主要原因是因为击键被传递到焦点窗口,它可能理解也可能不理解它们。但是 Alt+F4 是一个加速器,所以无论哪个窗口有焦点,它都应该工作。

    如果您可以获得主窗口的句柄。 (如果您还没有,请使用FindWindow)。你可以

    PostMessage(hwndApp, WM_SYSCOMMAND, SC_CLOSE, 0);
    

    这相当于从窗口的系统菜单中选择关闭选项。 SendMessage 应该也可以,但是 PostMessage 更安全,因为您的应用程序不会等待消息被传递。

    WM_SYSCOMMAND

    【讨论】:

      【解决方案3】:

      其他选项包括:
      System.Diagnostics.Process.Kill
      System.Diagnostics.Process.CloseMainWindow

      如果后者有效,请使用它。如果没有,并且直接杀死进程不会有任何损失,则使用 Kill()。

      【讨论】:

      • 我认为这不是一个好主意......因为我们不知道这个遗留程序做了什么,你最终可以killing 与它相关的数据,说它是与例如 dBase 或 paradox 或 Clipper 相关联,o.g.k,是否值得这样做?
      • 因此需要注意“如果...直接终止进程,您什么也不会丢失。”
      • 你怎么会知道你什么都没丢失?仅仅因为它工作一次并不能保证它会一直工作。我认为 CloseMainWindow 是安全的,但我绝不会建议任何人使用 Kill。
      • 我的旧应用程序是 calc.exe,我无法杀死它?我只是在这里扮演魔鬼的拥护者。正如之前的评论中提到的,“我们不知道这个遗留程序做了什么。”我提供了两种选择,并鼓励使用“安全”的一种。我应该在OP上全部使用VB并隐藏Kill()的存在吗?
      猜你喜欢
      • 2010-09-07
      • 1970-01-01
      • 2017-02-05
      • 2012-11-19
      • 2014-01-16
      • 1970-01-01
      • 1970-01-01
      • 2014-09-05
      • 2016-06-24
      相关资源
      最近更新 更多