【问题标题】:Problems sending an Enter key press to an external application with WPF使用 WPF 向外部应用程序发送 Enter 键时出现问题
【发布时间】:2015-08-18 13:47:12
【问题描述】:

我正在尝试使用以下代码向外部应用程序发送 Enter 按键。我已经在 WPF 中对这个主题进行了大量研究,但还没有让它发挥作用。谁能明白为什么这可能不起作用?

    [DllImport("user32.dll")]
    public static extern int SendMessage(IntPtr hWnd, int wMsg, IntPtr wParam, IntPtr lParam);

    const int WM_KEYDOWN = 0x0100;
    const int WM_KEYUP = 0x0101;
    const int VK_ENTER = 0x0D;

    SendMessage((IntPtr)myProcess.MainWindowHandle, WM_KEYDOWN, (IntPtr)VK_ENTER, IntPtr.Zero);
    SendMessage((IntPtr)myProcess.MainWindowHandle, WM_KEYUP, (IntPtr)VK_ENTER, IntPtr.Zero);

注意:

-我无权访问外部应用程序的代码,因为它不是我的。

-SendKeys 在 WPF 中不起作用。

【问题讨论】:

  • 好吧,我不知道 wpf,但我认为您需要为其他应用程序实现接收消息方法,但由于它不是您的,您不能......我想知道这是否有解决方案跨度>
  • 您发布的代码与 WPF 完全无关,如果您在 WinForms 应用程序中调用它,代码是否有效,或者您为什么明确提及 WPF。如果它在 WinForms 中也不起作用,请您删除标签 / 和标题。
  • 您是否以管理员身份午餐应用程序?如果没有尝试这样做
  • 我在标签中添加了 WPF,因为当我没有特别提到 WPF 时,我经常得到只能在 WinForms 等其他程序中实现的答案。 SendKeys 就是一个很好的例子。
  • 通过SendMessage 伪造输入是不可靠的,原因有很多。如果您需要自动化 UI,请改用 UI Automation

标签: c# wpf windows winapi


【解决方案1】:

您是否在 Win32 应用程序或 WPF 以外的其他应用程序中尝试过这个并且它可以工作?您需要了解外部应用程序本身才能尝试与之对话。您正在向窗口发送输入消息,但是否有任何关注外部应用程序的内容,是否需要激活它来处理事件,外部应用程序是否故意阻止/过滤外部命令?有很多事情可能发生。

您可以做的一件事是调试两个应用程序以查看发送消息是否真的有效。尝试向另一个基本应用程序发送消息,该应用程序在收到输入按下命令时会遇到断点。如果这可行,那么您知道您对主题中的外部应用程序的理解正在做您不期望的事情。

SendMessage 的另一个有用之处是它返回一个int。发送消息后的返回值是多少?您可能已经阅读过它,但请确保您了解SendMessage,尤其是:

消息发送受 UIPI 约束。进程的线程只能向完整性级别较低或相等的进程中的线程的消息队列发送消息。

以及整个备注部分。我认为它也值得了解编组WM_USERWM_APPRegisterWindowMessage

如果不是 0,请告诉我们您的返回值是多少。

编辑

我用谷歌搜索了你的问题并导航到this,但它的标签是delphi。您应该可以尝试相同的PostMessagePostThreadMessage 调用,因为它也在user32.dll 中。最后一个和倒数第二个帖子here 似乎在警告 OP 记住在您发送KeyDown 的任何时候打电话给KeyUp。记得检查返回值。

【讨论】:

  • 返回值为0,不过我会看看你的建议
【解决方案2】:

检查您的 SendMessage 呼叫。 msdn文档中所述的第一个参数:

hWnd [in]
Type: HWND
A handle to the window whose window procedure will receive the message
...

是目标应用程序窗口。因此,您可以使用您的代码向您的窗口发送消息。

另一方面,在 wpf 应用程序中,“消息循环”的行为与传统的 Windows 应用程序略有不同。

我可以推荐两种方法

  1. 下载 InputSimulator(它是一个 dll)并尝试使用它。
  2. 下载 InputSimulator(它是一个 dll)。将一个新的控制台应用程序项目添加到您的解决方案中,使用其中的 InputSimulator 发送消息并将其作为流程实例从您的 wpf 应用程序中调用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-14
    • 2023-03-08
    • 1970-01-01
    • 2013-06-20
    • 1970-01-01
    • 1970-01-01
    • 2020-05-03
    相关资源
    最近更新 更多