我使用 AutoHotKey 重新映射了我的 NumLock 键,以便它可以打开计算器,使用以下脚本:
NUMLOCK::
IfWinExist Calculator
{
WinActivate Calculator
}
else
{
Run, % "calc"
WinWait Calculator
WinActivate
}
这在 Windows 7 上运行良好(尽管由于应用程序名称更改,“运行”行有所不同)。该IfWinExist
行检查计算器是否已在运行。如果已运行,则激活它;如果没有运行,则启动它。这可以防止您在使用期间未关闭计算器的情况下运行多个计算器副本。
在 Windows 10 中,我注意到它只能间歇性地工作。重启后第一次启动它时,一切正常。但是,有时关闭计算器应用程序时,它会将其保存在后台进程中,而不是真正退出。
当我激活该脚本时,它IfWinExist
会发现它正在运行,并且(显然)会激活它,但由于它是一个后台进程,因此没有明显的效果。如果我打开任务管理器并终止该进程,则正常功能会恢复(一段时间)。
有什么方法可以防止 Windows 将计算器作为后台进程,或者让 AutoHotKey 区分应用程序和后台进程?
答案1
我大部分时间都不使用 Windows 10。看来你要么需要一种方法来检测它是后台进程,然后要么激活它(这样它就不再是后台进程),要么干脆终止它并启动一个新的副本。
除了实际弄清楚如何以“正确”的方式激活之外,您可以做的一件事就是执行一个,WinActivate
然后执行一个WinWaitActive
超时操作。如果设置了 ErrorLevel,则它没有正确激活(即后台进程),您可以终止/重新启动。
您还可以查看当前的设置A_DetectHiddenWindows
,看看它是否处于开启状态——我猜它没有开启,默认情况下是关闭的。您可以看看强制是否DetectHiddenWindows, On
会导致行为发生任何变化(猜测不会)。
WinShow
您还可以在返回 true之后IfWinExist
(即在使用 激活之前)尝试WinActivate
。我不确定 Windows 10 在后台执行什么,但它可能只是一个隐藏在后台的窗口,在这种情况下您可以显示它。您还可以找到一个名为Spy++
或Spyxx
的实用程序,它将按线程、进程或带有树形视图的窗口显示所有窗口,当它作为后台进程运行时,它将显示是否存在隐藏窗口。
答案2
这是我使用的。它不是最漂亮的代码,但对于 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
}
}
答案3
我认为这个问题会帮你解决问题。它作为后台进程运行的原因似乎是更新。你可以按照Start -> Settings -> Privacy -> Background apps
另一个问题的建议禁用它。
答案4
Calc 出现在“设置”>“隐私”>“后台应用程序”中。
取消选中允许它作为后台进程运行的框后,您应该能够运行它:
Win+R calc
然后用 杀死它F4。
一旦完成此操作,以下脚本就可以从那时起正常工作以进行打开/关闭:
SetNumLockState, AlwaysOn
NumLock::
IfWinExist, Calculator
{
IfWinActive, Calculator
{
WinClose, Calculator
}
else
{
WinActivate, Calculator
}
}
else
{
Run calc
WinActivate, Calculator
}
return