C ++, обнаружение, если мышь бездействует (кратковременно, 20 мс) - PullRequest
0 голосов
/ 27 августа 2018

это мой первый пост!

Я пишу программу на C ++ для управления главным героем в серии игр Touhou; Я делаю это для тех, у кого проблемы с руками, и они не могут нажимать клавиши со стрелками, но все еще могут использовать мышь.

Игрок должен запускать клавиши со стрелками движениями мыши (мышь перемещается влево, нажимается левая клавиша и т. Д.). Я уже выполнил эту часть, но персонаж двигается так, как будто клавиши со стрелками нажимались несколько раз, поэтому движения персонажа немного неуклюжи и грубы, а не гладкие и чистые, как если бы клавиша была HOLD.

Моя проблема в том, что мне нужно знать, когда мышь работает на холостом ходу / не движется (чтобы понять, как долго игрок хочет удерживать клавишу со стрелкой - чем больше игрок двигает мышь в направлении, тем больше эта клавиша со стрелкой держать), но не могу понять, как. Поиск по Stackoverflow Я нашел функцию GetLastInput, но она запускает КАЖДЫЙ ввод и не связана только с мышью.

Должно получиться что-то вроде:

while( *mousenotidling* ) { //holdbutton }

Что бы вы предложили? Как я могу узнать, когда мышь бездействует (в течение короткого времени, например, 20 мс)? (или если вы предлагаете другие решения, приветствуется любое мнение)

Я пишу это на C ++, с компилятором Codeblock и GCC, моя ОС - Windows 7 x86:)

1 Ответ

0 голосов
/ 27 августа 2018

Вы можете позвонить TrackMouseEvent и установить время ожидания равным 2000 мс для времени простоя 2 с. Также вы можете использовать GetLastInputInfo, чтобы получить количество миллисекунд, в течение которых выполнялось последнее нажатие клавиши или мыши.

DWORD GetIdleTime() 
{ 
    LASTINPUTINFO pInput;   
    pInput.cbSize = sizeof(LASTINPUTINFO); 

    if (!GetLastInputInfo(&pInput))
    { 
        // any errors will be reported
    } 

    // return idle time in milliseconds
    return pInput.dwTime; 
} 

Также вы можете попробовать это одно предложение

int prev_x = 0, prev_y = 0; while (1) 
{int x = ..., y = ...; if (x == prev_x && y == prev_y) {mouse was moved} 
else {mouse wasn't moved} prev_x = x; prev_y = y;}
...