【问题标题】:Modifier keys works strange with SendInput()修饰键与 SendInput() 一起工作很奇怪
【发布时间】:2026-02-18 20:40:01
【问题描述】:

我正在尝试用SendInput() 实现SendKeys() 函数,这是我的函数的关键sn-p:

void static SendKeys(string s){
int modifier=0x00;
string s1=s.substr(0, 1);
int key=0x00;

if (s1=="+"){
    s.erase(0, 1);
    modifier=VK_SHIFT;
}
else if ( s1=="^"){
    s.erase(0, 1);
    modifier=VK_CONTROL;
}
else if (s1=="%"){
    s.erase(0, 1);
    modifier=VK_MENU;
}
else if (s1=="!"){
    s.erase(0, 1);
    modifier=VK_LWIN;
}

...

if(s=="A"||s=="a"){
    key=0x41;
}
else if(s=="B"||s=="b"){

...

else if(s=="Z"||s=="z"){
key=0x5A;
}
INPUT input;
INPUT inputArray[4];
input.type=INPUT_KEYBOARD;

input.ki.dwFlags=0;
input.ki.wVk = modifier;
input.ki.wScan = MapVirtualKey(modifier, MAPVK_VK_TO_VSC);
inputArray[0] = input;

input.ki.dwFlags = 0;
input.ki.wVk = key;
input.ki.wScan = MapVirtualKey(key, MAPVK_VK_TO_VSC);
inputArray[1] = input;

input.ki.wVk = key;
input.ki.wScan = MapVirtualKey(key, MAPVK_VK_TO_VSC);
input.ki.dwFlags = KEYEVENTF_KEYUP;
inputArray[2] = input;

input.ki.wVk = key;
input.ki.wScan = MapVirtualKey(modifier, MAPVK_VK_TO_VSC);
input.ki.dwFlags = KEYEVENTF_KEYUP;
inputArray[3] = input;

SendInput(4,inputArray,sizeof(INPUT));
}

这是我的测试代码:

int main(int argc, char *argv[])
{
while(true){
    Sleep(1000);
    SendKeys("+h");
    SendKeys("e");
    SendKeys("l");
    SendKeys("l");
    SendKeys("o");
    Sleep(1000);
}
return 0;
}

我一直收到“HELLO”,而不是“Hello”,并且在程序终止后,ctrl 按钮似乎仍在按下。想知道发生了什么。

【问题讨论】:

    标签: c++ winapi sendinput


    【解决方案1】:

    我认为你的问题出在这

    input.ki.wVk = key; // <-- should be modifier
    input.ki.wScan = MapVirtualKey(modifier, MAPVK_VK_TO_VSC);
    input.ki.dwFlags = KEYEVENTF_KEYUP;
    inputArray[3] = input;
    

    因此您的程序没有释放 SHIFT 键。

    【讨论】: