我正在尝试获取一个小应用程序,它将持续模拟 UP (↑箭头键),同时按下另一个键,在我的情况下右CTRL 。
我编写的代码只会为每次按下发送一个 UP - 当我按下右CTRL 时,它只会发送一个 UP < / kbd>并停止。
我想提一下,这段代码完全是基于我在网上找到的文档构建的,我从来没有用C ++编写任何东西,或者任何其他语言,所以任何建议都会对我有很大帮助。我最初尝试在 CAPS LOCK 处于活动状态时这样做,但我发现获得关键状态(开/关)根本不适用于我,无论我尝试了什么。
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;
}
答案 0 :(得分:1)
GetAsyncKeyState
不会返回关于键是向上还是向下的布尔值,而是返回SHORT
(16位整数,通常字面为short
)
如果函数成功,则返回值指定自上次调用
GetAsyncKeyState
以来是否按下了键,以及该键当前是向上还是向下。如果设置了最高有效位,则键为关闭,如果设置了最低有效位,则在上一次调用GetAsyncKeyState
后按下该键。
那是什么意思? &#34;最重要的位&#34;在硬件中是实现定义的(Which end of a bit field is the most significant bit?),但我们可以将所有内容都视为最左边的&#34;位是显着的(1000对0001)。
因此我们可以使用bitmask来测试keydown。
我写了a small demo program来帮助您想象这一切:
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;
此演示展示了如何将一个位掩码应用于short以询问是否设置了最高位。
GetAsyncKeyState
为您提供了检查自上次检查后是否按下了键的附加功能。如需更简单的通话,请查看GetKeyState