【问题标题】:How to make Autohotkey Click through Progress Bar GUI without Background Color如何在没有背景颜色的情况下通过进度条 GUI 制作 Autohotkey 单击
【发布时间】:2021-01-12 07:44:12
【问题描述】:

在 Autohotkey 论坛的一些 sn-ps 的帮助下,我使用 Autohotkey 制作了一个简单的计时器, 就像浏览器中许多网页上的页面加载栏一样,但适用于 Windows。

现在它可以按预期工作,具有以下功能:

  • 留在屏幕顶部
  • 占用很少的屏幕空间(仅 4 像素高度)
  • 单击直通和透明(不会阻止我将鼠标悬停在右上角关闭窗口)
  • 很简单,只需将 .ahk 代码更改为配置颜色、时间、大小等即可。

但是,我注意到当透明度设置为 100 时,总是有灰色的透明背景,

Gray backound of progress bar

有人知道我可以调整任何参数以使进度条没有背景吗?

此简单计时器的完整自动热键代码:

#Persistent
WinTitle = toptimer

Gui,New,hwndMyGui

global MyProgress
; 30 minutes
time := 30 * 60 * 1000
tick:=A_TickCount+time

Gui, +E0x20 -Caption +AlwaysOnTop +Owner +LastFound
; Gui, -Caption +AlwaysOnTop +Owner +LastFound
WinSet, Transparent, 100
; Gui,Margin,0,0
Gui,Margin,-1,-1
Gui,Add,Progress,w1920 h4 cbFF0000 Range%A_TickCount%-%tick% vMyProgress
; Gui,Show,NA
Gui, Show, x0 y0 w%A_ScreenWidth%
While A_TickCount<=tick {
    GuiControl,,MyProgress,% A_TickCount
    Sleep 16
}
Gui,Destroy
ExitApp

感谢@0x464e 的好建议,

现在我只画一个单色的 gui 并改变它的宽度

#Persistent
Gui,New,hwndMyGui
time := 1 * 60 * 1000
tick:=A_TickCount+time

Gui, +E0x20 -Caption +AlwaysOnTop +Owner +LastFound
WinSet, Transparent, 100
Gui, Color, FF0000
While A_TickCount<=tick {
    width0 := A_ScreenWidth * (1 - (tick - A_TickCount)/time)
    Gui, Show, x0 y0 w%width0% h5
    Sleep 16
}
Gui,Destroy
ExitApp

这使代码更加简单,背景也消失了。 但是当这个计时器运行时,鼠标左键不起作用,点击资源管理器的右上角最小化/恢复/关闭不起作用。

但是 vscode 的最小化/恢复/关闭按钮工作正常。

退出计时器后,一切正常。

有人帮助弄清楚为什么会发生这种情况。

【问题讨论】:

  • 我假设您必须添加自定义进度控件。如果您甚至可以找到合适的自定义控件,那将是相当复杂的。相反,也许只是放弃整个进度条,只画一个单一的颜色 gui?只需更改 gui 的宽度以指示进度。
  • 不错的建议,我现在就试试。

标签: timer progress-bar autohotkey transparent click-through


【解决方案1】:

出现问题是因为您的Gui, Show 命令每次都会激活窗口。
添加NA(docs) 选项以消除此问题。

或者,您可以使用例如 WinMove(docs) 来调整窗口大小。
在这种情况下,您还需要使用SetWinDelay(docs) 来消除WinMove 命令之后发生的延迟。

我不确定哪种方法更好,我不能被要求打开 AHK 源来查看这两者之间究竟有什么区别。如果您足够关心(并且足够了解 C/C++),请务必看一看。
以下是这两种方法的修改后的脚本:

time := 1 * 60 * 1000
tick := A_TickCount + time

Gui, +E0x20 -Caption +AlwaysOnTop +Owner +LastFound
WinSet, Transparent, 100
Gui, Color, FF0000
While (A_TickCount <= tick) 
{
    width0 := A_ScreenWidth * (1 - (tick - A_TickCount) / time)
    Gui, Show, x0 y0 w%width0% h5 NA
    Sleep, 16
}
ExitApp

SetWinDelay, 0

time := 1 * 60 * 1000
tick := A_TickCount + time

Gui, +E0x20 -Caption +AlwaysOnTop +Owner +LastFound
WinSet, Transparent, 100
Gui, Color, FF0000
Gui, Show, y0 x0 h5

While (A_TickCount <= tick) 
{
    width0 := A_ScreenWidth * (1 - (tick - A_TickCount) / time)
    WinMove, , , , , % width0
    Sleep, 16
}
ExitApp

【讨论】:

  • 感谢@0x464e,两者都可以正常工作。几乎使用相同的 CPU 和相同的内存,因此,任何一个都很好用。这两者之间的技术差异对我来说不是那么重要,也许以后再检查一下。
猜你喜欢
  • 2018-09-19
  • 1970-01-01
  • 2019-06-14
  • 2020-09-25
  • 2013-06-01
  • 1970-01-01
  • 2021-10-08
  • 1970-01-01
  • 2022-10-13
相关资源
最近更新 更多