将应用程序声音静音/取消静音



当我使用的代码为以下代码时,如何在不接触计算机主音量控制的情况下将应用程序中的声音静音/取消静音:

My.Computer.Audio.Play(My.Resources.audio_here, AudioPlayMode.Background)
最后,

我花了 10+ 小时尝试不同的选项并将 C++ 和 C# 代码转换为 VB.net 和最终,这个似乎至少对我有用。自己尝试一下

Imports System.Runtime.InteropServices
Imports Microsoft.Win32
Public Class Form1
<DllImport("winmm.dll")>
Public Shared Function waveOutSetVolume(ByVal h As IntPtr, ByVal dwVolume As UInteger) As Integer
End Function

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    Me.Show()
    Dim keyValue As String  'disable web click sound
    keyValue = "%SystemRoot%Media"
    If Environment.OSVersion.Version.Major = 5 AndAlso Environment.OSVersion.Version.Minor > 0 Then
        keyValue += "Windows XP Start.wav"
    ElseIf Environment.OSVersion.Version.Major = 6 Then
        keyValue += "Windows Navigation Start.wav"
    Else
        Return
    End If
    Dim key As RegistryKey = Registry.CurrentUser.OpenSubKey("AppEventsSchemesAppsExplorerNavigating.Current", True)
    key.SetValue(Nothing, "", RegistryValueKind.ExpandString)
    Me.WebBrowser1.Navigate("https://www.youtube.com/some_video")
    waveOutSetVolume(IntPtr.Zero, 0)

End Sub

结束类

看看 winmm 中的waveOutSetVolumewaveOutGetVolume函数.dll

Private Declare Function waveOutSetVolume Lib "winmm.dll" (ByVal uDeviceID As Integer, ByVal dwVolume As Integer) As Integer
Private Declare Function waveOutGetVolume Lib "winmm.dll" (ByVal uDeviceID As Integer, ByRef lpdwVolume As Integer) As Integer

waveOutSetVolume 函数

waveOutGetVolume 函数

根据目标计算机的操作系统版本,可能需要考虑使用较新的MMDeviceEndpointVolume API。

端点卷示例代码

[DllImport("winmm.dll")]
private static extern int waveOutSetVolume(IntPtr hwo, uint dwVolume);
//mute application
private void mute(){
{
    int NewVolume = 0; //set 0 to unmute
    uint NewVolumeAllChannels = (((uint)NewVolume & 0x0000ffff) | ((uint)NewVolume << 16));
    waveOutSetVolume(IntPtr.Zero, NewVolumeAllChannels);
}
//unmute application
private void unmute(){
{
    int NewVolume = 65535; //set 65535 to unmute
    uint NewVolumeAllChannels = (((uint)NewVolume & 0x0000ffff) | ((uint)NewVolume << 16));
    waveOutSetVolume(IntPtr.Zero, NewVolumeAllChannels);
}

最新更新