SendMessage适用于WM_CHAR,但不适用于WM_KEYDOWN

时间:2018-01-04 01:43:12

标签: c windows keyboard-events keydown sendmessage

我希望能够使用C模拟Windows 10上的箭头按键。此外,我希望避免必须让我发送这些箭头按键的窗口始终处于活动状态,因此我尝试避免使用SendInput()keybd_event()。我认为除了使用WM_KEYDOWN发送邮件SendMessage()之外,我还有其他一些选择。

作为使用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;
}

1 个答案:

答案 0 :(得分:-1)

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