【发布时间】:2021-09-09 13:49:25
【问题描述】:
我希望能就这段代码得到一些帮助。
#include <windows.h>
#include <thread>
void keyPress(WORD keyCode)
{
INPUT input;
input.type = INPUT_KEYBOARD;
input.ki.wScan = keyCode;
input.ki.dwFlags = KEYEVENTF_SCANCODE;
SendInput(1, &input, sizeof(INPUT));
}
void keyRelease(WORD keyCode)
{
INPUT input;
input.type = INPUT_KEYBOARD;
input.ki.wScan = keyCode;
input.ki.dwFlags = KEYEVENTF_SCANCODE | KEYEVENTF_KEYUP;
SendInput(1, &input, sizeof(INPUT));
}
void CtrlPress()
{
while (true)
{
if (GetAsyncKeyState(VK_RBUTTON)) {
Sleep(1000);
keyPress(0x1D);
Sleep(3000);
keyRelease(0x1D);
}
else {
keyRelease(0x1D);;
}
}
}
int main() {
CtrlPress();
}
本质上,我想要它做的是在我按下鼠标右键后按Ctrl 1000ms,然后按住它3000ms,然后释放它,只要循环鼠标右键被按住。如果松开鼠标右键,我还希望循环立即停止并松开 Ctrl。
但是,代码有问题,因为它会大大降低我的 PC 速度。
【问题讨论】:
-
在您的问题中,您写道:
"However something is wrong with the code as it drastically slows down my PC as is."-- 仅仅是您的程序没有响应吗?还是其他进程在运行您的程序时也会变慢? -
旁注:根据函数
GetAsyncKeyState的官方微软文档,不应该依赖最低有效位的值(即不应该使用它)。它仅用于向后兼容 16 位 Windows。如果您只对最重要的位感兴趣,那么您应该改写GetAsyncKeyState(VK_RBUTTON) & 0x8000来掩盖其他所有内容。 -
或者
GetAsyncKeyState(VK_RBUTTON) < 0也可以,因为返回值是有符号的,最高有效位是符号位。