【发布时间】:2015-12-01 16:45:54
【问题描述】:
这是我的脚本的一部分。如果程序没有运行,它会通过热键运行程序,或者在其他情况下显示/隐藏它的窗口。
ConsolePath := "cmd.exe"
ConsoleWndClass := "ConsoleWindowClass"
CalculatorPath := "calc.exe"
CalculatorWndClass := "CalcFrame"
#s::
RunOrToggleActive(ConsolePath, ConsoleWndClass)
return
#c::
RunOrToggleActive(CalculatorPath, CalculatorWndClass)
return
RunOrToggleActive(path, wndClass) {
SplitPath, path, process
Process, Exist, %process%
If !ErrorLevel {
Run, %path%
}
else {
ToggleActive(wndClass)
}
}
ToggleActive(wndClass)
{
IfWinNotActive, % "ahk_class " wndClass
{
WinActivate, % "ahk_class " wndClass
}
else
{
WinMinimize, % "ahk_class " wndClass
}
}
工作正常,但这种方法的问题是添加新程序和热键非常费力。必须添加 2 个变量,复制热键处理程序代码,替换热键,替换变量。如果我想为每个程序添加新的热键功能(例如 !#s 和 !#c 以运行另一个程序实例,即使它已经在运行)我将不得不再次重复新代码。我的实际脚本有 7 个程序,很难编辑。
我希望它像这样工作(半伪代码):
appDescs := Object()
appDescs.Insert(new ProgramDesc("cmd.exe", "ConsoleWindowClass", "s"))
appDescs.Insert(new ProgramDesc("calc.exe", "CalcFrame", "c"))
#"some key"{
find key in appDescs array and RunOrToggleActive(for correspondig program)
}
!#"some key"{
find key in appDescs array and RunNewInstance(for correspondig program)
}
RunOrToggleActive(programDesc) {
...
}
RunNewInstance(programDesc) {
...
}
Class ProgramDesc {
__New(path, wndClass, key) {
this.path := path, this.wndClass := wndClass, this.key := key
}
}
我不知道如何实现#"some key"{ 行为。如果有人会根据上面的模式重写代码(或提出更好的模式),我将非常感激。
【问题讨论】:
标签: autohotkey keymapping