我使用 AHK 1.1 将其设置CapsLock 为热键以切换 ArtRage 全屏模式(工作台模式),我这样做是因为 ArtRage 不允许我将其设置CapsLock 为热键,但我习惯在很多程序中使用该键来执行此操作,所以我认为 AHK 可以帮助我,我的脚本很简单:
; AR4 Toggle Workbench Mode
Capslock::
Send {Ctrl Down}{Right}{Ctrl Up} ; Ctrl Right is the key I set to toogle the workbench mode
WinActivate ahk_class ArtRage 3
return
#If
该脚本仅在我第一次启用full screen mode
和第一次禁用它时起作用,我的意思是前两次按下CapsLock,但除非我手动单击 ArtRage 窗口,否则它将不起作用。如果我这样做,我可以再使用热键两次。所以我想我不知何故失去了对窗口的关注。我也尝试过这个:
Capslock::
ControlSend,, {Ctrl Down}{Right}{Ctrl Up}, ahk_class ArtRage 3
WinActivate ahk_class ArtRage 3
return
#If
结果相同,我用 Google 搜索,然后尝试:
Capslock::
WinGet, AR4_id, ID, A
Send {Ctrl Down}{Right}{Ctrl Up}
ControlFocus,,%AR4_id%
return
但它根本不起作用。希望有超级用户能帮我解决这个问题。
已编辑>>>>
所以现在我尝试让脚本在 WinExist 和 WinActive 时都工作,这可能吗?我这样做了,但它不起作用,CapsLock 仍然在每个应用程序上调用 ArtRage。
#If WinActive("ahk_class ArtRage 3")
#If WinExist("ahk_class ArtRage 3")
Capslock::
ControlSend, ahk_parent, {SC037}, ahk_class ArtRage 3 ; NumpadMult
return
#If
#If
编辑2>>>>
我修改了代码如下:
If WinActive("ahk_class ArtRage 3")
Capslock::
ControlSend, ahk_parent, {SC037}, ahk_class ArtRage 3 ; NumpadMult
return
#If
代码可以运行,但是如果 ArtRage 处于打开状态(未聚焦)并且我在 MS Word 中,如果我按下CapsLock 它,它将不会发送CapsLock,但它会在 Artrage 中发送“工作台模式下的工作”,尽管它没有聚焦。
PD:现在NumpadMult是进入全屏模式的新热键(更容易)。
答案1
#If WinExist("ahk_class ArtRage 3")
Capslock::
WinActivate, ahk_class ArtRage 3
WinWaitActive, ahk_class ArtRage 3
Send {Ctrl Down}{Right}{Ctrl Up} ; Ctrl Right is the key I set to toogle the workbench mode
return
#If
编辑:
程序会不会在工作台模式下创建这个 ahk_class 的新窗口?使用这个来找出答案:
F1::
WinGet, instances, count, ahk_class ArtRage
MsgBox, There exist %instances% windows of this ahk_class.
return
编辑2:
也可以尝试将其作为独立脚本(关闭所有可能干扰的其他脚本):
#If WinExist("ahk_class ArtRage 3")
Capslock::
ControlSend, ahk_parent, ^{Right}, ahk_class ArtRage 3
; or:
; ControlSend,, ^{Right}, ahk_class ArtRage 3
return
#If
如果不起作用,请阅读https://autohotkey.com/docs/FAQ.htm#games并尝试那里提到的解决方案。
编辑3:
如何最好地使用 #If- 或 #IfWin 指令这个问题的答案取决于您的情况。
The #IfWin directives are positional:
they affect all hotkeys and hotstrings physically beneath them in the script.
They are also mutually exclusive; that is, only the most recent one will be in effect.
https://autohotkey.com/docs/commands/_IfWinActive.htm#Basic_Operation
#如果 WinExist 是一个宽句柄,但前提是你优先考虑它,也就是说,如果你把它前脚本中的其他 #if 指令。尽量优先考虑 #if WinActive 指令(在脚本中将它们放在 #if WinExist 之前)。
例子:
#If WinActive("ahk_class ArtRage 3")
Capslock:: MsgBox, You pressed Capslock while ArtRage was active
1:: MsgBox, You pressed 1 while ArtRage was active
#If WinActive("ahk_class notepad")
Capslock:: MsgBox, You pressed Capslock while Notepad was active
1:: Send, 2
#If WinActive("ahk_class CabinetWClass")
Capslock:: MsgBox, You pressed Capslock while Explorer was active
1:: Run %A_MyDocuments%
#If WinExist("ahk_class ArtRage 3")
Capslock:: MsgBox, You pressed Capslock while ArtRage was inactive `n(Notepad and Explorer are not active or do not exist)
1:: MsgBox, You pressed 1 while ArtRage was inactive`nNotepad and Explorer are not active or do not exist
#If WinExist("ahk_class IEFrame")
Capslock:: MsgBox, You pressed Capslock while IE was inactive `nArtRage does not exist,`nNotepad and Explorer are not active or do not exist
#If ; end of context-sensitive hotkeys
Capslock:: MsgBox, You pressed Capslock while ArtRage and IE do not exist`nNotepad and Explorer are not active or do not exist
1:: MsgBox, You pressed 1 while ArtRage and IE do not exist`nNotepad and Explorer are not active or do not exist
顺便说一句:#If WinActive("ahk_class ArtRage 3") 之后的 #If WinExist("ahk_class ArtRage 3") 没有意义(#If WinActive 指令假定该窗口存在)。
答案2
这个怎么样?
*$vk14:: ; Capslock
{
Send {vk11 Down} ; Ctrl
Sleep 50
Send {vk27 Down} ; Right arrow
Sleep 50
Send {vk11 Up} ; Ctrl
Sleep 50
Send {vk27 Up} ; Right arrow
}
Return
有时添加按键代码并在按下/释放按键之间增加睡眠时间会有所帮助。