Использование GetAsyncKeyState
или GetKeyState
плохо для этого случая. Вот цитата из MSDN о том, что именно то, что вы пытаетесь сделать, не подходит для выполнения с двумя функциями в сочетании с SendInput
.
Эта функция не сбрасывает текущее состояние клавиатуры. Любые клавиши, которые уже были нажаты при вызове функции, могут мешать событиям, которые генерирует эта функция.
ОЧЕНЬ ВАЖНО : Вы должны стремиться к тому, чтобы различать guish между входами, которые не моделируются вашей программой, и входами, которые имитируются. Это не означает, что вы должны усложнить этот код и проверить правильность ввода с помощью хуков (подробнее об этом подходе в ответах здесь ). Вы просто хотите увидеть, сгенерирован ли ввод в вашем l oop или нет в вашем l oop.
Я придумал это простое решение, которое, к сожалению, все еще использует две функции, потому что я не знаю других, которые будут проверять входные данные. Он не идеален , но он ближе всего к простому коду, который я мог бы получить.
VOID WINAPI ClickLoop()
{
/** wait for any LMB press. */
while ((GetAsyncKeyState(VK_LBUTTON)&0x8000) == 0)
Sleep(1);
INT nCurrKeyState = GetKeyState(VK_LBUTTON);
INT nPrevKeyState;
do
{
INPUT Input;
ZeroMemory(&Input, sizeof(INPUT));
Input.type = INPUT_MOUSE;
Input.mi.dwFlags = MOUSEEVENTF_LEFTUP;
SendInput(1, &Input, sizeof(INPUT));
Sleep(0); // how many miliseconds between the clicks.
Input.mi.dwFlags = MOUSEEVENTF_LEFTDOWN;
SendInput(1, &Input, sizeof(INPUT));
// !! Do not set this number too low
// !! Setting it too low might cause infinite loops
// and you cannot stop your clicks at first try.
Sleep(70); // how many miliseconds the click is held.
nPrevKeyState = nCurrKeyState;
nCurrKeyState = GetKeyState(VK_LBUTTON);
if ((GetAsyncKeyState(VK_LBUTTON)&0x8000) == 0)
break;
}while (nCurrKeyState != nPrevKeyState);
}
И в вашем основном у вас может быть что-то вроде:
int main()
{
while(TRUE)
{
printf("In click loop...\n");
ClickLoop();
}
return 0;
}
Все еще , это неправильное решение , но я не знаю никаких других функций для тестирования клавиш на windows кроме GetAsyncKeyState
и GetKeyState
. Недостатком также является то, что вы не можете установить время между щелчками менее 70 ~ 80 мс или вы можете его сломать.