Мое приложение не распознает нажатия клавиш, отправленные с помощью SendKeys или SendInput, но распознает с клавиатуры.

У меня есть домашнее приложение (Master), в котором определено множество горячих клавиш. Мне нужно автоматизировать приложение с помощью другого внешнего приложения (Control). Я не могу пересобрать приложение Master, оно работает, уже установлено и с ним нельзя работать.

Использование горячих клавиш на Master работает как шарм, если я использую клавиатуру.

Итак, я полагаю, что использую SendKeys.SendWait или SendKeys.Send для отправки команд. Хотя мой код отлично работает с другими приложениями (такими как Блокнот), он не работает с моим пользовательским приложением Master. Это может быть по ряду причин - Master старше, имеет смешанный .NET, C++... некоторые низкоуровневые элементы управления видео... кто знает, что там под обложками.

Мне нужно получить что-то более высокого уровня. Мне нужно иметь возможность отправлять нажатия клавиш, как если бы они исходили от самой клавиатуры. Я не хочу, чтобы компьютер мог различать физическую клавиатуру, отправляющую ключи, и мое приложение, отправляющее ключи.

Что я могу использовать и чем это будет отличаться?


person Jason    schedule 10.09.2011    source источник
comment
Я не знаю, решит ли это вашу проблему, но у меня это никогда не подводило: AutoIt   -  person Marco    schedule 10.09.2011
comment
@Марко. Спасибо за совет. На самом деле мы собираемся попробовать использовать AutoHotKey завтра, хотя я действительно хочу понять, в чем проблема.   -  person Jason    schedule 10.09.2011
comment
Вы на Висте? Класс SendKeys был обновлен для .NET Framework 3.0, что позволяет использовать его в приложениях, работающих в Windows Vista. Повышенная безопасность Windows Vista (известная как контроль учетных записей или UAC) не позволяет предыдущей реализации работать должным образом.   -  person Steve Wellens    schedule 10.09.2011
comment
Это WinXP, и мы используем .NET 3.5. Опять же, мы можем управлять другими приложениями на машине, но не этим.   -  person Jason    schedule 10.09.2011


Ответы (1)


Проблема была не в SendKeys.

Я пробовал SendKeys.Send, SendKeys.SendWait, SendInput и keybd_event.

Позже я понял, что время между активацией приложения и временем отправки нажатий клавиш было слишком коротким. Я ждал 200 мс, но просто увеличив это значение до 500 мс, я решил свою проблему.

Приложение долго рисовалось из-за встроенных видеоплееров. Предоставление ему еще 300 мс позволило ему быть готовым к нажатиям клавиш, которые я ему отправлял.

person Jason    schedule 11.09.2011
comment
FWIW, у вас все еще есть состояние гонки. - person John Pick; 11.09.2011
comment
Согласованный. Это проведет нас через выставку, которая начнется через 12 часов, но в конечном итоге мы интегрируем ее в само приложение. - person Jason; 11.09.2011
comment
Используйте Process.WaitForInputIdle() - person Hans Passant; 11.09.2011