【发布时间】:2018-01-04 01:43:11
【问题描述】:
我希望能够使用 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;
}
【问题讨论】:
-
那WM_KEYDOWN不是用key code吗?此外,没有 WM_KEYUP 的 WM_KEYDOWN 并不能反映完整的按键点击周期。
-
我也尝试添加 WM_KEYUP,但不幸的是没有成功。我不太理解您所说的“WM_KEYDOWN 不是使用密钥代码吗?”
-
你为什么要避开
SendInput?为什么不简单地复制/粘贴文本? -
您需要使用
PostMessage将消息排队到拥有该窗口的线程。线程的消息循环通过GetMessage从队列中获取消息,并通过TranslateMessage将WM_KEYDOWN转换为WM_CHAR。 OTOH,通过SendMessage发送的消息被标记为立即发送到窗口过程——因为发送者正在等待回复。GetMessage不会返回它们,因此发送而不是发布的按键消息不会被转换为字符消息。 -
请阅读About Messages and Message Queues。它是 Windows 编程的基础。
标签: c windows keyboard-events keydown sendmessage