如何触发Windows音量显示?

问题描述 投票:0回答:5

当在 Windows 上按下增加音量的标准键盘键时,左上角会出现一个小窗口,显示音量以及有关播放媒体的可能信息。我正在寻找一种在不更改音量状态的情况下触发窗口的方法,最好以一种易于与 Autohotkey 集成的方式。

windows windows-10 autohotkey volume
5个回答
4
投票

Windows 8 引入了 MediaControl 类,可让现代应用程序挂钩到系统播放控件。在 Windows 8.1 和 10 中,它被 SystemMediaTransportControls 类取代。

虽然它支持“系统媒体传输控件的手动控制”,但似乎没有办法显示/隐藏覆盖层,当然也不能从桌面应用程序中显示/隐藏覆盖层。

进入未记录的领域,我找到了覆盖层的类名,这将我引向HideVolumeOSD。不幸的是,类名称相当通用,因此您可能还必须查看窗口的大小才能确定它是否是音量覆盖。

我不知道仅显示窗口是否有效,Windows 不希望它可见,除非响应键盘和播放事件。 HideVolumeOSD 应用程序使用

keybd_event
(音量增大/减小)来触发它,但正如评论中所述,这是有问题的......


2
投票

我设置了一个自动热键来增大音量、减小音量(对于快捷键 ctrl+pgdn)。

^PgDn::
   Send {Volume_Up}
   Send {Volume_Down}
   return     

1
投票

与音量控制键一起使用时所需的行为可以通过以下方式获得:存储当前音量,发送媒体按键,然后将音量更新为存储值 +/- 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)
}

0
投票

以 Anna Wang 的答案为基础(https://stackoverflow.com/a/62012058/3251466)。

即使音量处于奇数值,这也会恢复音量。

^PgDn:: ;Ctrl+Page Down
  SoundGet, original_volume
  SendInput {Volume_Down}  
  SoundSet, original_volume
return

0
投票

我不是 ahk 专家,但似乎您可以通过将当前系统音量存储到变量中,舍入该值(正确舍入系统音量)然后向上和向下发送音量来做到这一点。之后,只需使用变量将值设置回存储的卷,如下所示:

SoundGet, sysVolume
sysVolume := Round(sysVolume)
Send {Volume_Up}
Send {Volume_Down}
SoundSet, %sysVolume%
© www.soinside.com 2019 - 2024. All rights reserved.