首页 > 解决方案 > 制作一个当窗口不再处于焦点时消失的 GUI

问题描述

我制作了一些只出现在 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

标签: autohotkey

解决方案


对于您的第一个想法,我认为您可以使用扩展的窗口样式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 钩子。


推荐阅读