вопрос про keyb_event

Тема в разделе "WASM.BEGINNERS", создана пользователем fighter4fun, 8 окт 2010.

  1. fighter4fun

    fighter4fun New Member

    Публикаций:
    0
    Регистрация:
    8 окт 2010
    Сообщения:
    5
    Хочу попробовать сделать так чтобы можно было посылать сообщения вроде WM_Keydown окну в котором нет фокуса клавиатуры через keyb_event.

    Я так понимаю, что если такое вообще возможно, то на уровне ядра. Кто что посоветует?
     
  2. fighter4fun

    fighter4fun New Member

    Публикаций:
    0
    Регистрация:
    8 окт 2010
    Сообщения:
    5
    Я так понял, что keyb_event вызывает SendInput, а потом уходит в NtUserSendInput в r0. После чего где-то там (может в обработчике прерываний драйвера клавы) генерируется сообщение WM_KEYDOWN и как-то передается обратно в r3 окну с keyboard focus.

    Задача состоит в том чтобы как-то перехватить WM_KEYDOWN и перенаправить это сообщение в нужное окно, а не на окно с фокусом клавы.
     
  3. baldr

    baldr New Member

    Публикаций:
    0
    Регистрация:
    29 апр 2010
    Сообщения:
    327
    fighter4fun,

    А чем SendMessage() не мил? keybd_event() отрабатывает так же, как если бы клавиша была в самом деле нажата. Т.е. WM_KEYDOWN и проч. получит фокальное окно. В общем-то, в этом и состоит идея этой функции.
     
  4. fighter4fun

    fighter4fun New Member

    Публикаций:
    0
    Регистрация:
    8 окт 2010
    Сообщения:
    5
    Ну так уж получилось, что нужна именно keybd_event(). Хочется понять на каком этапе эта функция узнает окно в фокусе, где генерируется WM_KEYDOWN и как передается окну в фокусе. После чего перехватить ее на нужном этапе и подменить окно, в которое придет WM_KEYDOWN.
     
  5. baldr

    baldr New Member

    Публикаций:
    0
    Регистрация:
    29 апр 2010
    Сообщения:
    327
    fighter4fun,

    keybd_event() из User32.DLL сама практически ничего не делает: она тупо заполняет структуру INPUT и вызывает сервис NtUserSendInput() из Win32K.Sys, который (по идее) просто запихнёт событие в очередь RIT. В принципе отловить можно и в RIT, но как-то это замудрёно получается. Типа отправить телеграмму не по адресу, перехватить её при сортировке на почте и изменить адресата на нужного. :derisive:

    Если SendMessage() не годится, можно попробовать установить фокус куда надо, а после keybd_event() вернуть всё назад.
     
  6. fighter4fun

    fighter4fun New Member

    Публикаций:
    0
    Регистрация:
    8 окт 2010
    Сообщения:
    5
    Ну вот я так понял, что RIT направляет нажатие клавиши в thread's input queue той thread, к которой в данный момент подключена RIT. А подключена RIT к той thread, окно которой находится в фокусе.

    Значит как-то нужно внедрить некий фильтр в RIT, который будет отлавливать созданный моим keybd_event() INPUT, на мгновенье переподключаться к thread нужного окна, отправлять туда INPUT и подключаться обратно к предыдущей thread.

    Получиться что-то вроде попробовать установить фокус куда надо, а после keybd_event() вернуть всё назад., только четко без каких-либо конфликтов с отправкой обычного INPUT не туда и перересовкой окон.

    Только как внедриться в RIT (csrss.exe)?
     
  7. baldr

    baldr New Member

    Публикаций:
    0
    Регистрация:
    29 апр 2010
    Сообщения:
    327
    fighter4fun,

    Насчёт RIT вряд ли что подскажу, я в ядро без особой нужды — ни ногой. :derisive:

    Есть ли разумное объяснения привязки к keybd_event()? Я не пытаюсь отговорить, скорее хочу понять: может, я что-то упускаю?
     
  8. fighter4fun

    fighter4fun New Member

    Публикаций:
    0
    Регистрация:
    8 окт 2010
    Сообщения:
    5
    Ну SendMessage и PostMessage мне не подходят, потому что программа, которой я пытаюсь отправлять нажатия клавиш, на них не реагирует. У нее в оконной процедуре в принципе нету кода, который обрабатывает WM_KEYDOWN/KEYUP. А вот keyb_event работает почему-то. Понять почему тоже пока не могу, ибо keyb_event по идее в конечном итоге тоже работает через закидывание сообщения WM_KEYDOWN/KEYUP в очередь сообщений потока и последующей обработке в оконной процедуре. Мистика какая-то.
     
  9. bizdon

    bizdon Member

    Публикаций:
    0
    Регистрация:
    7 апр 2009
    Сообщения:
    86
    вот здесь есть программа, которая отсылает сообщения неактивному окну из юзермода..
    http://www.manhunter.ru/releases/60_flying_windows_1_6.html
     
  10. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    fighter4fun Вместо обработки WM_KEYDOWN/KEYUP может использоваться GetAsyncKeyState, GetKeyboardState и т.п.
    А чем последовательность GetFocus - SetFocus - keyb_event - SetFocus не подходит?