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

如何在C#中获取VMware虚拟机进程ID并控制其音频?

如何关联VMware虚拟机VMX路径与vmware-vmx.exe进程ID以控制音频音量

问题背景

我使用vmrun list命令获取VMware Workstation中运行的虚拟机时,得到输出如下:

Total running VMs: 2
Absolute-path-to-virtual-machine1.vmx
Absolute-path-to-virtual-machine2.vmx

宿主机音量设置中,每个运行的虚拟机对应一个名为"VMware Workstation VMX"的音频项,关联进程为vmware-vmx.exe。我希望通过C#结合AudioSwitcher.AudioApi.CoreAudio库控制这些虚拟机的独立音量,但vmrun list无法返回虚拟机对应的进程ID(PID),导致无法将VMX路径与正确的IAudioSession对象关联,无法精准控制指定虚拟机的音量。

解决方案:通过WMI关联VMX路径与进程ID

VMware Workstation运行时会通过WMI暴露虚拟机的运行信息,我们可以通过查询WMI获取每个VMX路径对应的vmware-vmx.exe进程ID,再通过PID匹配目标音频会话。

步骤1:查询WMI获取VMX与PID的映射

使用System.Management库查询VMware的WMI命名空间,获取已开机虚拟机的VMX路径和对应进程ID:

using System.Management;
using System.Collections.Generic;

public Dictionary<string, int> GetVmwareVmToPidMap()
{
    var vmToPidMap = new Dictionary<string, int>();
    try
    {
        var scope = new ManagementScope(@"root\virtualization\v2");
        scope.Connect();

        var query = new ObjectQuery("SELECT Name, ProcessId FROM VMware_VirtualMachine WHERE PoweredOn = True");
        using (var searcher = new ManagementObjectSearcher(scope, query))
        {
            foreach (var obj in searcher.Get())
            {
                string vmxPath = obj["Name"]?.ToString();
                int pid = Convert.ToInt32(obj["ProcessId"]);
                if (!string.IsNullOrEmpty(vmxPath))
                {
                    vmToPidMap[vmxPath] = pid;
                }
            }
        }
    }
    catch (ManagementException ex)
    {
        Console.WriteLine($"WMI查询错误: {ex.Message}");
    }
    return vmToPidMap;
}

步骤2:通过PID匹配音频会话并控制音量

拿到VMX与PID的映射后,遍历AudioSwitcher的音频会话,匹配对应进程ID的会话并设置音量:

using AudioSwitcher.AudioApi.CoreAudio;

public void SetVmVolume(string vmxPath, float volumeLevel)
{
    var vmPidMap = GetVmwareVmToPidMap();
    if (!vmPidMap.TryGetValue(vmxPath, out int pid))
    {
        Console.WriteLine($"未找到虚拟机 {vmxPath} 对应的进程ID");
        return;
    }

    var audioController = new CoreAudioController();
    var sessions = audioController.GetAudioSessions();

    foreach (var session in sessions)
    {
        if (session.Process?.Id == pid && session.DisplayName == "VMware Workstation VMX")
        {
            session.Volume = volumeLevel; // 音量范围0.0(静音)到1.0(最大)
            Console.WriteLine($"已将虚拟机 {vmxPath} 的音量设置为 {volumeLevel * 100}%");
            break;
        }
    }
}

注意事项

  • 项目需引用System.Management和AudioSwitcher.AudioApi.CoreAudio NuGet包
  • 若WMI查询失败,检查VMware Workstation是否安装了WMI组件,或尝试以管理员权限运行程序
  • 部分旧版VMware可能使用root\vmware作为WMI命名空间,若root\virtualization\v2无效可替换尝试

内容的提问来源于stack exchange,提问作者黃世龍

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 07:07:45