программно нажмите клавишу ввода после запуска .exe файла в Matlab

Также следует отметить, что начиная с Python 2.6 встроенная функция open () теперь является псевдонимом для функции io.open (). Было даже рассмотрено удаление встроенного open () в Python 3 и требование использования io.open, чтобы избежать случайных конфликтов пространства имен, возникающих в результате таких вещей, как «from blah import *». В Python 2.6+ вы можете написать (и также можете считать этот стиль хорошей практикой):

import io
filehandle = io.open(sys.argv[1], 'r')
23
задан Amro 17 January 2015 в 04:05
поделиться

2 ответа

Если вам нужно запустить консольную программу в контексте, который разрешает полное перенаправление DOS, вы можете создать файл, скажем, CR.txt, содержащий возврат каретки, и использовать '<' нотация для передачи значения в программу.

Это работает только в том случае, если вы можете указать, что весь ввод с клавиатуры может быть записан в файл. Это терпит неудачу, если входные данные должны варьироваться в зависимости от ответов.

Альтернативой является дублирование входного (и, возможно, выходного) потока (ов) для программы, а затем передача данных в программу и из нее. Это более надежно и может позволить динамические ответы на данные, но также, вероятно, потребует значительных усилий для внедрения пользователя робота в приложение.

Rog-O-Matic является примером большого приложения, полностью управляемого программой, которая контролирует вывод на экран и имитирует ввод с клавиатуры, чтобы играть в раннюю (1980-е) графическую приключенческую игру ASCII.

Другие ответы потребуются для приложений на основе графического интерфейса.

3
ответ дан Pekka 17 January 2015 в 04:05
поделиться

Если ваши приложения работают только на платформе Windows, вы можете попробовать использовать .net объекты.

Метод SendWait объектов SendKeys позволяет отправлять практически любую клавишу или комбинацию клавиш в приложение, которое имеет фокус, включая клавиши-модификаторы, такие как Alt , Shift , Ctrl и т. д.

Первое, что нужно сделать, это импортировать библиотеку .net, тогда полный синтаксис для отправки ключа ENTER будет:

NET.addAssembly('System.Windows.Forms');
System.Windows.Forms.SendKeys.SendWait('{ENTER}'); %// send the key "ENTER"

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

Небольшой пример с блокнотом

%% // import the .NET assembly and define helper function
NET.addAssembly('System.Windows.Forms');
sendkey = @(strkey) System.Windows.Forms.SendKeys.SendWait(strkey) ;

%% // prepare a few things to send to the notepad
str1 = 'Hello World' ;
str2 = 'OMG ... my notepad is alive' ;
file2save = [pwd '\SelfSaveTest.txt'] ;
if exist(file2save,'file')==2 ; delete(file2save) ; end %// this is just in case you run the test multiple times.

%% // go for it
%// write a few things, save the file then close it.
system('notepad &') ;   %// Start notepad, without matlab waiting for the return value
sendkey(str1)           %// send a full string to the notepad
sendkey('{ENTER}');     %// send the {ENTER} key
sendkey(str2)           %// send another full string to the notepad
sendkey('{! 3}');       %// note how you can REPEAT a key send instruction
sendkey('%(FA)');       %// Send key combination to open the "save as..." dialog
pause(1)                %// little pause to make sure your hard drive is ready before continuing
sendkey(file2save);     %// Send the name (full path) of the file to save to the dialog
sendkey('{ENTER}');     %// validate
pause(3)                %// just wait a bit so you can see you file is now saved (check the titlebar of the notepad)
sendkey('%(FX)');       %// Bye bye ... close the Notepad

Как объяснено в документации Microsoft , класс SendKeys может иногда иметь проблемы с синхронизацией, поэтому, если вы хотите сделать сложный манипуляциями (например, Tab несколько раз, чтобы изменить кнопку, которую вы действительно хотите нажать), вам может потребоваться ввести pause в вызовах Matlab для SendKeys.

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

Например, в моем случае выше я запускаю все свои данные с внешнего жесткого диска с функцией ECO, которая переводит их в режим ожидания, поэтому, когда я вызываю диалог «сохранить как ...», это требует времени для его отображения, потому что HDD должен проснуться. Если бы я не представил pause(1), иногда путь к файлу был бы неполным (первая часть пути была отправлена ​​до того, как диалог был в фокусе) .


Также не забывайте символ & при выполнении внешней программы. Все благодарности Луису Мендо за его освещение. (Я склонен забывать, насколько это важно, потому что я использую его по умолчанию. Я опускаю его только в том случае, если мне приходится специально ждать возвращаемого значения из программы, в противном случае я позволяю ему работать самостоятельно )


Специальные символы имеют специальный код. Вот некоторые из них:

Shift          +
Control (Ctrl)  ^
Alt            %

Tab            {TAB}
Backspace      {BACKSPACE}, {BS}, or {BKSP}
Validation     {ENTER} or ~ (a tilde)
Ins Or Insert  {INSERT} or {INS}
Delete         {DELETE} or {DEL}

Text Navigation {HOME} {END} {PGDN} {PGUP}
Arrow Keys      {UP} {RIGHT} {DOWN} {LEFT}

Escape          {ESC}
Function Keys   {F1} ... {F16}
Print Screen    {PRTSC}
Break           {BREAK}

Полный список от Microsoft можно найти здесь

13
ответ дан Community 17 January 2015 в 04:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: