-1

我正在尝试将 WM_KEYDOWN/WM_KEYUP 对发送到通常不响应 KEYBDINPUT 结构的使用的应用程序。我需要发送转义键以及字母数字字符。由于 MSDN 仅提供有关使用硬件结构的模糊信息,我只能假设 uMsg 字段用于保存 WM_KEYDOWN/WM_KEYUP 消息,接下来的两个字段用于 lParam 的 LOWORD 和 HIWORD(由几个位组成定义扫描码,密钥是否“重复”,等等)。

但是在围绕这些值进行了几个小时的调整之后,我完全不知道如何正确模拟硬件击键。我该怎么做才能让它发挥作用?

4

2 回答 2

2

您根本不应该使用 HARDWAREINPUT。要模拟键盘输入,您必须使用 INPUT.type = INPUT_KEYBOARD 并设置 INPUT.ki 成员。INPUT_HARDWARE 选项是为鼠标或键盘以外的输入设备保留的。

如果应用程序没有响应此输入,那么下一个可能的问题是您有焦点问题。SendInput() 只能在应用程序的窗口位于前台并且应用程序中需要输入的子窗口具有焦点时起作用。这可能很难实现。键入键的另一种方法是使用 SendMessage 将 WM_CHAR 消息直接发送到应该接收它们的窗口。这也避免了处理活动键盘布局和修改键(Alt、Shift、Ctrl)状态的相当大的困难。您现在遇到的一个新问题是检索正确的窗口句柄。

于 2013-01-27T13:22:10.013 回答
0

原来我没有正确实现 KEYBDINPUT,并且在一次调用 SendInput 时也将每个击键发送出去。以下似乎适用于我的目标应用程序中的标准和扩展虚拟键:

VOID SimulateKeystroke(USHORT vk, BOOL bExtended)
{
    INPUT input = {0};

    if(bExtended) input.ki.dwFlags = KEYEVENTF_EXTENDEDKEY;
    input.ki.wVk  = vk;  
    input.type = INPUT_KEYBOARD;
    SendInput(1, &input, sizeof(input));

    ZeroMemory(&input, sizeof(INPUT));
    input.ki.dwFlags  =  KEYEVENTF_KEYUP;
    if( bExtended ) input.ki.dwFlags |= KEYEVENTF_EXTENDEDKEY;

    input.ki.wVk = vk;
    input.type = INPUT_KEYBOARD;
    SendInput(1, &input, sizeof(input));
}
于 2013-01-27T22:38:15.337 回答