Добрый день! Подскажите, как решить проблему: я ловлю нажатия клавиш следующим образом 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)) Но это условие выполняется уже два раза, а не три при нажатии на одну клавишу. Как сделать, чтобы оно выполнялось один раз?
Во-первых, 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.