Доброго времени суток. Вопрос такой: Как можно блокировать системные клавиши или их сочетания? То есть у меня будет запущена программа, если пользователь нажмет на клавишу WIN, или там ALT-TAB, или WIN-D мне надо сам факт нажатия отловить и при этом не дать открыться меню "Пуск" и.т.д. В поисковике искал, ниче толкового не нашел. Нашел, вроде люди как-то через реестр делали, но мне надо программно чтоб. Ну например нажму я на ESC, и блокировка снята. P.S. Ctrl-Alt-Del мне блокировать не надо. P.S.S. Если тема избита и где-то есть, просьба указать мне где.
Ээ... What is it ?) Что Вы хотите сказать этим WM_KEY_DOWN ? Я может не догоняю чего, но у меня основная проблема - блокировать клавишу WIN.
WM_KEY_DOWN - энто такое системное сообщение, возникающее при нажатии кнопки, которое можно попробывать перехватить.
Итак значицо, почитал я 24 главу в туторе Iczelion'a. Получается что если я разбирусь как работают хуки, то смогу решить сабж? Стал разбираться... Пример там на Masm'e несколько напряг ибо не силен я в макросредствах Masma. Ну давайте по-порядку: 1. Меня должны интересовать системные удаленные хуки, так ? 2. Хорошо, стало быть процедура обработки будет в DLL. 3. В своей программе я буду должен сделать примерно такой вызов SetWindowsHookEx(WH_KEYBOARD,hookproc,hinstDLL,NULL); 4. Затем, в DLL, в процедуре обработки hookproc я должен буду где-то вызвать CallNextHookEx на тот случай если другие проги тоже ставят хуки (интересно, а сама винда ставит хуки на что-нибудь ?) Возникает вопрос, а почему вызов CallNextHookEx должен быть вначале.... В туторе так написано: "...Сначала вызывается CallNextHookEx, чтобы другие хуки также могли обработать событие мыши..." Хмм, а если CallNextHookEx вызвать в конце процедуры? 5. Самое главное, не совсем понятно, как собственно произойдет процесс блокировки? То есть, что примерно будет содержать обработчик? P.S. Если я тут чего-то не то горожу, просьба не пинать, а доходчиво объяснить.
Самый простой из способов, эффективно работающий на Win98 (на 2000 не пробовал) - цикл, читающий скан-коды с порта клавиатуры и тут же перезаписывающий их. 100% блокируется ctrl+alt+del
XP, XP, XP... Ввиду ее популярности и распространенности, а также потому что WIN98 ээ.. как бы помягче... умерла) "...читающий скан-коды с порта клавиатуры..." - насколько мне известно, XP такого нахальства не потерпит. Тока если, быть может, драйвер писать... но мне то, простому смертному, надо бы сначало освоить пользователский режим.
ntp_ 1) Системные и удаленные? хммм... может все таки глобальные? 2) если использовать WH_KEYBOARD_LL то длл не нужна можно в этом же процессе ставить глобальный хук. 3) угу 4) не совсем так. Сначала идет проверка первого параметра (nCode) на то, что он меньше нуля, и в этом случае делается return CallNextHookEx(.....) Потом ты делаешь с полученными данными что то не хорошее. Ну и правилами хорошего тона рекомендуется вызвать return CallNextHookEx(.....), дабы другие программы тоже смогли обработать хук. Винда хуки ставит. 5) при каждом нажатии клавиши вызовется твоя процедура обработки хука, где один из параметров, а именно lParam - содержит указатель на структуру, в котором описано данное событие. О структуре - можно узнать в МСДН.
beginner Я так понимаю здесь имелось ввиду вызов функции CallNextHookEx? Правильно ли я понял, в этой структуре будет как раз и код нажатой клавиши? Стало быть, мне нужно потом эту структуру изменить? Ну чтоб для Windows нажатия как бы не было.
ntp_ >> return CallNextHookEx(...) имелось ввиду вызов функции CallNextHookEx и выход из твоего обработчика с результатом, который возратит эта функция. Да, там будет виртуальный код, а также скан код нажатой клавиши А также флаги, которые показывают, была ли клавиша нажата или отпущена, и некоторые другие интересные вещи. Что бы нажатия как бы не было при некоторых условиях, нужно просто написать return 1; На этом прекратится обработка всех хуков и информация о нажатой клавише дальше не пойдет. return 0 - прекратит обработку хуков, но передаст информацию о нажатой клавише в систему. // могу ошибаться и перепутать, где нужно 0 вернуть, а где 1 Только насчет перехвата клавиши Пуск - я не уверен, попробуешь - скажешь.
CrystalIC Можно по-подробней пожалуйста. "...первый изменить не льзя..." То есть как это?) Как я вообще рассуждаю, с самого низа: При нажатии любой клавиши генерируется прерывание, то есть сигнал о том что произошло нажатие, это все ессно на низком уровне, в режиме ядра. Этот сигнал распознает драйвер клавиатуры. Далее драйвер клавы "говорит" ОС что произошло не только событие нажатия, но и еще указывает на то какая клавиша была нажата, затем ОС ("лице" какого-то системного процесса) уже знает что дальше делать, к примеру, посылает сообщение кнопке пуск и меню Пуск открывается. Может я тут бредятину несу, но все же хотелось бы чтобы кто-нибудь знающий пролил свет на то как это все происходит в действительности, и дал совет по блокировке клавиши WIN.
beginner Спасибо, буду пробовать. Интересно, а как же делается блокировка Пуск в некоторых играх или программах?
ntp_ Я толком в этом не разбераюсь, только поверхностно. Короче, существует цепь хэндлеров, которые зарегистрированы ктото раньше, ктото позже. Есль отрабатывает первый, тот который ранее зареган, второй за этим следить не может. На стороне ядра обрабатывает нажатия клавиш поток сырого ввода(RIT).
Сочетания типа Ctrl+Alt+Del, Alt-Tab, Ctrl+Shift+Esc обрабатываются винлогоном, на них не будут действовать глобальные хуки, потому что винлогон работает на другом рабочем столе.
С каждым reset'om начинаешь больше думать и реже запускать ...эт я про себя У меня тут несколько вопросов возникло. 1. Выше было написано beginner (#10): Объясните пожалуйста по-подробней, почему code так вначале должно проверяться? Вроде в туториале такую проверку не осветили. 2. Также мне не очень понятно про HC_ACTION и HC_NOREMOVE... Читая справку, я может не догнал чего, но понял что первый говорит о том что в paramah содержится нужная инфа, а второй код говорит еще вот что: Как правильно понять эту строчку ? 3. Если я нажму одну клавишу то мой обработчик выполнится один раз? Вот пример, естественно он не работает )). Это я попытался вывести MessageBox при нажатии WIN.
ntp_ 1) по МСДН: Код (Text): If code 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. вообщем процедура обработки должна быть пропущена и вызван CallNextHookEx. 2) это связано с очередью сообщений. можно забить. 3) честно говоря не пробывал нажимать несколько раз. У меня была другая задача. скорей всего хук не ставится вообще. для WH_KEYBOARD - нужна длл. это раз два - проверку делай на установку хука. три - как уже написали выше, кнопку пуск скорей всего неполучится отловить так, надо искать на форумах - "блокировка кнопки пуск" и смотреть как там сделано. И не пиши цифры, пиши макросы, а то не совсем понятно какой тип хука ставится.
begginer Дак а я какбы не хочу DLL поэтому и использую в примере WH_KEYBOARD_LL, написал 13 потому что VS2003 вот такое выдает, при написании "WH_KEYBOARD_LL": ...хз, может чето с версиями. Извините за глупый вопрос но все-таки, проверку на что ? и где ? На то, установлен ли мой хук? Так я вроде сам знаю когда он должен быть установлен а когда нет.