在Matlab中启动.exe文件后以编程方式按enter键
在Matlab中,我可以启动外部的.exe文件,这些文件有时会弹出一个需要按下enter键的弹出窗口。例如:在Matlab中启动.exe文件后以编程方式按enter键,matlab,ui-automation,Matlab,Ui Automation,在Matlab中,我可以启动外部的.exe文件,这些文件有时会弹出一个需要按下enter键的弹出窗口。例如: system('C:\Program Files (x86)\WinZip\WINZIP32.EXE') 将启动Winzip,然后要使用它,您需要按enter键通过“立即购买”弹出窗口。 现在我的问题不是winzip,我只是举了一个例子(我还是使用winrar:) 在这种情况下,如何在Matlab中以编程方式按enter键?(我使用Win7) 可以使用事件侦听器来解决这个问题吗 编辑:
system('C:\Program Files (x86)\WinZip\WINZIP32.EXE')
将启动Winzip,然后要使用它,您需要按enter键通过“立即购买”弹出窗口。
现在我的问题不是winzip,我只是举了一个例子(我还是使用winrar:)
在这种情况下,如何在Matlab中以编程方式按enter键?(我使用Win7)
可以使用事件侦听器来解决这个问题吗
编辑:java.awt.Robot类确实可以在explorer上工作,但不能在任何具有弹出窗口且需要按下OK按钮的软件上工作。我不知道为什么这不管用。我给出了winzip示例,因为我假设每个人的机器上都安装了winzip/winrar。我拥有的实际软件与此不同,与问题无关 有一种方法可以使用Matlab中的Java,特别是
Java.awt.Robot
类。看
显然,有两种类型的程序,关于使用系统(“…”)
从Matlab调用时的工作方式:
WinRAR
(至少在我的Windows 7机器上)会发生这种情况资源管理器
(标准的Windows文件资源管理器)系统的字符串末尾添加&
。如前所述,这是一个很好的解决方案,它也可以在Windows中工作
因此,你将按照以下步骤进行:
robot = java.awt.Robot;
command = '"C:\Program Files (x86)\WinRAR\WinRAR"'; %// external program; full path
system([command ' &']); %// note: ' &' at the end
pause(5) %// allow some time for the external program to start
robot.keyPress (java.awt.event.KeyEvent.VK_ENTER); %// press "enter" key
robot.keyRelease (java.awt.event.KeyEvent.VK_ENTER); %// release "enter" key
如果应用程序仅在Windows平台上,则可以尝试使用.net
对象
对象的SendWait
方法允许向具有焦点的应用程序发送几乎任何键或键组合,包括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键来更改实际要按下的按钮),您可能需要在对SendKeys
的Matlab调用中引入一个暂停
不要先尝试,但不要忘记,您正在从另一个进程管理一个进程,而它们之间没有任何同步,因此,在您正确执行之前,所有这些都可能需要一些尝试和错误,至少对于复杂的序列(简单的序列应该很简单)
例如,在我上面的例子中,我使用ECO功能从外部硬盘运行所有数据,将其置于待机状态,因此当我调用“另存为…”对话框时,它需要时间显示,因为HDD必须唤醒。如果我没有引入暂停(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的完整列表,Python包可以等待任何对话框并自动单击按钮。但它只适用于本机和某些.NET应用程序。您可能在按下WPF按钮时遇到问题(可能QT按钮是可点击的-未选中),但在这种情况下,代码类似于app.DialogTitle.wait('ready')。set_focus();app.DialogTitle.type_key({ENTER}')
可能会有所帮助。您的案例非常简单,可能使用pywinauto的一些技巧就足够了。您的“带弹出窗口的应用程序”是64位还是32位
wait
和wait\u not
函数具有超时参数。但若您需要一个具有潜在无限循环等待弹出窗口的精确侦听器,那个么最好的方向是全局Windows挂钩(可以侦听鼠标和keybd事件,但不能侦听对话框打开)。我将尝试找到可以检测新窗口的原型。它使用UI自动化API事件处理程序。。。而且。。。行动。。。它需要IronPython。我仍然不知道如何使用标准CPython中的COM接口设置UI自动化处理程序
编辑(2019年1月):不久前在pywinauto中实现了新模块win32hooks
。用法示例如下:。有一个小型javascript实用程序,在Windows javascript解释器上模拟这样的击键
只需使用以下代码创建一个js文件:
var WshShell = WScript.CreateObject("WScript.Shell");
WshShell.SendKeys(WScript.Arguments(0));
然后在必要的超时后从Matlab调用它,如下所示:
system('c:\my\js\file\script.js {Enter}');
现在无法在这里测试,但我认为这应该可以…如果您需要在允许完全DOS重定向的上下文中运行仅控制台的程序,您可以创建一个名为CR.txt的文件,其中包含回车符,并使用“有趣的问题!您是否考虑过像和这样的自动化脚本语言。其思想是创建一个脚本来启动/控制您的程序(WinZip或其他),您可以从MATLAB运行该程序。其中一些语言甚至提供了嵌入功能,因此您可以使用COM或它们提供的任何包装器/互操作调用它们的API。。。这些脚本语言一直用于创建游戏机器人、表单填充ap