AHK脚本可激活Windows 10上的永远在线计算器

问题描述

如何使用AHK激活处于AlwaysOnTop模式的Windows10计算器应用程序
如果您在“计算器”处于“标准”模式下单击“保持在最前面”,它将变成这样

enter image description here

请注意,它没有标题
我用来激活已经打开的计算器的AHK脚本不再起作用

#c::
    if not WinExist("Calculator")
    {
        Run calc.exe
        WinWait Calculator
    }
    WinActivate Calculator

我尝试了How to get window handle by PID in autohotkey?中的提示
但是我没有得到有效的类ID,这是我的脚本,其中添加了一些调试功能

#c::
    DetectHiddenWindows,on

    Process,Exist,Calculator.exe
    cpid := ErrorLevel    
    WinGetClass,ClassID,ahk_pid %cpid%
    WinGetTitle,Title,ahk_pid %cpid%
    exist := WinExist("ahk_exe Calculator.exe")
    active := WinActive("ahk_exe Calculator.exe")
    MsgBox look for [%cpid%] [%Title%] [%ClassID%] [%exist%] [%active%] ; cpid is the only valid variable

    if not WinExist("Calculator")
    {
        Run calc.exe
        WinWait Calculator
    }

    WinActivate Calculator

解决方法

该窗口不是来自Calculator.exe,而是来自ApplicationFrameHost.exe
而且它将不是来自该可执行文件的唯一窗口。因此,我建议存储计算器窗口的hwnd,然后使用它。

#!c::
#c::
    Process,Exist,% "Calculator.exe"  ;see if a calculator exists
    if (!ErrorLevel)                    ;ErrorLevel was set to 0 (false) if doesnt exist
    {
        Run,% "calc.exe"
        WinWait,% "Calculator"         ;make sure this is correct for your language
        hwnd := WinExist()              ;use last found window
        return
    }
    else if (!hwnd || A_ThisHotkey ~= "!") ;set or update hwnd      
        hwnd := WinActive("A")
    else
        WinActivate,% "ahk_id " hwnd
return

因此有两个热键解决方案,另一个热键只是多余的,甚至不需要关闭并重新启动计算器并需要重新获取其hwnd即可。
首先,我们检查一个计算器是否存在,如果不存在,请启动它,等待它打开,存储其hwnd并返回。
有用的文档链接:Last found windowWinExist()

如果确实存在计算器,请检查是否存储了hwnd,或者是否曾经使用过替代热键 Win + Alt + C
如果您有一个打开的计算器,但是没有存储它的hwnd,则这样。您可以手动激活计算器窗口并存储其hwnd。
有用的文档链接:A_ThisHotkey和Regex匹配速记~=(检查是否在!中找到A_ThisHotkey)。

最后,如果不需要做任何特别的事情,仅使用基本的 Win + C 热键,只需激活计算器即可。

,

修改现有脚本(获取PID和ahk_class btw无需使其过于复杂)


#c::
    BlockInput,On
    DetectHiddenWindows,on

    if not WinExist("Calculator")
    {
        Run calc.exe
        WinWait Calculator
        
    }

    WinActivate Calculator
    Winset,Alwaysontop,A
    BlockInput,Off
    return