-
Вопрос чуть ли не философский, судя по гуглу и RSDN. Тем не менее, вдруг кто успешно решил эту задачу?
Вобщем задача простая - передать в неактивное окно чужого приложения нажатия клавиш.
SendInput и keybd_event разумеется не подходят (окно не активное).
Работает вариант с WM_KEYDOWN, но тут проблема как найти хэндл контрола, имеющего фокус? у неактивного окна фокус винда не возвращает, а ведь где-то это фокус хранится. Если мы окно активируем - фокус-то оказывается там где мы его оставили
-
> StriderMan © (13.05.10 13:49)
> Вобщем задача простая - передать в неактивное окно чужого > приложения нажатия клавиш.
В общем случае у этой задачи нет решения.
-- Regards, LVT.
-
> Вопрос чуть ли не философский
Скорее это не философский вопрос, а задача X.
-
а причем вообще фокус? или ты хочешь вводить в то окно которое ктото когдато оставил в фокусе до переключение на другое приложение?
а если ты знаешь в какое именно окно, то иерархию окон то никто не отменял, через next, parent, child и т.п. до нужного же можно добраться
-
Можно поймать хендл, когда окно было активным.
-
> или ты хочешь вводить в то окно которое ктото когдато оставил в фокусе до переключение на другое приложение?а если ты знаешь в какое именно окно, то иерархию окон то никто не отменял, через next, parent, child и т.п. до нужного же можно добраться
В том и дело что я не знаю какое нужное. Знает форма чужого приложения, а на ее хэндл WM_KEYDOWN отправлять бесполезно - не понимает.
> Можно поймать хендл, когда окно было активным.
Как вариант, но окно могло и не быть активным в принципе.
Я немного не раскрыл карты, вобщем ввод ведется в неактивный десктоп. Как показывает исследование в неактивном десктопе нет активного окна в принципе. GetForegroundWindow возвращает 0. Функции SendInput и keybd_event также не работают. Глобально задача сводится к изучению возможности создания собственного терминального клиента на штатных виндовых десктопах и workstation'ах. Штатный RDP не подходит по ряду причин.
-
> Я немного не раскрыл карты, вобщем ввод ведется в неактивный > десктоп
сообщения не передаются через границы desktop. окна тоже. Мне кажется, задача невыполнима или выполнима с таким геморроем, что проще отказаться
-
> Игорь Шевченко © (17.05.10 14:06) [6]
> сообщения не передаются через границы desktop. окна тоже.
И клавиатурный ввод не все десктопы обрабатывают, ЕМНИП.
-- Regards, LVT.
-
> сообщения не передаются через границы desktop. окна тоже. Мне кажется, задача невыполнима или выполнима с таким геморроем, что проще отказаться
в этом плане все решилось достаточно просто. в "том" десктопе крутится процесс, занимающийся вводом-выводом. С этим процессом связываемся по TCP
Разработка пока на этапе исследовательской работы, которая пока дает отрицательный результат
-
> И клавиатурный ввод не все десктопы обрабатывают, ЕМНИП.
Это так, неактивные десктопы не принимают клавиатурный ввод хотя бы потому что в них нет активного окна. Вместе с тем сообщения MW_KEYDOWN неактивные окна отрабатывают нормально
-
> StriderMan © (17.05.10 14:12) [8] > в этом плане все решилось достаточно просто. в "том" десктопе > крутится процесс, занимающийся вводом-выводом. С этим процессом > связываемся по TCP
Обычно делают так: сервис, который работает там, где им положено, и интерактивный клиент, котрый всовывается куда-ни-дь в стартап. И взаимодействие обычное: пайпы or TCP.
-- Regards, LVT.
-
> StriderMan © (17.05.10 14:17) [9]
> сообщения MW_KEYDOWN неактивные окна отрабатывают нормально
Нормально (т.е., как активное) обработать не могут, бо поток ввода получает другой (forеground) поток. Попробуй, например, посылать нективному EDIT by Notepad Ctrl+V.
-- Regards, LVT.
-
> Нормально (т.е., как активное) обработать не могут, бо поток > ввода получает другой (forеground) поток.Попробуй, например, > посылать нективному EDIT by Notepad Ctrl+V.
Вводом как я понимаю рулят некие механизмы винды, преобразующие события от драйвера в месаги активному окну? В первом приближении примерно так?
Соответственно ничего не мешает нам посылать месаги и неактивному окну, и оно их обязано получить. Другое дело что следуя своей внутренней логике это неактивное окно может месаги ине обработать.
С Notepad'ом кстати не заработал и WM_KEYDOWN, а вот в TEdit на делфишной неактивной формочке прекрасно схватывает.
-
> StriderMan © (17.05.10 14:55) [12]
> Вводом как я понимаю рулят некие механизмы винды, преобразующие > события от драйвера в месаги активному окну? В первом приближении > примерно так?
Где-то так. Но, TranslateMessage, который должен при удерживаемом Ctrl сгенерировать ^C в ответ на WM_KEYDOWN Ord('C'), в неактивном окне этого не сделает, бо очередь ввода - у другого потока и состояние клавиатуры у него свое.
> TEdit на делфишной неактивной формочке прекрасно схватывает
В этом случае - поток один, он же и foreground.
-- Regards, LVT.
-
> Вводом как я понимаю рулят некие механизмы винды, преобразующие > события от драйвера в месаги активному окну?
Рихтер про "некие механизмы" довольно занимательно пишет. Читать рекомендуется.
-
> > TEdit на делфишной неактивной формочке прекрасно схватываетВ > этом случае - поток один, он же и foreground.
Так я из другого приложения присылаю этой неактивной форме, а точнее ее дочернему окну TEdit
> Рихтер про "некие механизмы" довольно занимательно пишет
Да, надо бы освежить. Давно с окнами в чистом виде работать не приходилось, хватало делфишной абстракции
-
> StriderMan © (17.05.10 15:24) [15]
> Так я из другого приложения присылаю этой неактивной форме, > а точнее ее дочернему окну TEdit
Чего-то в лом проверять, а точно ли Ctrl-C? Т.е. PM WM_KEYDOWN vk_control, .. PM Ord('C'),..? Ну, или 'V'?
-- Regards, LVT.
|