繁体   English   中英

C++模拟双直接键盘输入

[英]Simulate double direct keyboard input in C++

我发现这个 c++ 脚本可以让你模拟直接键盘输入,但是,我需要模拟两个输入,比如 [Ctrl + A]。 我一直在寻找实现它的方法,但我找不到答案,如果有人可以帮助我或给我一个线索,我将不胜感激。

#include "stdafx.h"
#pragma comment(lib,"user32")
using namespace std;

int main()
{
    char ch = 'a';
    INPUT key;
    memset(&key,0,sizeof(INPUT));//Zero the structure.
    key.type = INPUT_KEYBOARD;
    key.ki.dwExtraInfo = GetMessageExtraInfo();//<-- you will need to pinvoke this too.
    key.ki.wScan = 
        static_cast<WORD>(MapVirtualKeyEx(VkKeyScanA(ch), MAPVK_VK_TO_VSC, GetKeyboardLayout(0)));//more pinvoking
    key.ki.dwFlags = KEYEVENTF_SCANCODE;//<-- you will probably have to declare this constant somewhere-
    //in your C# program.

    //Ready to send the key-down event.
    SendInput(1, &key, sizeof(INPUT));

    Sleep(1000);//Wait one second before sending key-up.

    //Sending key-up.
    key.ki.dwExtraInfo = GetMessageExtraInfo();
    key.ki.dwFlags = KEYEVENTF_SCANCODE | KEYEVENTF_KEYUP;//Key-up need be defined too, or just use the value.
    SendInput(1, &key, sizeof(INPUT));
}

我写了这段代码,按 Ctrl 键不起作用,但是按“W”键可以。

int main()
{
    Sleep(2000); 
    INPUT ip;
    char key1 = VK_CONTROL, key2 = 'w';

    ip.type = INPUT_KEYBOARD;
    ip.ki.wScan = 0; // hardware scan code for key
    ip.ki.time = 0;
    ip.ki.dwExtraInfo = 0;

    ip.ki.wScan = key1;
    ip.ki.dwFlags = 0; // 0 for key press
    SendInput(1, &ip, sizeof(INPUT));

    // Press  key2
    ip.ki.wScan = key2;
    ip.ki.dwFlags = 0; // 0 for key press
    SendInput(1, &ip, sizeof(INPUT));

    // Release key2
    ip.ki.wScan = key2;
    ip.ki.dwFlags = KEYEVENTF_KEYUP;
    SendInput(1, &ip, sizeof(INPUT));

    // Release key1
    ip.ki.wScan = key1;
    ip.ki.dwFlags = KEYEVENTF_KEYUP;
    SendInput(1, &ip, sizeof(INPUT));
}

我注意到如果我删除 VK_CONTROL 按下行,'W' 按下也不起作用。

int main() {
    Sleep(2000);
    INPUT ip;
    char key2 = 'w';

    ip.type = INPUT_KEYBOARD;
    ip.ki.wScan = 0; // hardware scan code for key
    ip.ki.time = 0;
    ip.ki.dwExtraInfo = 0;

    // Press  key2
    ip.ki.wScan = key2;
    ip.ki.dwFlags = 0; // 0 for key press
    SendInput(1, &ip, sizeof(INPUT));

    // Release key2
    ip.ki.wScan = key2;
    ip.ki.dwFlags = KEYEVENTF_KEYUP;
    SendInput(1, &ip, sizeof(INPUT));
}

要发送ctrl - a ,您需要按顺序发送:

key-down events
VK_CONTROL
virtual code for a

key-up events
virtual code for a
VK_CONTROL

因此,使用VkKeyScanExW获取 'a' 的虚拟扫描码

key.ki.wVk = VK_CONTROL;
/* send keystroke */
key.ki.wVk = /* the virtual key code for a that you derived */
/* send keystroke */
/* set flag to keyup */
key.ki.wVk = /* Virtual code for a */
/* send keystroke */
key.ki.wVk = VK_CONTROL;
/* send keystroke */

其中 VK_CONTROL 是 Windows 中定义的宏,它为您提供ctrl的键盘虚拟代码。 将 wScan 设置为 0。

您正在将虚拟代码发送到扫描代码参数。 w 的扫描码不是“w”。

在扫描码集1(美式键盘)中,w的扫描码是0x11,left控件的扫描码是0x1D。 Microsoft 的键盘扫描码规范详细信息集 1 和 2,可在https://download.microsoft.com/download/1/6/1/161ba512-40e2-4cc9-843a-923143f3456c/scancode.doc找到。 扫描码一般有3组,在web的各个地方都有列举。或者,你可以用一个工具来抓取你自己键盘的扫描码。 Sharpkeys 或 AutoHotkey 似乎是用于执行此操作的流行实用程序。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM