Как "поймать" KeyDown?

Тема в разделе "WASM.WIN32", создана пользователем Dmitri, 20 окт 2005.

  1. Dmitri

    Dmitri New Member

    Публикаций:
    0
    Регистрация:
    1 сен 2004
    Сообщения:
    15
    Добрый день!



    Подскажите, как решить проблему: я ловлю нажатия клавиш следующим образом



    LRESULT CALLBACK HookProc(int nCode, WPARAM wParam, LPARAM lParam)

    {

    if (nCode >= 0) {

    switch (state) {

    case 0:

    if (wParam == VK_CONTROL)





    Нажатие на одну клавишу создает три сообщения: KeyDown, KeyPress, KeyUp. Я хочу обрабатывать только KeyDown. В MSDN написано, что если 31 бит lParam равен нулю, то клавиша нажата, иначе клавиша отжата. Я пишу



    if ((wParam == VK_CONTROL) && !(lParam & 80000000))



    Но это условие выполняется уже два раза, а не три при нажатии на одну клавишу. Как сделать, чтобы оно выполнялось один раз?
     
  2. KiNDeR

    KiNDeR New Member

    Публикаций:
    0
    Регистрация:
    13 июн 2003
    Сообщения:
    258
    Адрес:
    Russia
    Не проще ли ловить WM_KEYDOWN?
     
  3. The Great Zopuh

    The Great Zopuh New Member

    Публикаций:
    0
    Регистрация:
    5 мар 2005
    Сообщения:
    12
    Адрес:
    Moskau
    Во-первых, KEYBOARD Hook срабатывает только для двух сообщений: WM_KEYUP и WM_KEYDOWN.



    Во-вторых, надо еще проверять параметр nCode. Фишка в том, что, например, при одном нажатии на клавишу сообщение WM_KEYDOWN может посылаться несколько раз:





    code



    Specifies a code the hook procedure uses to determine how to process the message. This parameter can be one of the following values:



    Value Meaning



    HC_ACTION: The wParam and lParam parameters contain information about a keystroke message.



    HC_NOREMOVE: The wParam and lParam parameters contain information about a keystroke message, and the keystroke message has not been removed from the message queue. (An application called the PeekMessage function, specifying the PM_NOREMOVE flag.)





    Но только одно-единственное из них будет со значением nCode = HC_ACTION, а все остальные nCode = HC_NOREMOVE. (Попробуй понажимать клавиши в Word'е !)



    Так что надо добавить еще одно условие: nCode <> HC_NOREMOVE.