Конференция "WinAPI" » Keyboard hook и мой KeyBd_Event
 
  • MikeZ (24.02.12 18:41) [0]
    Здравствуйте!

    Пишу приложение, мониторящее ввод с клавиатуры пользователя в его программе. При определенных условиях надо вбивать в его (пользователя) поле ввода свои символы.

    Для монитора ввода использую hook и получаю всё, что нужно.
    Когда требуется, вмешиваюсь в процесс набора и посылаю свою строку через keybd_event - строка вбивается как надо и куда надо.

    Проблема: тот самый hook, зараза, перехватывает и мои keybd_event'ы и в своём "мониторе" получаю кашу из символов пользователя и "моих", посланных через keybd_event.

    Вопрос: как мне заставить hook игнорировать мои keybd_event?

    Я пытался решить этот вопрос, условно, флагом: когда он есть, хук просто игнорирует ввод (оставим за скобками, что при быстром наборе куда-то в середину может попасть символ-другой от пользователя). Однако, при отсылке длинной строки набор keybd_event'ов в моей программе выполняется быстрее, чем фактически возникают события от клавы, поэтому флаг снимается быстрее, чем нужно, и хук ловит хвост моей строки. Отключение/включение хука на время эквивалентно флагу.

    Было бы хорошо, как вариант, как-то "пометить" символы моей строки, чтобы потом в хуке отличать "мой" ввод от ввода пользователя (типа какой-то бит в кодах, что получает хук). Но ничего подходящего я не нашел: в keybd_event такое не засунешь.

    Остался вариант запомнить заранее те символы, что я буду посылать через keybd_event и, уже в осн. программе, получая что-то через хук, проверять и убирать их из этого массива. Но, по-моему, это будет не совсем красиво...

    Буду благодарен за конструктивные советы.
  • Dimka Maslov © (24.02.12 18:55) [1]

    > Вопрос: как мне заставить hook игнорировать мои keybd_event?


    Не вызывать keybd_event, а вмешиваться непосредственно в передачу сообщений.
  • Eraser © (24.02.12 20:31) [2]
    > [0] MikeZ   (24.02.12 18:41)


    > Вопрос: как мне заставить hook игнорировать мои keybd_event?

    внимательно почитать MSDN особенно там, где про флаг LLKHF_INJECTED.
  • MikeZ (25.02.12 11:14) [3]
    Eraser
    внимательно почитать MSDN особенно там, где про флаг LLKHF_INJECTED
    Да, то, что нужно, спасибо!

    Dimka Maslov
    Не вызывать keybd_event, а вмешиваться непосредственно в передачу сообщенийЧто имеется в виду? Вмешавшись, я могу фильтровать текущий ввод. А каким образом мне "отфильтровать" то, что было введено ранее и добавить своё? ))
  • Dimka Maslov © (25.02.12 16:36) [4]
    Мы знаем handle окна, к которому направлен ввод и хотим его подменить своим. При вызове CallNextHookEx мы можем подменить параметры сообщения на свои.
  • MikeZ (26.02.12 11:08) [5]
    Да, примерно так я и думал (это я о сути вопроса).
    Подменяя параметры, мы можем отфильтровать то, что в окно идёт сейчас. Но не сможем повлиять на то, что было набрано ранее. Например, то, что пользователь пишет не слово "художник", мы сможем понять только на 3-й букве (её запретить, да, сможем), а стереть, допустим, нам надо все три.
  • Dimka Maslov © (26.02.12 17:44) [6]

    > Но не сможем повлиять на то, что было набрано ранее


    Пользоваться WM_GETTEXT и WM_SETTEXT и прочими специфическими сообщениями EM_xxxx никто не запрещает (handle мы знаем)
  • MikeZ (27.02.12 00:22) [7]
    По-моему, это не будет универсально, т.к. контрол может и не отреагировать на эти сообщения. Как мне помнится, MS Word не реагировал на WM_COPY/PASTE.
  • Dimka Maslov © (27.02.12 07:43) [8]
    Ну на WM_CHAR он обязан отреагировать?
 
Конференция "WinAPI" » Keyboard hook и мой KeyBd_Event
Есть новые Нет новых   [134430   +4][b:0][p:0.001]