修饰符键与SendInput()配合使用很奇怪
Modifier keys works strange with SendInput()
本文关键字:SendInput 更新时间:2023-10-16
我正在尝试用SendInput()
实现SendKeys()
函数,下面是我的函数的关键片段:
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;
}
取而代之的是"你好",我一直收到"你好"。在程序终止后,ctrl按钮似乎仍在按下。想知道发生了什么。
我认为你的问题在这里
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键。
相关文章:
- 使用 SendInput 或 mouse_event 不适用于 clock()?
- SendInput()鼠标移动计算
- C++ SendInput()
- Implementing winapi(SendInput) with dart:ffi
- 如何检测击键是否被keybd_event或 SendInput 模拟?
- C++ 上的 SendInput 不接受 Ctrl 和 Shift 帐户
- 将字符串传递到sendInput()(C )中
- SendInput() 无法正确管理 Alt 代码
- c++ winapi SendInput 意外行为
- C++SendInput没有按键
- VK_TAB在我的 c++ 程序中无法在 SendInput() 中工作
- C++-使用SendInput方法模拟按键,无法区分右键
- 使用SendInput锁定计算机
- 如何在SendInput中使用扩展扫描码
- 在Eclipse CDT中使用SendInput和MinGW
- 修饰符键与SendInput()配合使用很奇怪
- c++ SendInput在Windows Service中是可能的
- c++ win32 SendInput()
- SendInput -(鼠标移动模拟)
- 使用SendInput发送两个或多个字符