Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2015.10.25;
Скачать: CL | DM;

Вниз

Ввод с клавиатуры в неактивное окно   Найти похожие ветки 

 
StriderMan ©   (2010-05-13 13:49) [0]

Вопрос чуть ли не философский, судя по гуглу и RSDN. Тем не менее, вдруг кто успешно решил эту задачу?

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

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

Работает вариант с WM_KEYDOWN, но тут проблема как найти хэндл контрола, имеющего фокус? у неактивного окна фокус винда не возвращает, а ведь где-то это фокус хранится. Если мы окно активируем - фокус-то оказывается там где мы его оставили


 
Leonid Troyanovsky ©   (2010-05-13 18:20) [1]


> StriderMan ©   (13.05.10 13:49)  

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

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

--
Regards, LVT.


 
Германн ©   (2010-05-14 02:18) [2]


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

Скорее это не философский вопрос, а задача X.


 
Tirael   (2010-05-16 00:56) [3]

а причем вообще фокус? или ты хочешь вводить в то окно которое ктото когдато оставил в фокусе до переключение на другое приложение?

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


 
Дмитрий С ©   (2010-05-17 06:56) [4]

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


 
StriderMan ©   (2010-05-17 11:58) [5]


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

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


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

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

Я немного не раскрыл карты, вобщем ввод ведется в неактивный десктоп. Как показывает исследование в неактивном десктопе нет активного окна в принципе. GetForegroundWindow возвращает 0. Функции SendInput и keybd_event также не работают.
Глобально задача сводится к изучению возможности создания собственного терминального клиента на штатных виндовых десктопах и workstation"ах. Штатный RDP не подходит по ряду причин.


 
Игорь Шевченко ©   (2010-05-17 14:06) [6]


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


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


 
Leonid Troyanovsky ©   (2010-05-17 14:11) [7]


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

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

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

--
Regards, LVT.


 
StriderMan ©   (2010-05-17 14:12) [8]


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

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

Разработка пока на этапе исследовательской работы, которая пока дает отрицательный результат


 
StriderMan ©   (2010-05-17 14:17) [9]


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

Это так, неактивные десктопы не принимают клавиатурный ввод хотя бы потому что в них нет активного окна. Вместе с тем сообщения MW_KEYDOWN неактивные окна отрабатывают нормально


 
Leonid Troyanovsky ©   (2010-05-17 14:23) [10]


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

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

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

--
Regards, LVT.


 
Leonid Troyanovsky ©   (2010-05-17 14:36) [11]


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

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

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

--
Regards, LVT.


 
StriderMan ©   (2010-05-17 14:55) [12]


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

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

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

С Notepad"ом кстати не заработал и WM_KEYDOWN, а вот в TEdit на делфишной неактивной формочке прекрасно схватывает.


 
Leonid Troyanovsky ©   (2010-05-17 15:12) [13]


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

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

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

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

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

--
Regards, LVT.


 
Игорь Шевченко ©   (2010-05-17 15:20) [14]


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


Рихтер про "некие механизмы" довольно занимательно пишет. Читать рекомендуется.


 
StriderMan ©   (2010-05-17 15:24) [15]


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

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


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

Да, надо бы освежить. Давно с окнами в чистом виде работать не приходилось, хватало делфишной абстракции


 
Leonid Troyanovsky ©   (2010-05-17 18:54) [16]


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

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

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

--
Regards, LVT.



Страницы: 1 вся ветка

Текущий архив: 2015.10.25;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.005 c
2-1401178558
Кирилов М.Л.
2014-05-27 12:15
2015.10.25
Импорт таблицы OpenOffice в StringGrid


15-1426195804
Юрий
2015-03-13 00:30
2015.10.25
С днем рождения ! 13 марта 2015 пятница


15-1425936604
Юрий
2015-03-10 00:30
2015.10.25
С днем рождения ! 10 марта 2015 вторник


15-1426455005
Юрий
2015-03-16 00:30
2015.10.25
С днем рождения ! 16 марта 2015 понедельник


15-1426233656
Юрий Зотов
2015-03-13 11:00
2015.10.25
О почерке и очепятках