我正在尝试获取具有音频的进程列表。
Volume Mixer 中显示的进程。
目前我有:
var currentProcess = Process.GetProcesses();
foreach (Process Proc in currentProcess.Where(p => p.MainWindowHandle != IntPtr.Zero))
{
Console.WriteLine(Proc.ProcessName);
}
哪些列表应用程序有一个窗口,有没有办法进一步过滤它以仅显示音频进程?
谢谢!
最佳答案
感谢这个 post
我能够修改其中一种方法以返回所有音频进程
public static List<Process> GetAudioProcesses()
{
IMMDeviceEnumerator deviceEnumerator = null;
IAudioSessionEnumerator sessionEnumerator = null;
IAudioSessionManager2 mgr = null;
IMMDevice speakers = null;
List<Process> audioProcesses = new List<Process>();
try
{
// get the speakers (1st render + multimedia) device
deviceEnumerator = (IMMDeviceEnumerator)(new MMDeviceEnumerator());
deviceEnumerator.GetDefaultAudioEndpoint(EDataFlow.eRender, ERole.eMultimedia, out speakers);
// activate the session manager. we need the enumerator
Guid IID_IAudioSessionManager2 = typeof(IAudioSessionManager2).GUID;
object o;
speakers.Activate(ref IID_IAudioSessionManager2, 0, IntPtr.Zero, out o);
mgr = (IAudioSessionManager2)o;
// enumerate sessions for on this device
mgr.GetSessionEnumerator(out sessionEnumerator);
int count;
sessionEnumerator.GetCount(out count);
// search for an audio session with the required process-id
for (int i = 0; i < count; ++i)
{
IAudioSessionControl2 ctl = null;
try
{
sessionEnumerator.GetSession(i, out ctl);
ctl.GetProcessId(out int cpid);
audioProcesses.Add(Process.GetProcessById(cpid));
}
finally
{
if (ctl != null) Marshal.ReleaseComObject(ctl);
}
}
return audioProcesses;
}
finally
{
if (sessionEnumerator != null) Marshal.ReleaseComObject(sessionEnumerator);
if (mgr != null) Marshal.ReleaseComObject(mgr);
if (speakers != null) Marshal.ReleaseComObject(speakers);
if (deviceEnumerator != null) Marshal.ReleaseComObject(deviceEnumerator);
}
}
关于C# 获取音频进程列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52030208/