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);
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.