我想要实现的是:
SetTitleMatchMode, 2
#ifwinactive ahk_class BCGPMiniFrame: ahk_exe FOXITPDFEDITOR.EXE
ahk_class BCGPMiniFrame:
部分只是 的部分匹配ahk_class BCGPMiniFrame:3c0000:8:10007:10
。但这#ifwinactive
不起作用。有什么想法吗?
以下是完整背景:
我想为 Foxit 阅读器浮动面板创建一个热键。
#ifwinactive ahk_class BCGPMiniFrame:3c0000:8:10007:10 ahk_exe FOXITPDFEDITOR.EXE
问题是ahk_class
每个新实例的部分都会发生变化。因此,我想像这样同时指定部分ahk_class
和全部。ahk_exe
SetTitleMatchMode, 2
#ifwinactive ahk_class BCGPMiniFrame: ahk_exe FOXITPDFEDITOR.EXE
但那不管用。后来我了解到SetTitleMatchMode, RegEx
如何修复部分ahk_class
匹配的问题。
SetTitleMatchMode, RegEx
#ifwinactive ahk_class BCGPMiniFrame: ahk_exe FOXITPDFEDITOR.EXE
但这也不起作用。我该如何实现呢?
编辑
根据user3419297的建议,我尝试了这个但失败了。
SetTitleMatchMode, RegEx
GroupAdd, Foxit_reader_floating_panel_group, ahk_class BCGPMiniFrame
SetTitleMatchMode, 2 ; for the rest
我也尝试为 msedge.exe 创建另一个 ahk_group,但也失败了。
SetTitleMatchMode, RegEx
GroupAdd, chrome, ahk_class Chrome_
SetTitleMatchMode, 2 ; for the rest
然后我尝试了另一个版本并且成功了。
SetTitleMatchMode, RegEx
GroupAdd, Foxit_reader_floating_panel_group, ahk_class BCGPMiniFrame:bd0000:8:10007:10
SetTitleMatchMode, 2 ; for the rest
答案1
尝试这个:
; auto-execute section (top of the script):
; If the script is not elevated, relaunch as administrator and kill current instance:
full_command_line := DllCall("GetCommandLine", "str")
if not (A_IsAdmin or RegExMatch(full_command_line, " /restart(?!\S)"))
{
try ; leads to having the script re-launching itself as administrator
{
if A_IsCompiled
Run *RunAs "%A_ScriptFullPath%" /restart
else
Run *RunAs "%A_AhkPath%" /restart "%A_ScriptFullPath%"
}
ExitApp
}
SetTitleMatchMode RegEx
GroupAdd, Foxit_reader_floating_panel_group, ahk_class BCGPMiniFrame:
SetTitleMatchMode 2 ; for the rest
; ...
RETURN ; === end of auto-execute section ===
; ...
#IfWinActive ahk_group Foxit_reader_floating_panel_group
F1:: MsgBox, Foxit reader floating panel is active
#IfWinActive
设置标题匹配模式无法在自动执行部分、热键/热键定义或函数之外工作,因为它是命令,而不是指令#IfWinActive。
编辑
如果你想在脚本中使用 RegEx 作为标准 SetTitleMatchMode(这种情况很少见),那么你不需要在自动执行部分创建组并直接使用#IfWinActive ahk_class BCGPMiniFrame:
但是如果您想在热键/热键/功能中使用另一个 SetTitleMatchMode,例如 SetTitleMatchMode 2(通常如此),那么您必须每次在其定义中添加它。
编辑2
如果程序以管理员权限运行,则 AHK 将不会拦截按键。尝试以管理员身份运行脚本,就像在编辑的代码中一样。
更多详细信息请阅读https://autohotkey.com/docs/commands/Run.htm#RunAs。
编辑3
另一种方法:
; auto-execute section (top of the script):
SetTimer, create_group, 200
; ...
RETURN ; === end of auto-execute section ===
; ...
create_group:
WinGetClass, ActiveClass, A
If InStr(ActiveClass, "BCGPMiniFrame")
{
WinGet, active_id, ID, A
GroupAdd, Foxit_reader_floating_panel_group, ahk_id %active_id%
}
If InStr(ActiveClass, "Notepad") ; Notepad, Notepad2, Notepad3, Notepad++
{
WinGet, active_id, ID, A
GroupAdd, Notepad_group, ahk_id %active_id%
}
; ...
return
#IfWinActive ahk_group Foxit_reader_floating_panel_group
F1:: MsgBox, Foxit reader floating panel is active
#IfWinActive ahk_group Notepad_group
F1:: MsgBox, Notepad_group is active
#IfWinActive