如何在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.CoreAudioNuGet包 - 若WMI查询失败,检查VMware Workstation是否安装了WMI组件,或尝试以管理员权限运行程序
- 部分旧版VMware可能使用
root\vmware作为WMI命名空间,若root\virtualization\v2无效可替换尝试
内容的提问来源于stack exchange,提问作者黃世龍
相关产品推荐
相关产品推荐

