-
Здравствуйте!
Пишу приложение, мониторящее ввод с клавиатуры пользователя в его программе. При определенных условиях надо вбивать в его (пользователя) поле ввода свои символы.
Для монитора ввода использую hook и получаю всё, что нужно. Когда требуется, вмешиваюсь в процесс набора и посылаю свою строку через keybd_event - строка вбивается как надо и куда надо.
Проблема: тот самый hook, зараза, перехватывает и мои keybd_event'ы и в своём "мониторе" получаю кашу из символов пользователя и "моих", посланных через keybd_event.
Вопрос: как мне заставить hook игнорировать мои keybd_event?
Я пытался решить этот вопрос, условно, флагом: когда он есть, хук просто игнорирует ввод (оставим за скобками, что при быстром наборе куда-то в середину может попасть символ-другой от пользователя). Однако, при отсылке длинной строки набор keybd_event'ов в моей программе выполняется быстрее, чем фактически возникают события от клавы, поэтому флаг снимается быстрее, чем нужно, и хук ловит хвост моей строки. Отключение/включение хука на время эквивалентно флагу.
Было бы хорошо, как вариант, как-то "пометить" символы моей строки, чтобы потом в хуке отличать "мой" ввод от ввода пользователя (типа какой-то бит в кодах, что получает хук). Но ничего подходящего я не нашел: в keybd_event такое не засунешь.
Остался вариант запомнить заранее те символы, что я буду посылать через keybd_event и, уже в осн. программе, получая что-то через хук, проверять и убирать их из этого массива. Но, по-моему, это будет не совсем красиво...
Буду благодарен за конструктивные советы.
-
> Вопрос: как мне заставить hook игнорировать мои keybd_event?
Не вызывать keybd_event, а вмешиваться непосредственно в передачу сообщений.
-
> [0] MikeZ (24.02.12 18:41)
> Вопрос: как мне заставить hook игнорировать мои keybd_event?
внимательно почитать MSDN особенно там, где про флаг LLKHF_INJECTED.
-
Eraser внимательно почитать MSDN особенно там, где про флаг LLKHF_INJECTED Да, то, что нужно, спасибо!
Dimka Maslov Не вызывать keybd_event, а вмешиваться непосредственно в передачу сообщенийЧто имеется в виду? Вмешавшись, я могу фильтровать текущий ввод. А каким образом мне "отфильтровать" то, что было введено ранее и добавить своё? ))
-
Мы знаем handle окна, к которому направлен ввод и хотим его подменить своим. При вызове CallNextHookEx мы можем подменить параметры сообщения на свои.
-
Да, примерно так я и думал (это я о сути вопроса). Подменяя параметры, мы можем отфильтровать то, что в окно идёт сейчас. Но не сможем повлиять на то, что было набрано ранее. Например, то, что пользователь пишет не слово "художник", мы сможем понять только на 3-й букве (её запретить, да, сможем), а стереть, допустим, нам надо все три.
-
> Но не сможем повлиять на то, что было набрано ранее
Пользоваться WM_GETTEXT и WM_SETTEXT и прочими специфическими сообщениями EM_xxxx никто не запрещает (handle мы знаем)
-
По-моему, это не будет универсально, т.к. контрол может и не отреагировать на эти сообщения. Как мне помнится, MS Word не реагировал на WM_COPY/PASTE.
-
Ну на WM_CHAR он обязан отреагировать?
|