AutoHotkey - 启用全屏模式时应用程序失去焦点

AutoHotkey - 启用全屏模式时应用程序失去焦点

我使用 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

有时添加按键代码并在按下/释放按键之间增加睡眠时间会有所帮助。

相关内容