|
Эмуляция нажатия клавиши для досовской программы
|
|||
---|---|---|---|
#18+
Нуждаюсь в помощи профессионалов. Имеется древняя досовская прога, сделанная в модном тогда «интерактивном режиме». Чтобы обернуть её в современный интерфейс, необходимо эмулировать нажатие кнопок клавиатуры для досовской проги. Тренировка на стандартном калькуляторе прошла успешно (в приведенном ниже коде закомментированные строки). handle и handleW (закомментированно) совпадают с тем, что пишется в Spy++ , т.е. досовской окно вроде как найдено правильно и сделано активным. Но оно никак не реагирует на SendKeys.SendWait. Даже не представляю куда копать. Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32.
Модератор: Учимся использовать тэги оформления кода - FAQ ... |
|||
:
Нравится:
Не нравится:
|
|||
18.08.2020, 12:17 |
|
Эмуляция нажатия клавиши для досовской программы
|
|||
---|---|---|---|
#18+
чет не совсем понятно, SendKeys ни как не настроен на полученный Handle, сообщения отправляются не в окно, которое вы нашли, а в окно в котором искали. на счет ввода в консоль, то у консоли есть 2 потока (условно) для ввода и вывода, возможно стоит получить поток ввода и передавать туда нужные данные. Либо через WM_KEYDOWN передавать события нажатия на кнопку в окно которое вы нашли по средствам API PostMessage, но делать это надо для найденного окна, а не для окна в котором вы икали ... |
|||
:
Нравится:
Не нравится:
|
|||
18.08.2020, 13:00 |
|
Эмуляция нажатия клавиши для досовской программы
|
|||
---|---|---|---|
#18+
Roman Mejtes, Насколько я понял пример из https://docs.microsoft.com/ru-ru/dotnet/framework/winforms/how-to-simulate-mouse-and-keyboard-events-in-code «настройка» SendKeys не требуется, так как команда посылается в активное окно (SetForegroundWindow(handle)), которое и определяется найденным handle-ом, что подтвержается успешной работой со стандартным калькулятором (см. закомментированные строки). А вот с потоками ввода и вывода можно подробнее как их получить? И пример с WM_KEYDOWN? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.08.2020, 13:45 |
|
Эмуляция нажатия клавиши для досовской программы
|
|||
---|---|---|---|
#18+
1man, в активное окно вашего приложения, а не чужого, активное окно, не равно текущему ... |
|||
:
Нравится:
Не нравится:
|
|||
18.08.2020, 14:10 |
|
Эмуляция нажатия клавиши для досовской программы
|
|||
---|---|---|---|
#18+
Roman Mejtes, Не понял, что такое текущее окно, но как явствует из примера по ссылке и это работает с калькулятором, (если раскомментировать строки), окно, в которое посылается SendKeys.SendWait определяется SetForegroundWindow. Разве не так? В моё приложение SendKeys.SendWait посылается, если не срабатывает SetForegroundWindow и активным остается моё окно, это я видел. Но сейчас активно досовское окно, как и в примере с калькулятором. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.08.2020, 14:50 |
|
Эмуляция нажатия клавиши для досовской программы
|
|||
---|---|---|---|
#18+
Roman Mejtes на счет ввода в консоль, то у консоли есть 2 потока (условно) для ввода и вывода, возможно стоит получить поток ввода и передавать туда нужные данные. Может не работать: некоторые дос-программы (особенно "интерактивные", написанные на TurboVision, например), читают данные прямо с клавиатуры (через прерывания BIOS), а не из stdin ... |
|||
:
Нравится:
Не нравится:
|
|||
18.08.2020, 17:36 |
|
Эмуляция нажатия клавиши для досовской программы
|
|||
---|---|---|---|
#18+
1man Нуждаюсь в помощи профессионалов. Имеется древняя досовская прога, сделанная в модном тогда «интерактивном режиме». Это точно дос-программа, а не консольная? А то было когда-то обсуждение: 7071846 ... |
|||
:
Нравится:
Не нравится:
|
|||
18.08.2020, 17:39 |
|
Эмуляция нажатия клавиши для досовской программы
|
|||
---|---|---|---|
#18+
1man Нуждаюсь в помощи профессионалов. Я не профессионал, только учусь, попробовал разобраться в Вашей проблеме (кроме этого, я не спец в дотнет, совсем): 1. Нужно найти правильное окно: мне кажется, Process.Start, для получения MainWindowHandle, может использовать WaitForInputIdle, который не работает для консольных (и дос) приложений. Для проверки, самый простой способ - ввести небольшую задержку между созданием процесса и получением его окна. 2. Для поиска нужного окна я использовал EnumWindows, в процедуре обратного вызова через GetWindowThreadProcessId получал Id процесса для окна и сравнивал его с id созданного процесса - так я получал окно созданного процесса, ему уже можно слать wm_key* - и это работает! (для консольных и дос- приложений) Существенной проблемой я бы назвал определение момента, когда новый процесс создал окно ( я не заморачивался, просто ждал секунду). Удачи! ... |
|||
:
Нравится:
Не нравится:
|
|||
19.08.2020, 02:02 |
|
Эмуляция нажатия клавиши для досовской программы
|
|||
---|---|---|---|
#18+
x1ca4064 Существенной проблемой я бы назвал Существенной проблемой я бы назвал то, что консольные окна не работают с оконными сообщениями (WM_KEYUP/WM_KEYDOWN etc), т.к. у консоли отсутствует message pump, а SendKeys именно посылают оконные сообщения. В таких случаях в input buffer консоли пишут ( WriteConsoleInput ) нужным образом сформированный INPUT_RECORD . Например, вот так: https://stackoverflow.com/questions/14510350/postmessage-not-working-with-console-window-whose-output-is-redirected-and-read ... |
|||
:
Нравится:
Не нравится:
|
|||
19.08.2020, 05:46 |
|
Эмуляция нажатия клавиши для досовской программы
|
|||
---|---|---|---|
#18+
1man Даже не представляю куда копать. Засунуть дос в virtualbox у них было какое-то sdk для таких вещей. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.08.2020, 05:53 |
|
Эмуляция нажатия клавиши для досовской программы
|
|||
---|---|---|---|
#18+
Сон Веры Павловны x1ca4064 Существенной проблемой я бы назвал Существенной проблемой я бы назвал то, что консольные окна не работают с оконными сообщениями (WM_KEYUP/WM_KEYDOWN etc), Проверяли? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.08.2020, 10:13 |
|
Эмуляция нажатия клавиши для досовской программы
|
|||
---|---|---|---|
#18+
x1ca4064, Благодарю за помощь! Полагаю, это таки DOS-приложение, виндов тогда еще никаких не было. Язык – фортран. Задержка между созданием процесса и получением его окна обеспечивается MessageBox.Show("Continue?"). Иначе, да, Вы правы – не работает, срабатывает условие if (handle == IntPtr.Zero). В том, что окно найдено правильно, я почти не сомневаюсь, т.к. handle = handleW = [тому, что пишет Spy++]. C wm_key – спасибо, буду разбираться. А нет ли примера под рукой? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.08.2020, 11:31 |
|
Эмуляция нажатия клавиши для досовской программы
|
|||
---|---|---|---|
#18+
1man, Пожалуй, следовало бы отметить, что при запуске из моей проги, досовская прога не выводит в своё окно никаких надписей (инструкций для интерактивного ввода числового материала). Но адекватно реагирует на нажатие кнопок реальной клавиатуры (запускает расчеты, записывает рез в файл), но всё вслепую, без отображения чего-либо в окне. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.08.2020, 11:55 |
|
Эмуляция нажатия клавиши для досовской программы
|
|||
---|---|---|---|
#18+
1man А нет ли примера под рукой? На C# нет, но их много на просторах сети. PostMessage(handle,WM_KEYDOWN,keycode,param); PostMessage(handle,WM_KEYUP,keycode,param or $C0000000); Для использования SetKeyboardState нужно будет сделать AttachThreadInput, может быть проблема с установкой SHIFT/CTRL, нужно проверять. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.08.2020, 13:41 |
|
|
start [/forum/topic.php?fid=20&msg=39990713&tid=1398488]: |
0ms |
get settings: |
11ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
33ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
56ms |
get tp. blocked users: |
2ms |
others: | 267ms |
total: | 405ms |
0 / 0 |