【发布时间】:2018-05-25 22:28:07
【问题描述】:
我尝试编写一个 ahk 脚本,它允许我将当前打开的窗口绑定到热键。 它的工作方式是,如果您按 ALTGR + , + 任何字符,则当前窗口的 ProcessPath 将被保存。
现在,使用 ALTGR + 选择的字符,如果它已经打开(激活),我要么切换到此窗口,要么为此进程运行 .exe 文件。
要删除热键,我使用 ALTGR + . + 相应的键。
所有热键都保存在 .ini 文件中,因此设置不会丢失。
一切正常.....但是 问题是:我必须为每个键复制代码(我编写了一个 python 脚本来为我复制它)。 有没有办法在ahk中设置动态热键?
这是我的代码:
iniFile := "winshortcut.ini"
运行某个进程或切换到已运行的窗口。该循环解决了可能发生的一些延迟问题。
RunOrActivate(key, Target)
{
SplitPath, Target, TargetNameOnly, , TargetEXE
Process, Exist, %TargetNameOnly%
If (ErrorLevel > 0){
WinActivate, ahk_pid %ErrorLevel%
} else {
if (Target != "ERROR") {
Run, %Target%
if (TargetEXE != "exe"){
WinGetTitle, x, A
if (x != TargetNameOnly){
Loop, 5 {
Sleep, 100
Run, %Target%
}
}
}
} else {
TrayTip AltGr+%key%, No binding, 2
}
}
}
这一行从 ini 文件中读取密钥的路径。我必须为每个键复制它:
IniRead, PATH_w, %iniFile%, savedKeys, w
IniRead, PATH_r, %iniFile%, savedKeys, r
...
此块处理用于保存、删除或更改单个键 (w) 进程的热键。这是复制和更改了 23 次:
; ############## w ##############
<^>!w::
if (GetKeyState(",")){
if (PATH_w != "ERROR") {
SplitPath, PATH_w, TITLE_w_old
}
WinGet PATH_w, ProcessPath, A
SplitPath, PATH_w, TITLE_w
if (TITLE_w == "Explorer.EXE"){
WinGetTitle, TITLE_w, A
for w in ComObjCreate("Shell.Application").Windows
if (TITLE_w = w.Document.Folder.Self.Name) {
PATH_w := % w.Document.Folder.Self.Path
}
}
IniWrite, %PATH_w%, %iniFile%, savedKeys, w
if (TITLE_w_old) {
if (TITLE_w_old != TITLE_w){
TrayTip Changing binding for AltGr+W, From %TITLE_w_old% to %TITLE_w%
} else {
TrayTip Binding for AltGr+W, %TITLE_w%
}
} else{
TrayTip New binding for AltGr+W, %TITLE_w%
}
} else if (GetKeyState(".")){
PATH_w := "ERROR"
TITLE_w_old := ""
IniDelete, %iniFile%, savedKeys, w
TrayTip AltGr+W, Binding deleted
} else {
RunOrActivate("W", PATH_w)
}
return
ahk 中有没有办法将热键打包到一个函数中?
这是整个事情,包括我包裹的python代码:
【问题讨论】:
-
我不确定我理解你到底想达到什么目的。您可以通过堆叠热键触发器来定义多个触发器,并且您可以使用
A_ThisHotkey引用最后一个热键,无论按下哪个。 -
您可以在脚本运行时使用HOTKEY 命令创建、修改、启用或禁用热键
标签: python dynamic autohotkey shortcut hotkeys