我希望在這段代碼中得到一些幫助。
我希望在這段代碼中得到一些幫助。
#include <windows.h>/span>
#include <thread>
void keyPress(WORD keyCode)
{
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.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()。
基本上,我想讓它做的是在我按下滑鼠右鍵1000ms后按下Ctrl,然后保持按壓3000ms,然后釋放,只要滑鼠右鍵被按住就回圈。我還想讓回圈立即停止,并且如果滑鼠右鍵被放開,Ctrl將被釋放。
但是,這段代碼有問題,因為它大大降低了我的電腦的運行速度。
uj5u.com熱心網友回復:
由于你想讓Ctrl鍵在滑鼠右鍵被釋放時立即,你真的不應該使用Sleep()來暫停整個1秒/3秒的回圈迭代,當滑鼠按鍵被放下時,否則你有可能在滑鼠按鍵被釋放后延遲長達4秒才可以再次進行操作。
我將使用一個狀態機來處理這樣的事情,例如:
我將使用一個狀態機來處理。
#include <windows.h>
void keyPress(WORD keyCode)
{
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.type = INPUT_KEYBOARD;
input.ki.wScan = keyCode。
input.ki.dwFlags = KEYEVENTF_SCANCODE | KEYEVENTF_KEYUP。
SendInput(1, &input, sizeof(INPUT)) 。
}
enum myKeyState { IsUp, IsDown, WaitingForPress };
void CtrlPress()
{
myKeyState state state = IsUp;
DWORD startTime = 0;
while (true)
{
if (GetAsyncKeyState(VK_RBUTTON) < 0) {
switch (state) {
case IsUp:
startTime = GetTickCount()。
state = WaitingForPress;
break;
case IsDown:
if ((GetTickCount() - startTime) >=3000) {
keyRelease(0x1D)。
startTime = GetTickCount()。
state = WaitingForPress;
}
break。
case WaitingForPress:
if ((GetTickCount() - startTime) >=1000) {
keyPress(0x1D)。
startTime = GetTickCount()。
state = IsDown。
}
break;
}
}
else {
if (state == IsDown) {
keyRelease(0x1D)。
state = IsUp。
}
Sleep(0); //以避免CPU節流。
}
}
int main() {
CtrlPress()。
既然如此,與其使用GetAsyncKeyState()來定期查詢滑鼠狀態,我反而建議你要求作業系統在滑鼠狀態變化時通知你。 在一個控制臺應用程式中,你可以使用 SetWindowsHookEx() 來安裝一個 WH_MOUSE 或 WH_MOUSE_LL 鉤子來達到這個目的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/320287.html
標籤:
