2

我正在尝试更改键盘发送到应用程序的键。我已经创建了一个全局挂钩并且可以阻止我想要的密钥,但我现在想发送一个新密钥。这是我的钩子过程:

LRESULT __declspec (dllexport) HookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    int ret;

    if(nCode < 0)
    {
        return CallNextHookEx(hHook, nCode, wParam, lParam);
    }

    kbStruct = (KBDLLHOOKSTRUCT*)lParam;

    printf("\nCaught [%x]", kbStruct->vkCode);

    if(kbStruct->vkCode == VK_OEM_MINUS)
    {
        printf(" - oem minus!");
        keybd_event(VK_DOWN, 72, KEYEVENTF_KEYUP, NULL);
        return -1;
    }
    else if(kbStruct->vkCode == VK_OEM_PLUS)
    {
        printf(" - oem plus!");
        keybd_event(VK_UP, 75, KEYEVENTF_KEYUP, NULL);
        return -1;
    }

    return CallNextHookEx(hHook, nCode, wParam, lParam);
}

我已经尝试将 SendMessage 和 PostMessage 与 GetFocus() 和 GetForegroudWindow() 一起使用,但无法弄清楚如何为 WM_KEYUP 或 WM_KEYDOWN 创建 LPARAM。我还尝试了 keybd_event(),它确实模拟了按键(我知道是因为这个钩子 proc 捕获了模拟的按键),包括 5 或 6 个不同的扫描代码,但没有任何影响我的前台窗口。

我基本上是想将我的 ms3200 上的缩放栏变成滚动控件,所以我什至可能发送了错误的键(向上和向下)。

4

3 回答 3

2

调用 keybd_event 是正确的。如果您所做的只是按键,则窗口可能会处理按键消息。您确实需要先发送一个键,然后再发送一个键:

keybd_event(VK_UP, 75, 0, NULL);
keybd_event(VK_UP, 75, KEYEVENTF_KEYUP, NULL);

或者,更好的是,当 OEM 密钥下降时将密钥向下发送,当 OEM 密钥上升时将密钥向上发送。您可以通过 kbStruct->flags & LLKHF_UP 来判断 down/up 状态。

于 2009-01-31T00:02:42.120 回答
1

您可能希望使用SendInput,因为keybd_event已被取代。MSDN 杂志文章C++ Q&A: Sending Keystrokes to Any App有一个有用的例子。

于 2009-03-11T15:31:28.427 回答
0

您可能想尝试 Control-UpArrow 和 Control-DownArrow 而不是 Up 和 Down。然而,这似乎并不适用于所有应用程序,甚至在它工作的应用程序上,它也可能取决于焦点在哪里。

于 2009-01-31T02:15:57.983 回答