Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 你能解释一下C++;功能是什么?它发送击键,但我对如何发送感到困惑_C++_Winapi_Sendkeys_Sendinput_Keystrokes - Fatal编程技术网

C++ 你能解释一下C++;功能是什么?它发送击键,但我对如何发送感到困惑

C++ 你能解释一下C++;功能是什么?它发送击键,但我对如何发送感到困惑,c++,winapi,sendkeys,sendinput,keystrokes,C++,Winapi,Sendkeys,Sendinput,Keystrokes,我正在制作一个程序,将击键发送到另一个窗口,我让它全部正常工作,但我必须在线找到一个函数来自己完成击键部分。它能工作,但我不知道它实际上在做什么。有人能评论一下这个函数的每一行,解释它在做什么吗 void GenerateKey(int vk, BOOL bExtended) { KEYBDINPUT kb = {0}; INPUT Input = {0}; /* Generate a "key down" */ if (bExtended) {

我正在制作一个程序,将击键发送到另一个窗口,我让它全部正常工作,但我必须在线找到一个函数来自己完成击键部分。它能工作,但我不知道它实际上在做什么。有人能评论一下这个函数的每一行,解释它在做什么吗

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之间进行更改似乎对它发送的击键没有影响。

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

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

vk
参数是一个列出的虚拟密钥代码


如果
beextended
参数为
TRUE
,则设置
KEYEVENTF\u EXTENDEDKEY
标志,这意味着“扫描代码前面有一个前缀字节,该字节的值为0xE0(224)”。

您的问题是WinAPI特有的,应该这样标记。C++标准不知道击键。键盘上没有问号键。您需要发送SHIFT+
/
(美国QWERTY键盘布局,YMMV)。太好了,谢谢!虚拟密钥代码是阻碍我前进的主要因素,但我现在明白了。@user1125316:对不起,我刚刚注意到我指向虚拟密钥代码列表的链接断开了。我现在修好了。