C++ C++;按键时循环模拟按键
我试图得到一个小应用程序,将不断模拟起来(↑ 箭头键)同时按下另一个键,在我的情况下,右键CTRL 然而,我编写的代码每次按下只会向上发送一个,而当我按住右CTRL键时,它只会向上发送一个并停止 <>我想说,这个代码完全是从我在网上找到的文档中建立的,我以前从来没有用C++编写过任何东西,或者任何其他语言,所以任何建议都会对我有很大帮助。我最初尝试在CAPS LOCK处于活动状态时执行此操作,但我发现获取密钥状态(开/关)对我来说根本不起作用,无论我尝试了什么C++ C++;按键时循环模拟按键,c++,windows,keyboard,C++,Windows,Keyboard,我试图得到一个小应用程序,将不断模拟起来(↑ 箭头键)同时按下另一个键,在我的情况下,右键CTRL 然而,我编写的代码每次按下只会向上发送一个,而当我按住右CTRL键时,它只会向上发送一个并停止 我想说,这个代码完全是从我在网上找到的文档中建立的,我以前从来没有用C++编写过任何东西,或者任何其他语言,所以任何建议都会对我有很大帮助。我最初尝试在CAPS LOCK处于活动状态时执行此操作,但我发现获取密钥状态(开/关)对我来说根本不起作用,无论我尝试了什么 int main() { // T
int main()
{
// This structure will be used to create the keyboard
// input event.
INPUT ip;
// Pause for 1 seconds.
Sleep(1000);
// Set up a generic keyboard event.
ip.type = INPUT_KEYBOARD;
ip.ki.wScan = 0; // hardware scan code for key
ip.ki.time = 0;
ip.ki.dwExtraInfo = 0;
while(1){
if(GetAsyncKeyState(VK_RCONTROL))
{
// Press the "UP arrow" key
ip.ki.wVk = 0x26; // virtual-key code for the "UP arrow" key
ip.ki.dwFlags = 0; // 0 for key press
SendInput(1, &ip, sizeof(INPUT));
Sleep(50);
// Release the "UP arrow" key
ip.ki.dwFlags = KEYEVENTF_KEYUP; // KEYEVENTF_KEYUP for key release
SendInput(1, &ip, sizeof(INPUT));
Sleep(50);
}
}
// Exit normally
return 0;
}
不返回关于键是向上还是向下的布尔值,而是一个SHORT
(一个16位整数,通常字面上是SHORT
)
如果函数成功,返回值将指定自上次调用GetAsyncKeyState
以来是否按下该键,以及该键当前是向上还是向下。如果设置了最高有效位,则按键向下;如果设置了最低有效位,则在上一次调用GetAsyncKeyState
后按键
那么这意味着什么呢?硬件中的“最重要位”是实现定义的(),但我们可以将所有内容都视为“最左边”位是重要的(1000对0001)
所以我们可以用一个
我写这封信是为了帮助你想象这一切:
std::cout << "number of bytes in a short: " << sizeof(short) << std::endl;
short i = 0;
i = 1 << (sizeof(short)*8-1); // use bit shifting to set most significant bit
std::cout << "Initial value of i: " << i << std::endl;
std::cout << "Initial value of i as hex: " << std::hex << i << std::endl;
std::cout << "Is most significant bit set?\n";
short bitmask = 0x8000;
std::cout << std::boolalpha << ((bitmask & i) != 0) << std::endl;
std::cout << "Unsetting MSB\n";
i = 0x0000;
std::cout << "Is most significant bit set?\n";
std::cout << std::boolalpha << ((bitmask & i) != 0) << std::endl;
std::coutGetAsyncKeyState
使用最高有效位表示键的当前状态:“如果函数成功,返回值指定自上次调用GetAsyncKeyState以来是否按下了键,以及键当前是向上还是向下。”@MilesBudnek:the“and”这是一个逻辑问题,我相信。因此,如果自上次调用后未按下该键,则无论该键的状态如何,该函数都将始终返回false。不,只是做了一个快速测试。在我按下该键后,它立即返回0x8001,然后返回0x8000,直到我释放它为止。@AndyG非常感谢您为我指明了正确的方向。实际上,我从一开始就要做我想做的事情,那就是使用切换状态。我将其替换为if(GetKeyState(VK_CAPITAL)==1)@MilesBudnek:非常感谢您的认真!我已经更新了帖子。我希望你觉得它更准确。