WM_KEYUP/DOWN при нажатии нескольких клавиш
От: evd_ru  
Дата: 06.12.02 02:33
Оценка:
Цель:

Отследить юзера, когда он нажал и держит несколько кнопок клавиатуры одновременно (с помощью хука WH_JOURNALRECORD).

Проблемы:

1. При нажатии нескольких кнопок строго одновременно не ото всех поступает WM_KEYDOWN.
2. При нажатии как в п. 1 и отпускании не всегда срабатывают все WM_KEYUP, т.о. счетчик нажатых оказывается больше нуля, а все кнопки уже отпущены.

Вопрос:

Как бы так сделать, чтобы счетчик работал правильно?

p.s. В мсдн-е четко сказано: нажал — получил down, держишь — получаешь down, отпустил — получил up.

Фрагмент кода:


HHOOK MyHook;

unsigned int PrevDown = 0;
unsigned int HoldCount = 0;

unsigned int HoldNum = 3; // например

LRESULT CALLBACK MyHookProc(int code, WPARAM wParam, LPARAM lParam)
{
    if (code == HC_ACTION)
    {
        EVENTMSG *msg = (EVENTMSG*) lParam;

        if (msg->message == WM_KEYDOWN)
        {
            if (PrevDown != msg->paramH)
            {
                PrevDown = msg->paramH;

                if (++HoldCount == HoldNum)
                {
                  HoldCount = 0; // код упрощен немного
                  // что-то происходит
                }

            }

        } else if (msg->message == WM_KEYUP && HoldCount)
        {
            PrevDown = 0;
            HoldCount--;
        }
    }

    return CallNextHookEx(MyHook, code, wParam, lParam);
}
Re: WM_KEYUP/DOWN при нажатии нескольких клавиш
От: ZakkeR Россия http://znav.narod.ru
Дата: 06.12.02 05:39
Оценка:
Здравствуйте, evd_ru, Вы писали:


ER>1. При нажатии нескольких кнопок строго одновременно не ото всех поступает WM_KEYDOWN.

ER>2. При нажатии как в п. 1 и отпускании не всегда срабатывают все WM_KEYUP, т.о. счетчик нажатых оказывается больше нуля, а все кнопки уже отпущены.


Рискну предположить, что дело не в винде (хотя есть там одна проблема с двумя shift'ами)
а в клавиатуре. Есть такие клавиатуры, у которых нельзя нажать одновременно три кнопки.
Кстати, а если эти кнопки нажимать не одновременно, а поочереди: нажал A, нажал B, нажал C, отпустил A, отпустил B, отпустил C. Это проходит?
regards
Re[2]: WM_KEYUP/DOWN при нажатии нескольких клавиш
От: evd_ru  
Дата: 06.12.02 08:42
Оценка:
Здравствуйте, ZakkeR, Вы писали:
ZR>Рискну предположить, что дело не в винде (хотя есть там одна проблема с двумя shift'ами)
ZR>а в клавиатуре. Есть такие клавиатуры, у которых нельзя нажать одновременно три кнопки.
ZR>Кстати, а если эти кнопки нажимать не одновременно, а поочереди: нажал A, нажал B, нажал C, отпустил A, отпустил B, отпустил C. Это проходит?

Да, поочеродное нажатие отрабатывается нормально.

Ладно, насчет одновременного нажатия — я могу еще допустить, что это клавиатура (правда, хотелось бы знать точно). А вот как объяснить неправильное количество WM_KEYUP?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.