Autohotkey无法打开Windows 10列为后台进程的程序。

我使用AutoHotKey重新映射了我的NumLock键,以便它能够打开计算器,使用了以下脚本:
NUMLOCK::
IfWinExist Calculator
{
    WinActivate Calculator
}
else
{
    Run, % "calc"
    WinWait Calculator
    WinActivate
}

这个在Windows 7上运行得很好(尽管由于应用程序名称的更改,有一个不同的“运行”命令)。IfWinExist这一行检查计算器是否已经在运行。如果是,则激活它;如果不是,则启动它。这样可以防止在使用过程中没有关闭计算器而导致多个副本同时运行。
在Windows 10上,我注意到它只能间歇性地工作。在重新启动后第一次启动时,一切正常。然而,有时在关闭计算器应用程序时,它会将其保存在后台进程中,而不是真正退出。

enter image description here

当我激活脚本时,IfWinExist会将其识别为正在运行,并(表面上)激活它,但由于它是一个后台进程,没有可见效果。如果我打开任务管理器并终止该进程,正常功能会恢复(一段时间)。
有没有办法阻止Windows将计算器保留为后台进程,或者让AutoHotKey区分应用程序和后台进程?

我在Windows 10中也遇到了类似的AutoHotKey问题。我为我的妻子编写了一个基本脚本,用于切换她的触摸屏开关,一开始效果很好,但使用几次后就变得不稳定了。目前还没有找到原因,但在旧版本的Windows中,我从未遇到过这种问题。 - freginold
5个回答

我大部分时间不使用Windows 10。看起来你需要一种方法来检测它是否是一个后台进程,然后要么激活它(使其不再是后台进程),要么只是终止它并启动一个新的副本。
除非真正找出如何以“正确”的方式激活,否则你可以尝试使用WinActivate,然后跟上一个带有超时的WinWaitActive。如果设置了ErrorLevel,那么它没有正确激活(即后台进程),你可以杀死/重新启动它。
你还可以查看A_DetectHiddenWindows的当前设置,看看它是否开启 - 我猜它默认是关闭的。你可以尝试强制使用DetectHiddenWindows, On来观察行为是否有任何变化(猜测没有)。
你也可以尝试在IfWinExist返回true之后使用WinShow,即在使用WinActivate激活之前。我不确定Windows 10在幕后做了什么,但它可能只是一个隐藏的窗口存在于后台,如果是这样,你可以将其显示出来。你还可以找到一个叫做Spy++Spyxx的工具,它可以按线程、进程或窗口以树状视图显示所有窗口,这样你就可以看到它是否在作为后台进程运行时有隐藏的窗口存在。

这是我使用的东西。它不是最美丽的代码,但对于 Windows 10 上的计算器来说,它是100%可靠的,无论是后台进程还是否。根据我的工作流程,我喜欢将它标记为AlwaysOnTop;如果你不想要它,只需将其移除。

CalcOnTop = 0
;[Win+C] Calculator
*#c::
IfWinExist Calculator
{
    WinActivate Calculator
    WinWaitActive, Calculator, , 1
    if ErrorLevel
    {
        Process,WaitClose,calculator.exe,1
        CalcOnTop = 0
        Run calc.exe
        WinWait, Calculator, , 3
        if ErrorLevel
        {
            MsgBox, Error:  WinWait timed out. (3 seconds)
            return 
        }
        else
        {
            WinActivate Calculator
            Sleep 25
            WinSet, AlwaysOnTop, On, Calculator
            CalcOnTop = 1
            return
        }
        }
    if (CalcOnTop = 1)
        return
    else
    {
        WinSet, AlwaysOnTop, On, Calculator
        CalcOnTop = 1
        return
    }
}
else
{
    CalcOnTop = 0
    Run calc.exe
    WinWait, Calculator, , 3
    if ErrorLevel
    {
        MsgBox, Error:  WinWait timed out. (3 seconds)
        return 
    }
    else
    {
        WinActivate Calculator
        Sleep 25
        WinSet, AlwaysOnTop, On, Calculator
        CalcOnTop = 1
        return
    }
}

在设置中,Calc出现在“隐私”>“后台应用程序”中。
取消勾选允许其作为后台进程运行的框后,您应该能够运行它:
按下Win+R,输入calc 然后按F4关闭它。
一旦您这样做了,从那时起,以下脚本可以正常地打开/关闭:
SetNumLockState, AlwaysOn


NumLock::
    IfWinExist, Calculator
        {
        IfWinActive, Calculator
            {
            WinClose, Calculator
            }
        else
            {
            WinActivate, Calculator
            }
        }
    else
        {
        Run calc
        WinActivate, Calculator
        }
    return

我认为这个问题会帮助你解决你的问题。看起来它作为后台进程运行的原因是为了更新。你可以按照另一个问题建议的方法,通过转到开始 -> 设置 -> 隐私 -> 后台应用来禁用它。

1那个其他问题有帮助,但最终并不有效,因为计算器没有包含在“后台应用程序”选项中,并且除了“使用其他程序”之外,他们没有其他建议。 - techturtle
我的另一个想法是以某种方式使用AutoHotkey。当计算器打开时,它会移到任务管理器的应用程序部分,对吗?也许你可以修改你的脚本,先结束计算器的后台进程,然后重新打开它。不确定AutoHotkey是否能够区分后台进程和活动应用程序。 - Tim G.
此外,我的计算器包含在后台应用程序部分中。我可以切换它的开关。 - Tim G.
1这个后台进程的东西都乱七八糟的。在我家里的主要台式机上,它几乎总是在后台运行。而在我的笔记本电脑上,它很少在后台运行,但是它有一个“后台应用程序”部分,而我的其他电脑都没有。我以为可能是Win10周年更新的原因,因为笔记本电脑有它,而台式机没有,但是我刚刚升级了台式机,它还是没有得到。 - techturtle
就使用AHK来检查后台进程是否正在运行而言,这是我希望有人能在这里告诉我的选项之一。我一直无法找到区分后台或非后台的方法。我可能只需关闭它找到的任何计算器窗口,然后打开一个新的,但我不愿意这样做,因为首先,如果我经常使用计算器,我可能希望保留值,其次,关闭它可能只会将其推到后台,最终并不能解决问题。 - techturtle
1几个Windows更新之后,我的两台电脑的背景应用中出现了计算器选项。不幸的是,尽管设置了这个选项,该进程仍然出现在任务管理器的后台进程部分,因此似乎只有找到区分活动进程和后台进程的方法才能解决这个问题。至今为止,在这方面我还没有什么好运气... - techturtle

这对我来说很有效。唯一的问题是你需要记住使用键盘快捷键关闭计算器,而不是用鼠标点击(我习惯于在浏览器中使用Ctrl+Shift+W)。但是WinClose似乎可以防止计算器作为后台进程继续运行。
#IfWinNotExist Calculator
    NumLock::Run, Calc.exe
#IfWinNotExist

#IfWinExist, Calculator
    NumLock::WinActivate
#IfWinExist

#IfWinActive, Calculator
    ^+w::WinClose
#IfWinActive

如果你真的想保持用鼠标点击关闭窗口的选项,我想你可以设置一些东西,在活动窗口(当活动窗口是计算器时)的特定区域检测到点击时也执行WinClose。