当在 Windows 上按下增加音量的标准键盘键时,左上角会出现一个小窗口,显示音量以及有关播放媒体的可能信息。我正在寻找一种在不更改音量状态的情况下触发窗口的方法,最好以一种易于与 Autohotkey 集成的方式。
Windows 8 引入了 MediaControl 类,可让现代应用程序挂钩到系统播放控件。在 Windows 8.1 和 10 中,它被 SystemMediaTransportControls 类取代。
虽然它支持“系统媒体传输控件的手动控制”,但似乎没有办法显示/隐藏覆盖层,当然也不能从桌面应用程序中显示/隐藏覆盖层。
进入未记录的领域,我找到了覆盖层的类名,这将我引向HideVolumeOSD。不幸的是,类名称相当通用,因此您可能还必须查看窗口的大小才能确定它是否是音量覆盖。
我不知道仅显示窗口是否有效,Windows 不希望它可见,除非响应键盘和播放事件。 HideVolumeOSD 应用程序使用
keybd_event
(音量增大/减小)来触发它,但正如评论中所述,这是有问题的......
我设置了一个自动热键来增大音量、减小音量(对于快捷键 ctrl+pgdn)。
^PgDn::
Send {Volume_Up}
Send {Volume_Down}
return
与音量控制键一起使用时所需的行为可以通过以下方式获得:存储当前音量,发送媒体按键,然后将音量更新为存储值 +/- 1(或 +0,如果只是寻求显示 OSD) .
当音量为
Volume_Down
时,模仿 <=3. The sent Volume_Down
按键会触发静音时会出现边缘情况,但这可以通过手动将静音设置为关闭,或者将音量预先设置为 4 来解决。防止四舍五入到 0。选择哪种方法取决于当音量从 <=3 values. 降低时您是否喜欢短暂的可能更大声的声音(预设为 4)或短暂的静音(之后禁用静音)
以下代码位于 AHK v2 中。
; Prefix with '$' so as to prevent self triggering, since internally sending Volume_Up
$Volume_Up::{
; Get the current volume. SoundGetVolume returns a float which often needs rounding
volume:=Round(SoundGetVolume())
; Send the Volume_Up key, so the media display is triggered
Send "{Volume_Up}"
; Indiscriminately set the volume manually to volume+1
SoundSetVolume(volume+1)
}
; Much the same as above, yet when sending Volume_Down at volumes <=3 the volume
; is rounded down to 0 which triggers mute. The volume is then set properly,
; yet remains muted. In order to not hear a cut in the audio, you need to set
; the volume to 4 when (1<volume<=3) so that the Volume_Down doesn't round it
; down to 0, or disable the mute afterwards (if volume > 1). This causes a
; brief volume spike or mute blip, respectively. Currently the volume spike option
; is uncommented.
$Volume_Down::{
volume:=Round(SoundGetVolume())
; Bumping the volume before sending the Volume_Down to prevent mute blip (if needed)
if(1 < volume and volume <= 3){
SoundSetVolume(4)
}
Send "{Volume_Down}"
SoundSetVolume(volume-1)
; ; Disable accidental triggering of mute when volume >= 3 after sending Volume_Down
; if(volume > 1) {
; SoundSetMute(0)
; }
}
当问题询问时触发 OSD,可以进行以下操作。按音量键然后快速重置音量将显示它,但如果当前处于静音状态,则需要考虑以防止出现声音。使用音量键是因为双重切换
Volume_Mute
会导致声音输出出现间隙。
; Trigger the on screen display of the volume bar by hitting Volume_Up and
; then quickly resetting the volume. If muted and send Volume_Up, we will
; hear audio at original volume for a brief second. To prevent this, we
; can set the volume to 0 and send Volume_Down instead.
^PgUp::{
volume:=Round(SoundGetVolume())
muted:=SoundGetMute()
; Trigger the display with a volume key (might briefly bump the volume if unmuted)
if (muted or volume == 0) {
SoundSetVolume(0)
Send "{Volume_Down}"
} else {
Send "{Volume_Up}"
}
; Reset to the original volume and mute status
SoundSetMute(muted)
SoundSetVolume(volume)
}
所有相同的代码,但未注释:
$Volume_Up::{
volume:=Round(SoundGetVolume())
Send "{Volume_Up}"
SoundSetVolume(volume+1)
}
$Volume_Down::{
volume:=Round(SoundGetVolume())
if(1 < volume and volume <= 3){
SoundSetVolume(4)
}
Send "{Volume_Down}"
SoundSetVolume(volume-1)
}
^PgUp::{
volume:=Round(SoundGetVolume())
muted:=SoundGetMute()
if (muted or volume == 0) {
SoundSetVolume(0)
Send "{Volume_Down}"
} else {
Send "{Volume_Up}"
}
SoundSetMute(muted)
SoundSetVolume(volume)
}
以 Anna Wang 的答案为基础(https://stackoverflow.com/a/62012058/3251466)。
即使音量处于奇数值,这也会恢复音量。
^PgDn:: ;Ctrl+Page Down
SoundGet, original_volume
SendInput {Volume_Down}
SoundSet, original_volume
return
我不是 ahk 专家,但似乎您可以通过将当前系统音量存储到变量中,舍入该值(正确舍入系统音量)然后向上和向下发送音量来做到这一点。之后,只需使用变量将值设置回存储的卷,如下所示:
SoundGet, sysVolume
sysVolume := Round(sysVolume)
Send {Volume_Up}
Send {Volume_Down}
SoundSet, %sysVolume%