[帮助]#inputlevel 但不覆盖组合键?
我有 2 个 ahk 脚本,都重新映射“k”,但脚本 1 有“scrolllock & k”
脚本1.ahk
k::msgbox script1
scrolllock & k::click
脚本2.ahk
k::msgbox script2
我想要的是:当同时运行两个脚本时,如果我按 k ,它将执行 script2.ahk (显示“msgbox script2”),
换句话说,脚本2覆盖脚本1
所以我把#inputlevel2 放在 script2.ahk 中
现在看起来像这样
脚本1.ahk
k::msgbox script1
scrolllock & k::click
脚本2.ahk
#inputlevel2
k::msgbox script2
但是现在如果我按“scrolllock & k”,它将不会执行单击(脚本 1 的功能),但它会显示 msgbox(脚本 2)我猜是因为“k”已被脚本 2 覆盖并且“scrolllock & k”不再被识别
我找到了一种让 scrolllock & k 工作的方法,当我重新加载 script1 并按下 scrolllock & k 时,它就会工作
但如果我重新加载脚本2,我将必须再次重新加载脚本1才能使该组合键起作用
换句话说,我的问题是是否可以将脚本2的“k”覆盖为脚本1的“k”,但仍然执行像脚本1的“scrolllock & k”这样的功能?
谢谢
答案1
不确定它是如何工作的#InputLevel
。
一种解决方案可能是使用通过#Include
语句加载的两个脚本中的公共函数调用。它必须检测脚本 2 是否正在运行,并且如果脚本 2 正在运行则不执行。
Script2 也必须让k
密钥传递到 Script1,这样scrolllock & k
才能在 Script1 中工作。
下面的代码是一个示例,未经测试——我相信有更优雅的方法来解决这个问题,但它可能会起作用或让你更接近答案。这也不是我编写的代码,而是一个示例想法。
; -----------------------
; Script1.ahk
; -----------------------
#Persistent
k::functionk(A_ScriptName)
scrollock & k::Click
#Include functionCalls.ahk
; -----------------------
; Script2.ahk
; -----------------------
#Persistent
Script2Running("Set", True) ; auto-execute when script2 starts
OnExit(Script2Exit)
return
~k::functionk(A_ScriptName) ; tilde should let k pass through to script1
Script2Exit()
{
Script2Running("Set",False)
}
#Include functionCalls.ahk
; -----------------------
; functionCalls.ahk
; -----------------------
functionk(callersScriptName)
{
if (callersScriptName="script1.ahk") and not script2Running()
{
msgbox script1
; add code as needed
}
else if (callersScriptName="script2.ahk")
{
msgbox script2
; add code as needed
}
else
msgbox Unrecognized script name: %callersScriptName%
}
Script2Running(SetOrRead := "", newState := false)
{
static running := false
if (SetOrRead="Set")
running := newState
return running ; same as 'return %running%', see help topic on return
}