ntp_ Код (Text): LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) { BOOL fEatKeystroke = FALSE; if (nCode == HC_ACTION) { switch (wParam) { case WM_KEYDOWN: case WM_SYSKEYDOWN: case WM_KEYUP: case WM_SYSKEYUP: PKBDLLHOOKSTRUCT p = (PKBDLLHOOKSTRUCT) lParam; fEatKeystroke = (p->vkCode == VK_RWIN) || (p->vkCode == VK_LWIN); break; } } return(fEatKeystroke ? 1 : CallNextHookEx(NULL, nCode, wParam, lParam)); }
ntp_ странно, но у меня VS2008 нормально обрабатывает WH_KEYBOARD_LL. Код (Text): HHOOK SetWindowsHookEx(int idHook, HOOKPROC lpfn, HINSTANCE hMod, DWORD dwThreadId); Return Value If the function succeeds, the return value is the handle to the hook procedure. If the function fails, the return value is NULL. Покрайней мере будешь знать установился ли хук или нет. и воин дзена q_q уже написал пример обработчика хука. я тебе еще в посте №10 писал, что для определения нажатой клавиши используется структура.
1. Совсем что-то запутался. В примере q_q, в свиче, wParam проверяется на что? На WM_KEYDOWN? А я думал что в wParam будет виртуальный код будет лежать, в справке так написано. 2. А в каком случае нужно проверять на WM_SYSKEYDOWN? 3. PKBDLLHOOKSTRUCT undeclared identifier... Скажите, в чем может быть беда ? 4. То есть по логике, после этой строчки: мне следует написать if (fEatKeystroke==TRUE) .... ?
ntp_ > В примере q_q, в свиче, wParam проверяется на что? На WM_KEYDOWN, WM_SYSKEYDOWN, WM_KEYUP и WM_SYSKEYUP. > 'WH_KEYBOARD_LL' : undeclared identifier ... PKBDLLHOOKSTRUCT undeclared identifier... Скажите, в чем может быть беда? Чему равна _WIN32_WINNT во время компиляции? Эти имена доступны для nt-платформы, начиная с nt4sp3.
Код (Text): #include <windows.h> LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam); HHOOK hHook; int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow) { hHook = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, hInstance, NULL); // Ставим хук WH_KEYBOARD_LL if (!hHook) { // Проверку на правильность установки хука MessageBox(0,"Hook not set","Error",MB_ICONERROR); return 1; } MessageBox(0,"Press OK for exit","OK",MB_OK); // ждем пока надоест играться с хуком UnhookWindowsHookEx(hHook); return 0; } //======================================================================// LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) { if (nCode != HC_ACTION) return CallNextHookEx(NULL, nCode, wParam, lParam); // курим мсдн /* nCode [in] Specifies a code the hook procedure uses to determine how to process the message. If nCode is less than zero, the hook procedure must pass the message to the CallNextHookEx function without further processing and should return the value returned by CallNextHookEx. This parameter can be one of the following values. HC_ACTION */ PKBDLLHOOKSTRUCT p = (PKBDLLHOOKSTRUCT) lParam; switch (wParam) { // так же курим мсдн /* wParam [in] Specifies the identifier of the keyboard message. This parameter can be one of the following messages: WM_KEYDOWN, WM_KEYUP, WM_SYSKEYDOWN, or WM_SYSKEYUP. */ case WM_KEYDOWN: case WM_SYSKEYDOWN: case WM_KEYUP: case WM_SYSKEYUP: if ((p->vkCode == VK_RWIN) || (p->vkCode == VK_LWIN)) { // MessageBox(0,"Button START is pressed or released","OK",MB_OK); return 1; // блокируем кнопку пуск, }; break; } return CallNextHookEx(NULL, nCode, wParam, lParam); } exe прилагается 7 кБ. http://rapidshare.com/files/165901292/StartButtonHook.exe.html
q_q _WIN32_WINNT, он же WINVER равен 0x400. Хотя сам _WIN32_WINNT - undeclared identifier )) beginner Спасибо за пример, только exe на рапиде не запускается, говорит что не корректно настроено. Хз вообще. И опять же, PKBDLLHOOKSTRUCT... сдается мне можно попробовать сделать что-то типа #define WINVER 0xXXX, но только как именно? Ах да, вот еще что, я старый VC6 не снес потому что некотрые проекты у меня в нем созданны, а конвертация в VS2003 иногда исажает код.
ntp_ создай новый проект с этим кодом, если будет ошибка с PKBDLLHOOKSTRUCT - похоже проблема в студии. Старенькая она у тебя.
Может действительно дело в студии? а структура KBDLLHOOKSTRUCT доступна? замени PKBDLLHOOKSTRUCT p на KBDLLHOOKSTRUCT *p; соответственно поправить приведение типа lParam Надеюсь ты не сидишь на винде, ниже чем вин2к ? update: если не поможет, вот структура из winuser.h Код (Text): /* * Structure used by WH_KEYBOARD_LL */ typedef struct tagKBDLLHOOKSTRUCT { DWORD vkCode; DWORD scanCode; DWORD flags; DWORD time; ULONG_PTR dwExtraInfo; } KBDLLHOOKSTRUCT, FAR *LPKBDLLHOOKSTRUCT, *PKBDLLHOOKSTRUCT; Вставь ее в самое начало.
beginner Тьфу, блин, сам не догадался объявить структуру)) Вставил описание структуры... прога заработала. Ща буду эксперементировать. Еще раз спасибо за пример.
ntp_ ntp_ > _WIN32_WINNT - undeclared identifier Если добавить компилятору /D "_WIN32_WINNT=0x0501", то он увидит WH_KEYBOARD_LL и PKBDLLHOOKSTRUCT?
В #17 посте, воин дзена К10 написал: Я в примера begginer'a после case'ов поставил сразу return 1; То есть попытка блокировать все клавиши. Запустил, в результате заблокировались все клавиши и сочетания за исключением CtrlAltDel. Получается что К10 был неправ? Ща заметил еще вот что - отказали все функциональные клавиши после того как программа поработала несколько секунд. Значит такой обработчик некорректный?
q_q Клава не сломалась)), после ресета функциональные клавиши работают. Запустил прогу еще раз, закрыл, функциональные клавиши работают. Не понятно от чего они вчера у меня отказали. K10 Когда я говорю все сочетания и клавиши за исключением CAD, это значит все сочетания и клавиши за исключением CAD)). Сам знаю, что CAD не так просто блокировать. Вообще, задачи у меня такой нет, но я так понимаю чтоб заблокировать CAD надо патчить какую-то DLL или тот же winlogon. Еще предполагаю, если нужно чтоб диспетчер не показывался, то наверно должен сработать такой прием: Создать поток, который будит мониторить окно Диспетчера и как только увидит его - приказывает ему WM_CLOSE.
ntp_ Смотря для чего нужно. Если для администраторских, то дистпетчер задач можно отключить через реестр. Видел кодес, который инжектит ДЛЛ в винлогон, а та переопределяет оконную функцию винлогона и там фильтрует его хоткеи. Можно попробовать подключиться к рабочему столу winlogon. Это гуан-способ.
Сейчас пробовал сделать вот такую программу: после запуска блокируется клавиатура, после нажатия, например на WIN - она разблукируется, использовал семафор. Не работает, в чем может быть проблема?