加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

.net – 确定窗口当前是否正在播放声音

发布时间:2020-12-14 01:43:18 所属栏目:Windows 来源:网络整理
导读:所以我一直在思考这个问题一段时间,我无法弄清楚正确的方法是什么.我想确定 Windows是否使用Powershell脚本在特定时间输出声音.我可以确定音频驱动程序是否有错误,但我不能在我的生活中弄清楚系统是否正在播放声音. 我查看了System.Media的.NET类,其中的三个
所以我一直在思考这个问题一段时间,我无法弄清楚正确的方法是什么.我想确定 Windows是否使用Powershell脚本在特定时间输出声音.我可以确定音频驱动程序是否有错误,但我不能在我的生活中弄清楚系统是否正在播放声音.

我查看了System.Media的.NET类,其中的三个类都与播放声音或操纵系统声音有关.

我不是要求为我编写代码,我只需要知道从哪里开始检查Windows系统当前是否正在播放声音.

我有一个声音监视器,持续监视Node.js平台上的声音,当它失去声音时它会发给我一个文本.好吧,我也想让它通过它所连接的所有系统,看看故障所在.这就是我想看看Windows电脑是否播放声音的原因.

以下是使用Simon Mourier提供的代码的方法.

运行以下代码:

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,IntPtr.Zero);
            float value = meter.GetPeakValue();

            // this is a bit tricky. 0 is the official "no sound" value
            // but for example,if you open a video and plays/stops with it (w/o killing the app/window/stream),// the value will not be zero,but something really small (around 1E-09)
            // so,depending on your context,it is up to you to decide
            // if you want to test for 0 or for a small value
            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
        }
    }
}
'@

我替换了所有var类型,因为这似乎解决了PowerShell版本2上没有编译的代码的问题.

加载后,您可以像这样检查状态:

[Foo.Bar]::IsWindowsPlayingSound()
True or False

我在PowerShell 5.1上测试了这个与Windows 10 1703一起使用的方法

但有一些警告:

this is a bit tricky. 0 is the official "no sound" value
but for example,the value will not be zero,but something really small (around 1E-09)
so,it is up to you to decide
if you want to test for 0 or for a small value

因此,如果您更改返回值> 1E-08返回值> 0视频暂停时你会得到真实的.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读