【问题标题】:AppActivate window focusAppActivate 窗口焦点
【发布时间】:2014-08-06 12:16:43
【问题描述】:

我一直在网上搜索有关如何在 AppActive 中获得窗口焦点的解决方案,但找不到我需要的东西,或者至少无法理解。简而言之,我的代码在 SAP 系统中进行更改,然后保存,然后通过默认打印机生成 pdf。 “另存为”弹出窗口随机出现,我通过 AppActive 找到并通过发送密钥继续保存。

现在通常弹出窗口总是在顶部,这没有问题,但是,它很少出现并且没有焦点,而是在任务栏中闪烁。然后代码找到它并继续放置文件名。由于它没有焦点,因此它会将名称放在焦点所在的位置(通常是 SAP)。

如何确保窗口始终处于焦点位置?我对编码很陌生,所以我喜欢简单的解决方案:)。

Set WScr = CreateObject("WScript.Shell")            
    Do          
        WScript.Sleep 50        
    Loop Until WScr.AppActivate("Save PDF File As") ' loops until save as popup appears
    WScript.Sleep 1000                                  
    FileName = filepath & order(i) & ".pdf"             
    WScr.SendKeys FileName          
    WScript.Sleep 250           
    WScr.SendKeys "{ENTER}"         
    WScr.SendKeys "{TAB}" ' in case same name exists, overwrite question tab chooses yes            
    WScr.SendKeys "{ENTER}" ' press yes
    WScript.Sleep 500                   
Set WScr=Nothing

【问题讨论】:

    标签: vbscript window focus sap


    【解决方案1】:

    只需在每个发送键之前添加一个AppActivate,但不要循环。这是最好的也是唯一的选择。

    但为什么不直接从 VBS 控制 SAP。请参阅http://scn.sap.com/community/gui/blog/2012/10/08/introduction-to-sap-gui-scripting 并查找与objSAP.Alerts = False 类似的内容(取决于您收到对话框的原因)。

    还有为什么你会得到对话框?是因为文件已经存在吗?如果是这样删除它,没有对话框。

    现在我说它是最好的,只是你可以通过旋转一个 vb.net 帮助程序在 vbscript 中使用 API 调用。这链接到我写的关于如何做到这一点的两篇文章。如果您走这条路,请查看 GetActiveWindow API 调用(以及其他)How To run vb.net with vbs scheduled task

    尝试两件事

    Appactivate "Save PDF File As"
    WScr.SendKeys FileName          
    WScript.Sleep 250           
    Appactivate "Save PDF File As"
    WScr.SendKeys "{ENTER}"         
    Appactivate "Save PDF File As"
    WScr.SendKeys "{TAB}" ' in case same name exists, overwrite question tab chooses yes            
    Appactivate "Save PDF File As"
    WScr.SendKeys "{ENTER}" ' press yes
    WScript.Sleep 500                   
    

    第二个是将文件保存对话框标题替换为顶级窗口(它也是对话框的所有者窗口)标题 - 即主窗口标题。如果记事本的另存为对话框打开,请使用AppActivate "Untitled - Notepad"

    【讨论】:

    • 嗨,感谢您的回答,但是我无法使用 sendkeys 添加 appactive。然后命令无法识别并且没有任何反应。关于 SAP GUI,我已经直接在 SAP 中进行了调整。完成后,更改被保存,SAP 生成假脱机请求,然后发送到默认打印机。它启动 SAPLPD 传输程序以生成打印输出。要将带有订单名称的 pdf 文件保存到磁盘中,我需要在 SAP 中更改代码,甚至不确定我是否能做到。它也不适用于最终用户,它是更高端的解决方案。
    • 只是为了清楚。我有很多需要更改输入的订单,这些输入需要在 Excel 中输入。然后脚本进入系统,进行更改。如前所述,打印输出就像另一个应用程序启动一样,我无法在 SAP 中设置设置来为我做这件事(无论如何都不是最终用户)。这就是为什么当前的解决方案是检测另存为对话框并保存的原因。如果已完成打印输出并且以相同的顺序完成更多调整并再次打印,则可以存在相同的名称。您能详细说明一下我的案例的 getActiveWindow API 吗?我在一些cmet中看到过,但无法申请我的问题
    • 我们真的不知道为什么它还不能正常工作。它通常适用于大多数应用程序(除非您的击键错误?)。我已添加到我的答案中。
    • 非常感谢。我一开始就理解错了。我会做一些测试,如果我遇到同样的问题,请告诉你。我无法复制它,所以我需要尝试一段时间,看看它是否会再次发生。第二个解决方案看起来也很有趣。我会努力解决的。它看起来像更多的错误证明,因为我想如果有人使用本地语言设置它就无法工作,所以不会找到名称
    • 你好。即使在每个命令之前使用 appactivate,一些测试问题似乎仍然存在。问题似乎只在新启动和第一次打印输出后发生。其他同事的计算机也存在同样的问题,因此很可能打印机弹出窗口无法正常工作,而不是代码问题
    猜你喜欢
    • 2012-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-10
    • 1970-01-01
    相关资源
    最近更新 更多