Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2015.10.25;
Скачать: [xml.tar.bz2];

Вниз

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

 
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 вся ветка

Форум: "WinAPI";
Текущий архив: 2015.10.25;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.002 c
15-1425850257
картман
2015-03-09 00:30
2015.10.25
wifi


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


2-1401178558
Кирилов М.Л.
2014-05-27 12:15
2015.10.25
Импорт таблицы OpenOffice в StringGrid


15-1426491623
patrick1968
2015-03-16 10:40
2015.10.25
Не работает команда


15-1425895679
Kerk
2015-03-09 13:07
2015.10.25
Книги даром (СПб)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский