【问题标题】:Autohotkey - How to link a GUI to a window to act the same as its parentAutohotkey - 如何将 GUI 链接到窗口以与其父窗口相同
【发布时间】:2013-03-02 20:31:00
【问题描述】:

我想将一个 GUI 链接到某个窗口,这样它就可以像它的一部分一样工作。

这是我的 GUI,我希望它跟随计算器(用于测试)。如果计算器被最小化,则 gui 也会被最小化。

提前致谢!

#SingleInstance Force
#Persistent

BC = 0

Gui, Color, EEAA99
Gui, Margin , 0, 0
GUI, +AlwaysOnTop -Border -SysMenu -Caption +ToolWindow +Owner
Gui, Font, S48 CDefault Bold CBlue, Verdana
Gui, Add, Text, BackgroundTrans , Units completed:
Gui, Font, S72 CDefault Bold CGreen, Verdana
Gui, Add, Text, BackgroundTrans vBuildCounter, %BC%
WinSet, TransColor, EEAA99
Gui +LastFound +AlwaysOnTop +ToolWindow
WinSet, TransColor, EEAA99
Gui -Caption
Gui, Show, % "x" A_ScreenWidth - 400 " y" A_ScreenHeight / 4

:?*:asd:: ;count up
    SoundBeep, 500,500
    BC := BC += 1
    GuiControl,, BuildCounter, %BC%
Return

:?*:qwe:: ;reset the counter
    SoundBeep, 500,500
    BC := 0
    GuiControl,, BuildCounter, %BC%
Return

Esc::
ExitApp

【问题讨论】:

    标签: user-interface window parent autohotkey


    【解决方案1】:

    我最终得到了两个脚本。也许以后可以合并。

    一个脚本用于 ToolMenu,第二个用于激活。 由于我无法控制 GUI,从激活脚本显示/隐藏,我通过使用 Ctrl+Alt+Win+ “解决”了它F1Ctrl+Alt+Win+F2。不是最优雅的方式,但它有效...

    ToolMenu.ahk

    #SingleInstance Force
    #installKeybdHook
    #Persistent
    
    Gui, Destroy
    Gui,+AlwaysOnTop
    Gui,+ToolWindow
    Gui,+Border
    Gui, Add, Button, y5 w60, &LowBeep
    Gui, Add, Button, y5 w60, &HighBeep
    Gui, Add, Button, y8 h18, X
    Gui, Show, y0, MyToolWindow
    Return
    
    ButtonLowBeep:
        SoundBeep, 300, 300
    Return
    
    ButtonHighBeep:
        SoundBeep, 500, 300
    Return
    
    ButtonX:
    ButtonCancel:
        Gui, Destroy
    ExitApp
    
    ^!#F1::
        Gui, Hide
    Return
    
    ^!#F2::
        Gui, Show, y0, MyToolWindow
    Return
    

    DetectWindowChange.ahk

    #SingleInstance
    #installKeybdHook
    #Persistent
    Global SwitchCounter
    
    Gui +LastFound 
    hWnd := WinExist()
    DllCall( "RegisterShellHookWindow", UInt,Hwnd )
    MsgNum := DllCall( "RegisterWindowMessage", Str,"SHELLHOOK" )
    OnMessage( MsgNum, "ShellMessage" )
    Return
    
    ShellMessage( wParam )
    {
        If (wParam = 4)
        { 
            WinGetTitle, CurrName, A
            If (CurrName = "Calculator" OR CurrName = "MyToolWindow")
            {
                If ( SwitchCounter = 0)
                {
                    ;WinRestore, MyToolWindow
                    Send, ^!#{F2} ; Send Ctrl+Alt+Win+F2 to trigger GUI Show in GUI script
                }
                SwitchCounter += 1
            }
            Else
            {
                If ( SwitchCounter > 0)
                {
                    ;WinMinimize, MyToolWindow
                    Send, ^!#{F1} ; Send Ctrl+Alt+Win+F1 to trigger GUI Hide in GUI script
                }
                SwitchCounter := 0
            }
        }
    }
    Return
    

    让我知道这是如何工作的......

    【讨论】:

    • 有趣 :) 它确实有效,我明天要玩它。再次感谢! :)
    • 请对建议的解决方案提供一些反馈,如果答案有帮助,请单击白色复选标记将其变为绿色,以“接受”该答案。谢谢!
    • 请通过单击该答案旁边的白色“复选标记”将其变为绿色来“接受”给定的答案。谢谢!见:Accepting answers
    【解决方案2】:

    您可以(据我所知)仅使用 settimer 执行此操作。

    伪代码,未经测试!

    SetTitleMatchMode := 2
    SetTimer, CheckWindow, 200
    
    CheckWindow:
        If WinActive("Calculator")
        {
           Gui, Show, % "x" A_ScreenWidth - 400 " y" A_ScreenHeight / 4, Popup
        }
        Else If !WinActive("Popup")
        {
            Gui, Hide
        }
    Return
    

    编辑:添加了一个条件以避免在弹出窗口被激活时隐藏它。

    【讨论】:

    • 我正在使用 AutoHotKey_L。我也见过像 Set_parent_by_title 这样的东西,但我无法让它工作。 ://
    • 刚刚将最小化更改为 GUI、隐藏或 GUI、显示
    • 问题是当它运行GUI show 命令时,它会带走计算器的焦点并激活GUI。这隐藏了 GUI,询问计算器未激活。然后计算器变得活跃,再次显示 GUI……而且它一直在两个窗口之间切换。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-31
    • 1970-01-01
    • 1970-01-01
    • 2018-07-06
    • 1970-01-01
    • 2013-03-20
    • 2013-08-04
    相关资源
    最近更新 更多