在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) 可以使用事件侦听器来解决这个问题吗 编辑:

在Matlab中,我可以启动外部的.exe文件,这些文件有时会弹出一个需要按下enter键的弹出窗口。例如:

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调用时的工作方式:

  • 对于某些程序,Matlab会等到程序完成后再运行下一条语句。例如,
    WinRAR
    (至少在我的Windows 7机器上)会发生这种情况

  • 对于其他程序,这不会发生,而Matlab在外部程序启动后立即执行下一个语句。这种类型的示例是
    资源管理器
    (标准的Windows文件资源管理器)

  • 现在,即使对于类型1程序,也可以立即将执行返回到Matlab:只需在传递给
    系统的字符串末尾添加
    &
    。如前所述,这是一个很好的解决方案,它也可以在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