Powershell能否检测特定程序当前是否正在播放声音?

Powershell能否检测特定程序当前是否正在播放声音?,powershell,audio,Powershell,Audio,我试图找到一种方法来检测是否有一个特定的程序正在播放声音。长话短说,我工作场所的电脑都有一个名为ReSoin.exe的程序,如果它运行正常,它应该一直播放声音。如果ReSoin处于活动状态但未播放声音,则需要关闭并重新打开ReSoin。我想自动化这个过程 使用Persistent13描述的方法和我对Powershell的基本理解,我创建了一个循环来确定Windows机器是否正在播放任何声音。如果Resoin处于活动状态且计算机上没有声音播放,则循环将关闭并重新打开Resoin Add-Type

我试图找到一种方法来检测是否有一个特定的程序正在播放声音。长话短说,我工作场所的电脑都有一个名为ReSoin.exe的程序,如果它运行正常,它应该一直播放声音。如果ReSoin处于活动状态但未播放声音,则需要关闭并重新打开ReSoin。我想自动化这个过程

使用Persistent13描述的方法和我对Powershell的基本理解,我创建了一个循环来确定Windows机器是否正在播放任何声音。如果Resoin处于活动状态且计算机上没有声音播放,则循环将关闭并重新打开Resoin

Add-Type -TypeDefinition @'
using System;
using System.Runtime.InteropServices;

namespace Foo
{
    public class Bar
    {
        public static bool IsWindowsPlayingSound()
        {
            IMMDeviceEnumerator enumerator = (IMMDeviceEnumerator)(new MMDeviceEnumerator());
            IMMDevice speakers = enumerator.GetDefaultAudioEndpoint(EDataFlow.eRender, ERole.eMultimedia);
            IAudioMeterInformation meter = (IAudioMeterInformation)speakers.Activate(typeof(IAudioMeterInformation).GUID, 0, IntPtr.Zero);
            float value = meter.GetPeakValue();
            return value > 1E-08;
        }

        [ComImport, Guid("BCDE0395-E52F-467C-8E3D-C4579291692E")]
        private class MMDeviceEnumerator
        {
        }

        private enum EDataFlow
        {
            eRender,
            eCapture,
            eAll,
        }

        private enum ERole
        {
            eConsole,
            eMultimedia,
            eCommunications,
        }

        [InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("A95664D2-9614-4F35-A746-DE8DB63617E6")]
        private interface IMMDeviceEnumerator
        {
            void NotNeeded();
            IMMDevice GetDefaultAudioEndpoint(EDataFlow dataFlow, ERole role);
            // the rest is not defined/needed
        }

        [InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("D666063F-1587-4E43-81F1-B948E807363F")]
        private interface IMMDevice
        {
            [return: MarshalAs(UnmanagedType.IUnknown)]
            object Activate([MarshalAs(UnmanagedType.LPStruct)] Guid iid, int dwClsCtx, IntPtr pActivationParams);
            // the rest is not defined/needed
        }

        [InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("C02216F6-8C67-4B5B-9D00-D008E73E0064")]
        private interface IAudioMeterInformation
        {
            float GetPeakValue();
            // the rest is not defined/needed
        }
    }
}
'@


While(1) {
    $ReSoinIsActive = Get-Process ReSoin -ErrorAction SilentlyContinue
    if($ReSoinIsActive -ne $null) {
        $ReSoinIsPlayingSounds = [Foo.Bar]::IsWindowsPlayingSound()
        if($ReSoinIsPlayingSounds -eq $False) {
            Stop-Process -Name "ReSoin" -Force
            Start-Process -FilePath "C:\Program Files (x86)\ReLANpro\Cloud And Class Student\ReSoin.exe"
        }else {
            # Placeholder used for testing, please ignore
        }
    }else{
        # Placeholder used for testing, please ignore
    }
start-sleep -seconds 1
}

这是功能性的,但有一个明显的缺陷。如果任何其他程序正在播放噪音,计算机将假定ReSoin正在工作。有没有一种方法可以调整它,使其仅检测ReSoin是否播放噪音?我是Powershell和批处理脚本的业余爱好者,但如果有人有其他想法,我很乐意尝试其他脚本方法。如果我的目标无法实现,或者很难向StackOverflow社区提出要求,请让我知道。非常感谢您的帮助。

为什么应用程序停止播放声音?问题的根本原因是什么?我不知道。当我询问时,软件供应商没有承认这个问题。我所在组织的IT部门指责该软件,但没有该软件的经验,也没有学习使用该软件的兴趣(这是我的工作)。我目前的主管不了解该软件。我没有人要问。我只知道应用程序会自动停止播放声音,尽管应用程序的状态不是“没有响应”。我已经尝试了一个脚本来检测程序是否没有响应,但发现应用程序声称在没有声音的情况下仍有响应。