Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Проблема с Sleep();

Лиловый Профи (536), на голосовании 2 месяца назад
Всем привет. Имеется программа которая после отпускания клавиши 'D' пользователем зажимает 'A' в зависимости от времени удержания 'D'. Программа работает хорошо. Однако если я зажимаю 'A' в тайминг выполнения Sleep(sleepTime); то программа перестает удерживать 'A' после окончания Sleep(sleepTime).
Вопрос: Как сделать так чтобы если 'A' была нажата во время Sleep(sleepTime) то она задерживалась, пока пользователь не отпустит клавишу. Надеюсь понятно объяснил.


 #include   

#include

#include



using namespace std;

int main() {



while (true) {

int a = 30;

int b = 90;

int s = 200;



if (GetAsyncKeyState('D') & 0x8000) {

keybd_event('D', 0, 0, 0); Sleep(10);







DWORD startTime = GetTickCount64();

while (GetAsyncKeyState('D') & 0x8000);

DWORD holdTime = GetTickCount64() - startTime;



int sleepTime = (holdTime > s) ? b : a;



if (!GetAsyncKeyState('A')) {

keybd_event('A', 0, 0, 0);

Sleep(sleepTime);

keybd_event('A', 0, KEYEVENTF_KEYUP, 0);



}



}

if (!GetAsyncKeyState('D')) {

keybd_event('D', 0, KEYEVENTF_KEYUP, 0);

Sleep(1);

}



}

return 0;

}
Голосование за лучший ответ
arturr Ученик (123) 3 месяца назад
если надо, могу объяснить
 #include   

#include



using namespace std;



int main() {

while (true) {

int a = 30;

int b = 90;

int s = 200;



if (GetAsyncKeyState('D') & 0x8000) {

keybd_event('D', 0, 0, 0);

Sleep(10);



DWORD startTime = GetTickCount64();

while (GetAsyncKeyState('D') & 0x8000); // Ждем отпускания 'D'

DWORD holdTime = GetTickCount64() - startTime;



int sleepTime = (holdTime > s) ? b : a;



// Удерживаем 'A'

keybd_event('A', 0, 0, 0); // Нажимаем 'A'

DWORD endTime = GetTickCount64() + sleepTime; // Время окончания удержания



// Цикл удержания 'A'

while (GetTickCount64() < endTime && GetAsyncKeyState('D') == 0) {

// Проверяем, отпустил ли пользователь 'D'

Sleep(10); // Небольшая задержка для снижения нагрузки на процессор

}



keybd_event('A', 0, KEYEVENTF_KEYUP, 0); // Отпускаем 'A'

}



if (!GetAsyncKeyState('D')) {

keybd_event('D', 0, KEYEVENTF_KEYUP, 0);

Sleep(1);

}

}



return 0;

}
ЛиловыйПрофи (536) 3 месяца назад
Не работает. Он прерывает удержание
Максим Искусственный Интеллект (213232) 3 месяца назад
Нифига не понял. Логично, что если ты отпраляешь отжатие А, то клавиша отжимается, даже если ты перед этим зажал эту клавишу. Собственно, ты сам отправил это событие, поэтому удивляться не стоит. Если тебе не нужно этого делать, тогда не отправляй событие. Во-вторых, лучше пользоваться глобальными хуками клавиатуры, чтобы избежать активного ожидания отжатия и всяких слипов.
ЛиловыйПрофи (536) 3 месяца назад
Там фишка в том что Sleep нужен. Он отмеряет удержание a. С этим всё ок. Но если во время слипа нажали а, то удержание закончится по окончании Sleep. А нужно если такая ситуация произошла, чтобы удерживалось столько сколько жмёт пользователь.
Я просто только начинаю и хз как это обойти
Максим Искусственный Интеллект (213232) Лиловый, ну так логично. Ты же не блокировал клавиатуру пользователя, а лишь отправляешь события нажатия и отжатия. Пользователь может делать то же самое при помощи клавиатуры.
МаксимИскусственный Интеллект (213232) 3 месяца назад
И оно не по окончанию слип закончится, а когда пользователь нажмёт. Твой слип в твоей программе тут не при чём, пользователь жмёт кнопку отдельно от твоей программы.
Sergio 2.1 Оракул (67284) 3 месяца назад
 #include  
#include
#include

using namespace std;

int main() {
while (true) {
int a = 30;
int b = 90;
int s = 200;

if (GetAsyncKeyState('D') & 0x8000) {
keybd_event('D', 0, 0, 0);
Sleep(10);

DWORD startTime = GetTickCount64();
while (GetAsyncKeyState('D') & 0x8000);
DWORD holdTime = GetTickCount64() - startTime;

int sleepTime = (holdTime > s) ? b : a;

if (!(GetAsyncKeyState('A') & 0x8000)) {
keybd_event('A', 0, 0, 0);

DWORD aStartTime = GetTickCount64();
while ((GetTickCount64() - aStartTime < sleepTime) || (GetAsyncKeyState('A') & 0x8000)) {
Sleep(10); // Небольшая задержка для снижения нагрузки на CPU
}

keybd_event('A', 0, KEYEVENTF_KEYUP, 0);
}
}

if (!(GetAsyncKeyState('D') & 0x8000)) {
keybd_event('D', 0, KEYEVENTF_KEYUP, 0);
Sleep(1);
}
}
return 0;
}
ЛиловыйПрофи (536) 3 месяца назад
Не то. Тут а после d нажимается бесконечное количество времени. Нужно sleepTime
Похожие вопросы