Блокировка клавиш, сочетаний клавиш

Тема в разделе "WASM.WIN32", создана пользователем ntp_, 18 ноя 2008.

  1. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    ntp_
    Код (Text):
    1. LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
    2. {
    3.   BOOL fEatKeystroke = FALSE;
    4.   if (nCode == HC_ACTION)
    5.   {
    6.     switch (wParam)
    7.     {
    8.       case WM_KEYDOWN:  case WM_SYSKEYDOWN:
    9.       case WM_KEYUP:    case WM_SYSKEYUP:
    10.         PKBDLLHOOKSTRUCT p = (PKBDLLHOOKSTRUCT) lParam;
    11.         fEatKeystroke = (p->vkCode == VK_RWIN) || (p->vkCode == VK_LWIN);
    12.         break;
    13.     }
    14.   }
    15.   return(fEatKeystroke ? 1 : CallNextHookEx(NULL, nCode, wParam, lParam));
    16. }
     
  2. beginner

    beginner New Member

    Публикаций:
    0
    Регистрация:
    18 янв 2008
    Сообщения:
    233
    ntp_
    странно, но у меня VS2008 нормально обрабатывает WH_KEYBOARD_LL.
    Код (Text):
    1. HHOOK SetWindowsHookEx(int idHook, HOOKPROC lpfn, HINSTANCE hMod, DWORD dwThreadId);
    2.  
    3. Return Value
    4. If the function succeeds, the return value is the handle to the hook procedure.
    5. If the function fails, the return value is NULL.
    Покрайней мере будешь знать установился ли хук или нет.

    и воин дзена q_q уже написал пример обработчика хука.
    я тебе еще в посте №10 писал, что для определения нажатой клавиши используется структура.
     
  3. ntp_

    ntp_ New Member

    Публикаций:
    0
    Регистрация:
    11 ноя 2008
    Сообщения:
    47
    1. Совсем что-то запутался. В примере q_q, в свиче, wParam проверяется на что? На WM_KEYDOWN? А я думал что в wParam будет виртуальный код будет лежать, в справке так написано.
    2. А в каком случае нужно проверять на WM_SYSKEYDOWN?
    3. PKBDLLHOOKSTRUCT undeclared identifier... Скажите, в чем может быть беда ?
    4. То есть по логике, после этой строчки:
    мне следует написать if (fEatKeystroke==TRUE) .... ?
     
  4. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    ntp_
    > В примере q_q, в свиче, wParam проверяется на что?
    На WM_KEYDOWN, WM_SYSKEYDOWN, WM_KEYUP и WM_SYSKEYUP.

    > 'WH_KEYBOARD_LL' : undeclared identifier ... PKBDLLHOOKSTRUCT undeclared identifier... Скажите, в чем может быть беда?
    Чему равна _WIN32_WINNT во время компиляции?
    Эти имена доступны для nt-платформы, начиная с nt4sp3.
     
  5. beginner

    beginner New Member

    Публикаций:
    0
    Регистрация:
    18 янв 2008
    Сообщения:
    233
    Код (Text):
    1. #include <windows.h>
    2.  
    3. LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam);
    4. HHOOK hHook;
    5.  
    6. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow) {
    7.     hHook = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, hInstance, NULL); // Ставим хук WH_KEYBOARD_LL
    8.     if (!hHook) { // Проверку на правильность установки хука
    9.         MessageBox(0,"Hook not set","Error",MB_ICONERROR);
    10.         return 1;
    11.     }
    12.     MessageBox(0,"Press OK for exit","OK",MB_OK); // ждем пока надоест играться с хуком
    13.     UnhookWindowsHookEx(hHook);
    14.     return 0;
    15. }
    16. //======================================================================//
    17. LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) {
    18.     if (nCode != HC_ACTION) return CallNextHookEx(NULL, nCode, wParam, lParam); // курим мсдн
    19. /*
    20. nCode
    21. [in] Specifies a code the hook procedure uses to determine how to process the message.
    22. If nCode is less than zero, the hook procedure must pass the message to the CallNextHookEx function
    23. without further processing and should return the value returned by CallNextHookEx.
    24. This parameter can be one of the following values.
    25. HC_ACTION
    26. */
    27.     PKBDLLHOOKSTRUCT p = (PKBDLLHOOKSTRUCT) lParam;
    28.     switch (wParam) { // так же курим мсдн
    29. /*
    30. wParam
    31. [in] Specifies the identifier of the keyboard message.
    32. This parameter can be one of the following messages:
    33. WM_KEYDOWN, WM_KEYUP, WM_SYSKEYDOWN, or WM_SYSKEYUP.
    34. */
    35.         case WM_KEYDOWN:
    36.         case WM_SYSKEYDOWN:
    37.         case WM_KEYUP:
    38.         case WM_SYSKEYUP:
    39.             if ((p->vkCode == VK_RWIN) || (p->vkCode == VK_LWIN)) {
    40. //              MessageBox(0,"Button START is pressed or released","OK",MB_OK);
    41.                 return 1; // блокируем кнопку пуск,
    42.             };
    43.             break;
    44.     }
    45.     return CallNextHookEx(NULL, nCode, wParam, lParam);
    46. }
    exe прилагается 7 кБ.
    http://rapidshare.com/files/165901292/StartButtonHook.exe.html
     
  6. ntp_

    ntp_ New Member

    Публикаций:
    0
    Регистрация:
    11 ноя 2008
    Сообщения:
    47
    q_q
    _WIN32_WINNT, он же WINVER равен 0x400. Хотя сам _WIN32_WINNT - undeclared identifier ))
    beginner
    Спасибо за пример, только exe на рапиде не запускается, говорит что не корректно настроено. Хз вообще. И опять же, PKBDLLHOOKSTRUCT... сдается мне можно попробовать сделать что-то типа #define WINVER 0xXXX, но только как именно?

    Ах да, вот еще что, я старый VC6 не снес потому что некотрые проекты у меня в нем созданны, а конвертация в VS2003 иногда исажает код.
     
  7. beginner

    beginner New Member

    Публикаций:
    0
    Регистрация:
    18 янв 2008
    Сообщения:
    233
    ntp_
    создай новый проект с этим кодом, если будет ошибка с PKBDLLHOOKSTRUCT - похоже проблема в студии. Старенькая она у тебя.
     
  8. ntp_

    ntp_ New Member

    Публикаций:
    0
    Регистрация:
    11 ноя 2008
    Сообщения:
    47
    Ой, WINVER у меня равен 0x501.

    В новом проэкте все также. PKBDLLHOOKSTRUCT - undeclared...
     
  9. beginner

    beginner New Member

    Публикаций:
    0
    Регистрация:
    18 янв 2008
    Сообщения:
    233
    Может действительно дело в студии?
    а структура KBDLLHOOKSTRUCT доступна?
    замени
    PKBDLLHOOKSTRUCT p на KBDLLHOOKSTRUCT *p; соответственно поправить приведение типа lParam

    Надеюсь ты не сидишь на винде, ниже чем вин2к ?

    update:
    если не поможет, вот структура из winuser.h
    Код (Text):
    1. /*
    2.  * Structure used by WH_KEYBOARD_LL
    3.  */
    4. typedef struct tagKBDLLHOOKSTRUCT {
    5.     DWORD   vkCode;
    6.     DWORD   scanCode;
    7.     DWORD   flags;
    8.     DWORD   time;
    9.     ULONG_PTR dwExtraInfo;
    10. } KBDLLHOOKSTRUCT, FAR *LPKBDLLHOOKSTRUCT, *PKBDLLHOOKSTRUCT;
    Вставь ее в самое начало.
     
  10. ntp_

    ntp_ New Member

    Публикаций:
    0
    Регистрация:
    11 ноя 2008
    Сообщения:
    47
    beginner
    Тьфу, блин, сам не догадался объявить структуру)) Вставил описание структуры... прога заработала. Ща буду эксперементировать. Еще раз спасибо за пример.
     
  11. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    ntp_
    ntp_
    > _WIN32_WINNT - undeclared identifier
    Если добавить компилятору /D "_WIN32_WINNT=0x0501", то он увидит WH_KEYBOARD_LL и PKBDLLHOOKSTRUCT?
     
  12. ntp_

    ntp_ New Member

    Публикаций:
    0
    Регистрация:
    11 ноя 2008
    Сообщения:
    47
    q_q
    Да! Все верно увидил. Ну я в коде вместо параметра так написал #define _WIN32_WINNT 0x0501.
     
  13. ntp_

    ntp_ New Member

    Публикаций:
    0
    Регистрация:
    11 ноя 2008
    Сообщения:
    47
    В #17 посте, воин дзена К10 написал:
    Я в примера begginer'a после case'ов поставил сразу return 1; То есть попытка блокировать все клавиши. Запустил, в результате заблокировались все клавиши и сочетания за исключением CtrlAltDel. Получается что К10 был неправ?

    Ща заметил еще вот что - отказали все функциональные клавиши после того как программа поработала несколько секунд. Значит такой обработчик некорректный?
     
  14. K10

    K10 New Member

    Публикаций:
    0
    Регистрация:
    3 окт 2008
    Сообщения:
    1.590
    Это потому что Ctrl+Alt+Del обрабатывается винлогоном. Попробуй еще Ctrl+Shift+Esc.
     
  15. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    ntp_
    > отказали все функциональные клавиши
    Клавиатура сломалась?
     
  16. ntp_

    ntp_ New Member

    Публикаций:
    0
    Регистрация:
    11 ноя 2008
    Сообщения:
    47
    q_q
    Клава не сломалась)), после ресета функциональные клавиши работают. Запустил прогу еще раз, закрыл, функциональные клавиши работают. Не понятно от чего они вчера у меня отказали.

    K10
    Когда я говорю все сочетания и клавиши за исключением CAD, это значит все сочетания и клавиши за исключением CAD)). Сам знаю, что CAD не так просто блокировать. Вообще, задачи у меня такой нет, но я так понимаю чтоб заблокировать CAD надо патчить какую-то DLL или тот же winlogon. Еще предполагаю, если нужно чтоб диспетчер не показывался, то наверно должен сработать такой прием: Создать поток, который будит мониторить окно Диспетчера и как только увидит его - приказывает ему WM_CLOSE.
     
  17. K10

    K10 New Member

    Публикаций:
    0
    Регистрация:
    3 окт 2008
    Сообщения:
    1.590
    ntp_
    Смотря для чего нужно. Если для администраторских, то дистпетчер задач можно отключить через реестр.
    Видел кодес, который инжектит ДЛЛ в винлогон, а та переопределяет оконную функцию винлогона и там фильтрует его хоткеи.
    Можно попробовать подключиться к рабочему столу winlogon.

    Это гуан-способ.
     
  18. ntp_

    ntp_ New Member

    Публикаций:
    0
    Регистрация:
    11 ноя 2008
    Сообщения:
    47
    K10
    Что за гуан ? Жаргонизм ? :)
     
  19. K10

    K10 New Member

    Публикаций:
    0
    Регистрация:
    3 окт 2008
    Сообщения:
    1.590
    ntp_
    Типа того :)
    Означает "не самое правильное решение".
     
  20. ntp_

    ntp_ New Member

    Публикаций:
    0
    Регистрация:
    11 ноя 2008
    Сообщения:
    47
    Сейчас пробовал сделать вот такую программу: после запуска блокируется клавиатура, после нажатия, например на WIN - она разблукируется, использовал семафор.

    Не работает, в чем может быть проблема?