【问题标题】:SendMessage works with WM_CHAR but not with WM_KEYDOWNSendMessage 适用于 WM_CHAR 但不适用于 WM_KEYDOWN
【发布时间】:2018-01-04 01:43:11
【问题描述】:

我希望能够使用 C 在 Windows 10 上模拟箭头键按下。此外,我想避免让我发送这些箭头键按下的窗口始终处于活动状态,因此我尝试避免使用SendInput()keybd_event()。我相信除了使用WM_KEYDOWNSendMessage() 发送消息之外,我别无选择。

不过,作为使用WM_KEYDOWN 消息的第一次测试,我正在尝试将按键A 发送到记事本,这样我就可以看到发生了什么。这导致了以下两行代码:

SendMessage(child_window, WM_CHAR, (WPARAM)0x41, (LPARAM)0);
SendMessage(child_window, WM_KEYDOWN, (WPARAM)0x41, (LPARAM)0);

第一个有效:它在记事本中输入字母A。但是,第二个没有,我很难弄清楚原因。有什么建议吗?

完整代码如下:

#include <stdio.h>
#include <Windows.h>

int main()
{
  HWND window = FindWindow("Notepad", NULL);
  if (window == NULL)
  {
    printf("Could not find the window.\n");
    return 1;
  }

  HWND child_window = FindWindowEx(window, NULL, "Edit", NULL);
  if (child_window == NULL)
  {
    printf("Child window could not be found.\n");
    return 1;
  }

  SendMessage(child_window, WM_CHAR, (WPARAM)0x41, (LPARAM)0);
  SendMessage(child_window, WM_KEYDOWN, (WPARAM)0x41, (LPARAM)0);

  return 0;
}

【问题讨论】:

  • 那WM_KEYDOWN不是用key code吗?此外,没有 WM_KEYUP 的 WM_KEYDOWN 并不能反映完整的按键点击周期。
  • 我也尝试添加 WM_KEYUP,但不幸的是没有成功。我不太理解您所说的“WM_KEYDOWN 不是使用密钥代码吗?”
  • 你为什么要避开SendInput?为什么不简单地复制/粘贴文本?
  • 您需要使用PostMessage 将消息排队到拥有该窗口的线程。线程的消息循环通过GetMessage 从队列中获取消息,并通过TranslateMessageWM_KEYDOWN 转换为WM_CHAR。 OTOH,通过SendMessage 发送的消息被标记为立即发送到窗口过程——因为发送者正在等待回复。 GetMessage 不会返回它们,因此发送而不是发布的按键消息不会被转换为字符消息。
  • 请阅读About Messages and Message Queues。它是 Windows 编程的基础。

标签: c windows keyboard-events keydown sendmessage


【解决方案1】:

啊,这可能只是因为记事本程序只有在遇到WM_CHAR 事件时才会在其编辑窗口中附加字母,毕竟这并不奇怪。将WM_KEYDOWN 事件与箭头虚拟键代码结合使用时,光标确实会移动。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-31
    • 2020-11-23
    相关资源
    最近更新 更多