You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VB.NET开发WebView2项目:如何单独静音Windows混音器中的WebView2

仅静音WebView2进程的系统音量混音器(VB.NET实现)

要实现仅针对WebView2进程的静音,不能直接用Core Audio.NET的全局操作,得通过Core Audio API精准定位WebView2的音频会话。以下是具体实现步骤:

实现思路

  1. 获取当前WebView2控件对应的进程ID
  2. 遍历系统中所有音频会话,匹配WebView2的进程ID
  3. 对匹配到的会话单独设置静音状态

VB.NET 代码实现

1. 定义Core Audio相关接口和常量

先添加P/Invoke和COM接口定义,用于访问Core Audio API:

Imports System
Imports System.Runtime.InteropServices
Imports System.Collections.Generic

<ComImport>
<Guid("77AA99A0-1BD6-484F-8BC7-2C654C9A9B6F")>
<InterfaceType(ComInterfaceType.InterfaceIsIUnknown)>
Public Interface IAudioSessionManager2
    Sub GetAudioSessionControl(ByVal sessionId As IntPtr, ByVal streamFlags As Integer, <Out> ByRef sessionControl As IAudioSessionControl)
    Sub GetSimpleAudioVolume(ByVal sessionId As IntPtr, ByVal streamFlags As Integer, <Out> ByRef audioVolume As ISimpleAudioVolume)
    Sub GetSessionEnumerator(<Out> ByRef sessionEnumerator As IAudioSessionEnumerator)
End Interface

<ComImport>
<Guid("E2F5BB11-0570-40CA-ACDD-3AA01277DEE8")>
<InterfaceType(ComInterfaceType.InterfaceIsIUnknown)>
Public Interface IAudioSessionEnumerator
    Function GetCount(<Out> ByRef count As Integer) As Integer
    Function GetSession(ByVal index As Integer, <Out> ByRef sessionControl As IAudioSessionControl) As Integer
End Interface

<ComImport>
<Guid("F4B1A599-7266-4319-A8CA-E70ACB11E8CD")>
<InterfaceType(ComInterfaceType.InterfaceIsIUnknown)>
Public Interface IAudioSessionControl
    Sub GetProcessId(<Out> ByRef processId As Integer)
    Sub GetSessionIdentifier(<Out> ByRef sessionId As String)
End Interface

<ComImport>
<Guid("87CE5498-68D6-44E5-9215-6DA47EF883D8")>
<InterfaceType(ComInterfaceType.InterfaceIsIUnknown)>
Public Interface ISimpleAudioVolume
    Sub SetMute(ByVal mute As Boolean, ByVal eventContext As IntPtr)
End Interface

<ComImport>
<Guid("D666063F-1587-4E43-81F1-B948E807363F")>
<InterfaceType(ComInterfaceType.InterfaceIsIUnknown)>
Public Interface IMMDeviceEnumerator
    Sub GetDefaultAudioEndpoint(ByVal dataFlow As Integer, ByVal role As Integer, <Out> ByRef device As IMMDevice)
End Interface

<ComImport>
<Guid("0BD7A1BE-7A1A-44DB-8397-CC5392387B5E")>
<InterfaceType(ComInterfaceType.InterfaceIsIUnknown)>
Public Interface IMMDevice
    Sub Activate(ByVal iid As Guid, ByVal clsCtx As Integer, ByVal activationParams As IntPtr, <Out> ByRef interfacePointer As IntPtr)
End Interface

Public Class CoreAudioHelper
    Private Const CLSID_MMDeviceEnumerator As String = "BCDE0395-E52F-467C-8E3D-C4579291692E"
    Private Const eRender As Integer = 0
    Private Const eMultimedia As Integer = 1

    Public Shared Sub MuteProcessAudio(processId As Integer, mute As Boolean)
        Dim enumerator As IMMDeviceEnumerator = DirectCast(Activator.CreateInstance(Type.GetTypeFromCLSID(New Guid(CLSID_MMDeviceEnumerator))), IMMDeviceEnumerator)
        Dim defaultDevice As IMMDevice = Nothing
        enumerator.GetDefaultAudioEndpoint(eRender, eMultimedia, defaultDevice)

        Dim sessionManagerPtr As IntPtr = IntPtr.Zero
        defaultDevice.Activate(GetType(IAudioSessionManager2).GUID, 1, IntPtr.Zero, sessionManagerPtr)
        Dim sessionManager As IAudioSessionManager2 = DirectCast(Marshal.GetObjectForIUnknown(sessionManagerPtr), IAudioSessionManager2)

        Dim sessionEnumerator As IAudioSessionEnumerator = Nothing
        sessionManager.GetSessionEnumerator(sessionEnumerator)

        Dim sessionCount As Integer = 0
        sessionEnumerator.GetCount(sessionCount)

        For i As Integer = 0 To sessionCount - 1
            Dim sessionControl As IAudioSessionControl = Nothing
            sessionEnumerator.GetSession(i, sessionControl)

            Dim pid As Integer = 0
            sessionControl.GetProcessId(pid)

            If pid = processId Then
                Dim sessionId As String = String.Empty
                sessionControl.GetSessionIdentifier(sessionId)
                Dim audioVolume As ISimpleAudioVolume = Nothing
                sessionManager.GetSimpleAudioVolume(IntPtr.Zero, 0, audioVolume)
                audioVolume.SetMute(mute, IntPtr.Zero)
                Marshal.ReleaseComObject(audioVolume)
            End If

            Marshal.ReleaseComObject(sessionControl)
        Next

        Marshal.ReleaseComObject(sessionEnumerator)
        Marshal.ReleaseComObject(sessionManager)
        Marshal.ReleaseComObject(defaultDevice)
        Marshal.ReleaseComObject(enumerator)
    End Sub
End Class

2. 获取WebView2进程ID并实现按钮点击事件

在窗体代码中添加按钮点击事件,调用静音方法:

Private Sub btnToggleWebView2Mute_Click(sender As Object, e As EventArgs) Handles btnToggleWebView2Mute.Click
    ' 获取WebView2进程ID
    Dim webViewPid As Integer = WebView21.CoreWebView2.ProcessId
    ' 切换静音状态(可根据需求调整为固定静音/取消静音)
    CoreAudioHelper.MuteProcessAudio(webViewPid, True)
    ' 取消静音则改为:CoreAudioHelper.MuteProcessAudio(webViewPid, False)
End Sub

关键说明

  • 直接调用原生Core Audio API,避免封装库误操作全局主音量
  • 通过CoreWebView2.ProcessId精准定位目标进程,确保只影响WebView2的音频会话
  • 遍历音频会话时仅匹配目标进程ID,不会干扰其他程序或系统音量

内容的提问来源于stack exchange,提问作者Daniel Felipe Nery Tondo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 22:36:33