【发布时间】:2020-02-21 17:55:29
【问题描述】:
我正在尝试在使用 Embarcadero 编写的 C++ 应用程序中向控件发送 CTRL+SHIFT+END 击键。我正在使用下面的代码:
tagINPUT ip;
ip.type = INPUT_KEYBOARD;
ip.ki.wScan = 0;
ip.ki.time = 0;
ip.ki.dwExtraInfo = 0;
// Appui sur Ctrl
ip.ki.wVk = VK_CONTROL;
ip.ki.dwFlags = 0;
SendInput(1, &ip, sizeof(INPUT));
// Appui sur Shift
ip.ki.wVk = VK_SHIFT;
ip.ki.dwFlags = 0;
SendInput(1, &ip, sizeof(INPUT));
// Appui sur End
ip.ki.wVk = VK_END;
ip.ki.dwFlags = 0;
SendInput(1, &ip, sizeof(INPUT));
Application->ProcessMessages();
// Relacher End
ip.ki.wVk = VK_END;
ip.ki.dwFlags = KEYEVENTF_KEYUP;
SendInput(1, &ip, sizeof(INPUT));
// Relacher Shift
ip.ki.wVk = VK_SHIFT;
ip.ki.dwFlags = KEYEVENTF_KEYUP;
SendInput(1, &ip, sizeof(INPUT));
// Relacher Ctrl
ip.ki.wVk = VK_CONTROL;
ip.ki.dwFlags = KEYEVENTF_KEYUP;
SendInput(1, &ip, sizeof(INPUT));
但是,如果 CTRL 和 SHIFT 键上没有任何操作,它似乎可以正常工作。
我错过了什么?
【问题讨论】:
-
sendinput 不是标准 c++ 的一部分,您应该在问题中包含更多标签,如果您这样离开,您应该将代码包含到该 sendinput 函数中,但我猜您没有没有,不是每个使用 c++ 的人都使用 Embarcadero。
-
老实说,我使用的是来自项目的 SendInput,包含在一个 win32.h 文件中。这是由不再在我公司的其他人完成的,因此我无法准确了解它的作用。
-
用于合成击键
-
好的,我明白了。现在,尽管我在问题中包含的代码中编写了 SendInput,为什么它会合成击键,就好像没有按下 Ctrl 和 Shift 一样?
-
您不应进行多次
SendInput()调用,而应在单个SendInput()调用中传递一个包含您要发送的所有输入的数组。