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

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

  1. ntp_

    ntp_ New Member

    Публикаций:
    0
    Регистрация:
    11 ноя 2008
    Сообщения:
    47
    Доброго времени суток.
    Вопрос такой:
    Как можно блокировать системные клавиши или их сочетания?
    То есть у меня будет запущена программа, если пользователь нажмет на клавишу WIN, или там ALT-TAB, или WIN-D мне надо сам факт нажатия отловить и при этом не дать открыться меню "Пуск" и.т.д.
    В поисковике искал, ниче толкового не нашел. Нашел, вроде люди как-то через реестр делали, но мне надо программно чтоб. Ну например нажму я на ESC, и блокировка снята.

    P.S. Ctrl-Alt-Del мне блокировать не надо.
    P.S.S. Если тема избита и где-то есть, просьба указать мне где.
     
  2. ams007

    ams007 New Member

    Публикаций:
    0
    Регистрация:
    28 апр 2007
    Сообщения:
    86
    Как вариант WM_KEY_DOWN или типа того.
    ЗЫ: тема СИЛЬНО избита.
     
  3. ntp_

    ntp_ New Member

    Публикаций:
    0
    Регистрация:
    11 ноя 2008
    Сообщения:
    47
    Ээ... What is it ?)
    Что Вы хотите сказать этим WM_KEY_DOWN ? Я может не догоняю чего, но у меня основная проблема - блокировать клавишу WIN.
     
  4. ams007

    ams007 New Member

    Публикаций:
    0
    Регистрация:
    28 апр 2007
    Сообщения:
    86
    WM_KEY_DOWN - энто такое системное сообщение, возникающее при нажатии кнопки, которое можно попробывать перехватить.
     
  5. ntp_

    ntp_ New Member

    Публикаций:
    0
    Регистрация:
    11 ноя 2008
    Сообщения:
    47
    Еще раз прочитайте название сабжа.

    ЗЫ. Это сообщение зовется WM_KEYDOWN, чтоб вы знали.
     
  6. Aspire

    Aspire New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    1.028
    Смотри в сторону SetWindowsHookEx с параметром WH_KEYBOARD_LL
     
  7. ntp_

    ntp_ New Member

    Публикаций:
    0
    Регистрация:
    11 ноя 2008
    Сообщения:
    47
    Итак значицо, почитал я 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. Если я тут чего-то не то горожу, просьба не пинать, а доходчиво объяснить.
     
  8. Folk Acid

    Folk Acid New Member

    Публикаций:
    0
    Регистрация:
    23 авг 2005
    Сообщения:
    432
    Адрес:
    Ukraine
    Самый простой из способов, эффективно работающий на Win98 (на 2000 не пробовал) - цикл, читающий скан-коды с порта клавиатуры и тут же перезаписывающий их. 100% блокируется ctrl+alt+del
     
  9. ntp_

    ntp_ New Member

    Публикаций:
    0
    Регистрация:
    11 ноя 2008
    Сообщения:
    47
    XP, XP, XP... Ввиду ее популярности и распространенности, а также потому что WIN98 ээ.. как бы помягче... умерла)

    "...читающий скан-коды с порта клавиатуры..." - насколько мне известно, XP такого нахальства не потерпит. Тока если, быть может, драйвер писать... но мне то, простому смертному, надо бы сначало освоить пользователский режим.
     
  10. beginner

    beginner New Member

    Публикаций:
    0
    Регистрация:
    18 янв 2008
    Сообщения:
    233
    ntp_
    1) Системные и удаленные? хммм... может все таки глобальные?
    2) если использовать WH_KEYBOARD_LL то длл не нужна можно в этом же процессе ставить глобальный хук.
    3) угу
    4) не совсем так. Сначала идет проверка первого параметра (nCode) на то, что он меньше нуля, и в этом случае делается return CallNextHookEx(.....)
    Потом ты делаешь с полученными данными что то не хорошее.
    Ну и правилами хорошего тона рекомендуется вызвать return CallNextHookEx(.....), дабы другие программы тоже смогли обработать хук. Винда хуки ставит.
    5) при каждом нажатии клавиши вызовется твоя процедура обработки хука, где один из параметров, а именно lParam - содержит указатель на структуру, в котором описано данное событие. О структуре - можно узнать в МСДН.
     
  11. ntp_

    ntp_ New Member

    Публикаций:
    0
    Регистрация:
    11 ноя 2008
    Сообщения:
    47
    beginner
    Я так понимаю здесь имелось ввиду вызов функции CallNextHookEx?

    Правильно ли я понял, в этой структуре будет как раз и код нажатой клавиши? Стало быть, мне нужно потом эту структуру изменить? Ну чтоб для Windows нажатия как бы не было.
     
  12. CrystalIC

    CrystalIC New Member

    Публикаций:
    0
    Регистрация:
    26 июл 2008
    Сообщения:
    500
    Вроде цепочка хэндлеров, первый изменить не льзя, а его ставит csrss. Хотя могу ошибаться.
     
  13. beginner

    beginner New Member

    Публикаций:
    0
    Регистрация:
    18 янв 2008
    Сообщения:
    233
    ntp_
    >> return CallNextHookEx(...)
    имелось ввиду вызов функции CallNextHookEx и выход из твоего обработчика с результатом, который возратит эта функция.

    Да, там будет виртуальный код, а также скан код нажатой клавиши
    А также флаги, которые показывают, была ли клавиша нажата или отпущена, и некоторые другие интересные вещи.

    Что бы нажатия как бы не было при некоторых условиях, нужно просто написать return 1; На этом прекратится обработка всех хуков и информация о нажатой клавише дальше не пойдет.
    return 0 - прекратит обработку хуков, но передаст информацию о нажатой клавише в систему.
    // могу ошибаться и перепутать, где нужно 0 вернуть, а где 1

    Только насчет перехвата клавиши Пуск - я не уверен, попробуешь - скажешь.
     
  14. ntp_

    ntp_ New Member

    Публикаций:
    0
    Регистрация:
    11 ноя 2008
    Сообщения:
    47
    CrystalIC
    Можно по-подробней пожалуйста.

    "...первый изменить не льзя..."
    То есть как это?)

    Как я вообще рассуждаю, с самого низа: При нажатии любой клавиши генерируется прерывание, то есть сигнал о том что произошло нажатие, это все ессно на низком уровне, в режиме ядра. Этот сигнал распознает драйвер клавиатуры. Далее драйвер клавы "говорит" ОС что произошло не только событие нажатия, но и еще указывает на то какая клавиша была нажата, затем ОС ("лице" какого-то системного процесса) уже знает что дальше делать, к примеру, посылает сообщение кнопке пуск и меню Пуск открывается.

    Может я тут бредятину несу, но все же хотелось бы чтобы кто-нибудь знающий пролил свет на то как это все происходит в действительности, и дал совет по блокировке клавиши WIN.
     
  15. ntp_

    ntp_ New Member

    Публикаций:
    0
    Регистрация:
    11 ноя 2008
    Сообщения:
    47
    beginner
    Спасибо, буду пробовать.

    Интересно, а как же делается блокировка Пуск в некоторых играх или программах?
     
  16. CrystalIC

    CrystalIC New Member

    Публикаций:
    0
    Регистрация:
    26 июл 2008
    Сообщения:
    500
    ntp_
    Я толком в этом не разбераюсь, только поверхностно. Короче, существует цепь хэндлеров, которые зарегистрированы ктото раньше, ктото позже. Есль отрабатывает первый, тот который ранее зареган, второй за этим следить не может.
    На стороне ядра обрабатывает нажатия клавиш поток сырого ввода(RIT).
     
  17. K10

    K10 New Member

    Публикаций:
    0
    Регистрация:
    3 окт 2008
    Сообщения:
    1.590
    Сочетания типа Ctrl+Alt+Del, Alt-Tab, Ctrl+Shift+Esc обрабатываются винлогоном, на них не будут действовать глобальные хуки, потому что винлогон работает на другом рабочем столе.
     
  18. ntp_

    ntp_ New Member

    Публикаций:
    0
    Регистрация:
    11 ноя 2008
    Сообщения:
    47
    С каждым reset'om начинаешь больше думать и реже запускать :) ...эт я про себя

    У меня тут несколько вопросов возникло.
    1. Выше было написано beginner (#10):
    Объясните пожалуйста по-подробней, почему code так вначале должно проверяться? Вроде в туториале такую проверку не осветили.
    2. Также мне не очень понятно про HC_ACTION и HC_NOREMOVE... Читая справку, я может не догнал чего, но понял что первый говорит о том что в paramah содержится нужная инфа, а второй код говорит еще вот что:
    Как правильно понять эту строчку ?
    3. Если я нажму одну клавишу то мой обработчик выполнится один раз?

    Вот пример, естественно он не работает )). Это я попытался вывести MessageBox при нажатии WIN.

     
  19. beginner

    beginner New Member

    Публикаций:
    0
    Регистрация:
    18 янв 2008
    Сообщения:
    233
    ntp_
    1) по МСДН:
    Код (Text):
    1.  If code is less than zero, the hook procedure must pass the message to the CallNextHookEx function
    2. without further processing and should return the value returned by CallNextHookEx.
    вообщем процедура обработки должна быть пропущена и вызван CallNextHookEx.
    2) это связано с очередью сообщений. можно забить.
    3) честно говоря не пробывал нажимать несколько раз. У меня была другая задача.
    скорей всего хук не ставится вообще. для WH_KEYBOARD - нужна длл. это раз
    два - проверку делай на установку хука.
    три - как уже написали выше, кнопку пуск скорей всего неполучится отловить так, надо искать на форумах - "блокировка кнопки пуск" и смотреть как там сделано.
    И не пиши цифры, пиши макросы, а то не совсем понятно какой тип хука ставится.
     
  20. ntp_

    ntp_ New Member

    Публикаций:
    0
    Регистрация:
    11 ноя 2008
    Сообщения:
    47
    begginer
    Дак а я какбы не хочу DLL поэтому и использую в примере WH_KEYBOARD_LL, написал 13 потому что VS2003 вот такое выдает, при написании "WH_KEYBOARD_LL":
    ...хз, может чето с версиями.
    Извините за глупый вопрос но все-таки, проверку на что ? и где ? На то, установлен ли мой хук? Так я вроде сам знаю когда он должен быть установлен а когда нет.