-1

我正在编写一个程序来将击键发送到另一个窗口,并且一切正常,但我必须上网并找到一个函数来完成击键部分本身。它有效,但我不知道它实际上在做什么。有人可以评论这个函数的每一行来解释它在做什么吗?

void GenerateKey(int vk, BOOL bExtended) {

    KEYBDINPUT  kb = {0};
    INPUT       Input = {0};

    /* Generate a "key down" */
    if (bExtended) { kb.dwFlags  = KEYEVENTF_EXTENDEDKEY; }
    kb.wVk  = vk;
    Input.type  = INPUT_KEYBOARD;
    Input.ki  = kb;
    SendInput(1, &Input, sizeof(Input));

    /* Generate a "key up" */
    ZeroMemory(&kb, sizeof(KEYBDINPUT));
    ZeroMemory(&Input, sizeof(INPUT));
    kb.dwFlags  =  KEYEVENTF_KEYUP;
    if (bExtended) { kb.dwFlags |= KEYEVENTF_EXTENDEDKEY; }
    kb.wVk = vk;
    Input.type = INPUT_KEYBOARD;
    Input.ki = kb;
    SendInput(1, &Input, sizeof(Input));

    return;
}

这是一个调用它的例子:

GenerateKey('C', FALSE);    // Sends keystroke 'c'

这会发送击键“c”。

此功能仅适用于大写字母,并且似乎仅适用于特定的十六进制代码。例如,要发送回车(回车键),调用如下:

GenerateKey(0x0D, FALSE);   // Sends carriage return

但是,如果我尝试使用其中任何一个调用发送问号(十六进制 0x3F),则不会发生任何事情:

GenerateKey(0x3F, FALSE);  // Nothing happens
GenerateKey('?', FALSE);   // Nothing happens

谁能明白为什么这些不起作用?

另外,有人可以解释第二个参数 BOOL bExtended 的用途吗?在 TRUE 和 FALSE 之间切换似乎对其发送的击键没有影响。

4

1 回答 1

4

您的GenerateKey函数在内部使用来自 Win32 API 的函数,该函数合成键盘输入SendInput

通过阅读该函数的MSDN 文档,您可以找到了解该函数如何工作以及如何调用它所需的所有信息。

vk参数是一个虚拟键码,在列出。

如果bExtended参数是TRUE,则KEYEVENTF_EXTENDEDKEY设置标志,根据文档,这意味着“扫描码前面有一个值为 0xE0 (224) 的前缀字节”。

于 2012-01-01T18:45:16.817 回答