Конференция "WinAPI" » Ввод с клавиатуры в неактивное окно [D7, WinXP]
 
  • StriderMan © (13.05.10 13:49) [0]
    Вопрос чуть ли не философский, судя по гуглу и RSDN. Тем не менее, вдруг кто успешно решил эту задачу?

    Вобщем задача простая - передать в неактивное окно чужого приложения нажатия клавиш.

    SendInput и keybd_event разумеется не подходят (окно не активное).

    Работает вариант с WM_KEYDOWN, но тут проблема как найти хэндл контрола, имеющего фокус? у неактивного окна фокус винда не возвращает, а ведь где-то это фокус хранится. Если мы окно активируем - фокус-то оказывается там где мы его оставили
  • Leonid Troyanovsky © (13.05.10 18:20) [1]

    > StriderMan ©   (13.05.10 13:49)  

    > Вобщем задача простая - передать в неактивное окно чужого
    > приложения нажатия клавиш.

    В общем случае у этой задачи нет решения.

    --
    Regards, LVT.
  • Германн © (14.05.10 02:18) [2]

    > Вопрос чуть ли не философский

    Скорее это не философский вопрос, а задача X.
  • Tirael (16.05.10 00:56) [3]
    а причем вообще фокус? или ты хочешь вводить в то окно которое ктото когдато оставил в фокусе до переключение на другое приложение?

    а если ты знаешь в какое именно окно, то иерархию окон то никто не отменял, через next, parent, child и т.п. до нужного же можно добраться
  • Дмитрий С © (17.05.10 06:56) [4]
    Можно поймать хендл, когда окно было активным.
  • StriderMan © (17.05.10 11:58) [5]

    > или ты хочешь вводить в то окно которое ктото когдато оставил в фокусе до переключение на другое приложение?а если ты знаешь в какое именно окно, то иерархию окон то никто не отменял, через next, parent, child и т.п. до нужного же можно добраться

    В том и дело что я не знаю какое нужное. Знает форма чужого приложения, а на ее хэндл WM_KEYDOWN отправлять бесполезно - не понимает.


    > Можно поймать хендл, когда окно было активным.

    Как вариант, но окно могло и не быть активным в принципе.

    Я немного не раскрыл карты, вобщем ввод ведется в неактивный десктоп. Как показывает исследование в неактивном десктопе нет активного окна в принципе. GetForegroundWindow возвращает 0. Функции SendInput и keybd_event также не работают.
    Глобально задача сводится к изучению возможности создания собственного терминального клиента на штатных виндовых десктопах и workstation'ах. Штатный RDP не подходит по ряду причин.
  • Игорь Шевченко © (17.05.10 14:06) [6]

    > Я немного не раскрыл карты, вобщем ввод ведется в неактивный
    > десктоп


    сообщения не передаются через границы desktop. окна тоже. Мне кажется, задача невыполнима или выполнима с таким геморроем, что проще отказаться
  • Leonid Troyanovsky © (17.05.10 14:11) [7]

    > Игорь Шевченко ©   (17.05.10 14:06) [6]

    > сообщения не передаются через границы desktop. окна тоже.

    И клавиатурный ввод не все десктопы обрабатывают, ЕМНИП.

    --
    Regards, LVT.
  • StriderMan © (17.05.10 14:12) [8]

    > сообщения не передаются через границы desktop. окна тоже.
    Мне кажется, задача невыполнима или выполнима с таким геморроем, что проще отказаться

    в этом плане все решилось достаточно просто. в "том" десктопе крутится процесс, занимающийся вводом-выводом. С этим процессом связываемся по TCP

    Разработка пока на этапе исследовательской работы, которая пока дает отрицательный результат
  • StriderMan © (17.05.10 14:17) [9]

    > И клавиатурный ввод не все десктопы обрабатывают, ЕМНИП.

    Это так, неактивные десктопы не принимают клавиатурный ввод хотя бы потому что в них нет активного окна. Вместе с тем сообщения MW_KEYDOWN неактивные окна отрабатывают нормально
  • Leonid Troyanovsky © (17.05.10 14:23) [10]

    > StriderMan ©   (17.05.10 14:12) [8]

    > в этом плане все решилось достаточно просто. в "том" десктопе
    > крутится процесс, занимающийся вводом-выводом. С этим процессом
    > связываемся по TCP

    Обычно делают так: сервис, который работает там, где им положено,
    и интерактивный клиент, котрый всовывается куда-ни-дь в стартап.
    И взаимодействие обычное: пайпы or TCP.

    --
    Regards, LVT.
  • Leonid Troyanovsky © (17.05.10 14:36) [11]

    > StriderMan ©   (17.05.10 14:17) [9]

    > сообщения MW_KEYDOWN неактивные окна отрабатывают нормально

    Нормально (т.е., как активное) обработать не могут, бо поток ввода
    получает другой (forеground) поток.
    Попробуй, например, посылать нективному EDIT by Notepad Ctrl+V.

    --
    Regards, LVT.
  • StriderMan © (17.05.10 14:55) [12]

    > Нормально (т.е., как активное) обработать не могут, бо поток
    > ввода получает другой (forеground) поток.Попробуй, например,
    >  посылать нективному EDIT by Notepad Ctrl+V.

    Вводом как я понимаю рулят некие механизмы винды, преобразующие события от драйвера в месаги активному окну? В первом приближении примерно так?

    Соответственно ничего не мешает нам посылать месаги и неактивному окну, и оно их обязано получить. Другое дело что следуя своей внутренней логике это неактивное окно может месаги ине обработать.

    С Notepad'ом кстати не заработал и WM_KEYDOWN, а вот в TEdit на делфишной неактивной формочке прекрасно схватывает.
  • Leonid Troyanovsky © (17.05.10 15:12) [13]

    > StriderMan ©   (17.05.10 14:55) [12]

    > Вводом как я понимаю рулят некие механизмы винды, преобразующие
    > события от драйвера в месаги активному окну? В первом приближении
    > примерно так?

    Где-то так. Но, TranslateMessage, который должен при удерживаемом
    Ctrl сгенерировать ^C в ответ на WM_KEYDOWN Ord('C'), в неактивном
    окне этого не сделает, бо очередь ввода - у другого потока
    и состояние клавиатуры у него свое.

    > TEdit на делфишной неактивной формочке прекрасно схватывает

    В этом случае - поток один, он же и foreground.

    --
    Regards, LVT.
  • Игорь Шевченко © (17.05.10 15:20) [14]

    > Вводом как я понимаю рулят некие механизмы винды, преобразующие
    > события от драйвера в месаги активному окну?


    Рихтер про "некие механизмы" довольно занимательно пишет. Читать рекомендуется.
  • StriderMan © (17.05.10 15:24) [15]

    > > TEdit на делфишной неактивной формочке прекрасно схватываетВ
    > этом случае - поток один, он же и foreground.

    Так я из другого приложения присылаю этой неактивной форме, а точнее ее дочернему окну TEdit


    > Рихтер про "некие механизмы" довольно занимательно пишет

    Да, надо бы освежить. Давно с окнами в чистом виде работать не приходилось, хватало делфишной абстракции
  • Leonid Troyanovsky © (17.05.10 18:54) [16]

    > StriderMan ©   (17.05.10 15:24) [15]

    > Так я из другого приложения присылаю этой неактивной форме,
    >  а точнее ее дочернему окну TEdit

    Чего-то в лом проверять, а точно ли Ctrl-C?
    Т.е. PM WM_KEYDOWN vk_control, .. PM Ord('C'),..?
    Ну, или 'V'?

    --
    Regards, LVT.
 
Конференция "WinAPI" » Ввод с клавиатуры в неактивное окно [D7, WinXP]
Есть новые Нет новых   [134431   +14][b:0][p:0.001]