当窗口不再处于焦点时,使GUI消失

时间:2018-05-01 16:17:46

标签: autohotkey

我制作了一些只出现在OneNote上的代码并提供了一些按钮。我遇到的问题是,当我按下按钮时它会聚焦,因此GUI会消失。我找到了两种可能的解决方案,但我不确定如何实现它们。

我的第一个想法是使GUI不可聚焦,但如上所述,我不知道它是如何工作的。

第二个想法是我可以制作

    WinWaitNotActive  ‎- OneNote

只有当OneNote和GUI都没有激活时才会通过,但我也不知道如何将两个可能的程序传递给命令。

#NoEnv  ; Recommended for performance and compatibility with future AutoHotkey releases.
; #Warn  ; Enable warnings to assist with detecting common errors.
SendMode Input  ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir%  ; Ensures a consistent starting directory.
#SingleInstance force
#Notrayicon

    SetTitleMatchMode 2

    Gui +LastFound -Caption +ToolWindow +Border + AlwaysOnTop
    Gui Add, Button, gDublicate x-1 y-1 w60 h25, Dublicate
    Gui Add, Button, gDelete x57 y-1 w60 h25, Delete
    Gui Add, Button, gBackwards x115 y-1 w25 h25, ←
    Gui Add, Button, gForwards x138 y-1 w25 h25, →

    Loop{
        WinWaitActive  ‎- OneNote
        Gui, Show, xCenter y35 NoActivate h23 w162
        WinWaitNotActive  ‎- OneNote
        Gui Hide
    }

    return:

    Dublicate:
        WinActivate  ‎- OneNote
        SendInput ^c
        Sleep 50
        SendInput ^v
    return

    Delete:
        WinActivate  ‎- OneNote   
        SendInput {Del}
    return

    Backwards:
        WinActivate  ‎- OneNote   
        SendInput ^z
    return

    Forwards:
        WinActivate  ‎- OneNote   
        SendInput ^y
    return

1 个答案:

答案 0 :(得分:0)

首先,我认为您可以使用扩展窗口样式WS_EX_NOACTIVATE。通过将+E0x08000000添加到选项中,可将其应用于GUI:

Gui +LastFound -Caption +ToolWindow +Border +AlwaysOnTop +E0x08000000

或者,我也探讨了你的第二个想法。您应该可以使用ahk_group来执行此操作,如下所示:

GroupAdd OneNote, - OneNote
; Requires adding +HwndGuiHwnd to your GUI options
GroupAdd OneNote, ahk_id %GuiHwnd%

Loop{
    WinWaitActive ahk_group OneNote
    Gui, Show, xCenter y35 NoActivate h23 w162
    WinWaitNotActive ahk_group OneNote
    Gui Hide
}

我没有OneNote并且无法真正测试这些,但我相信它们中的任何一个都应该有效。但是,由于WinWait[Not]Active通过不断检查前景窗口而工作,因此可能会遇到一些不一致。这涉及调用GetForegroundWindow,它可能在切换窗口之间的一小段时间内返回NULL,导致WinWait[Not]Active意外返回。在这种情况下,您可能希望完全放弃WinWaitActive + WinWaitNotActive循环以支持shell挂钩,我写了here

相关问题