autohotkey - 制作一个当窗口不再处于焦点时消失的 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
解决方案
对于您的第一个想法,我认为您可以使用扩展的窗口样式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 钩子。
推荐阅读
- c# - UseInMemoryDatabase 并保留集合
- apache-kafka - Kafka 流中的更改日志主题 - 设置或更改分区
- mysql - 如果不存在 mySql 删除列
- flutter - 错误:没有为“TasksScreen”类型定义方法“setState”。([todoey] lib/screens/tasks_screen.dart:26 处的未定义方法)
- html - 固定背景图像不会调整大小以适应移动视口
- python - 使用列的唯一值作为更高级别的列熊猫
- c++ - 如何在宏中使用宏后面的代码块?
- python - 图像出现在 Tkinter 的错误窗口中
- python - 使用 PIL 打开后无法在 tkinter 中显示图像
- postgresql - \copy 没有这样的文件或目录,即使该文件存在