用 C# 实现独占音频设备降低其它程序的音量

这篇具有很好参考价值的文章主要介绍了用 C# 实现独占音频设备降低其它程序的音量。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

C#调用 Windows 辅助功能 API "AccSetRunningUtilityState" 函数实现音频避闪功能

音频闪避是指当自身应用程序,例如辅助功能程序,正在播放音频的时候,降低其他应用程序的音量。这样可以让用户更清楚地听到自身应用程序的音频,例如文字转语音或者导航提示。Windows API 提供了一个函数,AccSetRunningUtilityState,可以让辅助功能程序设置自己的音频闪避选项。本文将介绍如何使用这个函数实现音频闪避的功能。

AccSetRunningUtilityState 函数
AccSetRunningUtilityState 函数的原型如下:
HRESULT AccSetRunningUtilityState(
[in] HWND hwndApp,
[in] DWORD dwUtilityStateMask,
[in] DWORD dwUtilityState
);
这个函数接受三个参数: - hwndApp:辅助功能程序的主窗口句柄。这个参数不能为 NULL。 - dwUtilityStateMask:一个掩码,表示要设置的系统值。它可以是下面的值的组合: - ANRUS_ON_SCREEN_KEYBOARD_ACTIVE:辅助功能程序提供了一个屏幕键盘。 - ANRUS_TOUCH_MODIFICATION_ACTIVE:辅助功能程序正在消费重定向的触摸输入。 - ANRUS_PRIORITY_AUDIO_ACTIVE:辅助功能程序依赖音频(例如文字转语音)来传达重要信息给用户,并且应该在其他系统声音上保持可听性。 - ANRUS_PRIORITY_AUDIO_ACTIVE_NODUCK:辅助功能程序依赖音频(例如文字转语音)来传达重要信息给用户,但不应该相对于其他系统声音发生变化。 - dwUtilityState:dwUtilityStateMask 所指示的系统值的新设置。这个参数可以是零来重置系统值,或者是上面的值的组合。 如果成功,这个函数返回 S_OK,否则返回一个标准的 COM 错误码。 这个函数需要调用进程拥有 UIAccess 或更高的权限。如果调用者没有必要的权限,调用 AccSetRunningUtilityState 会失败,并返回 E_ACCESSDENIED。 在退出之前,辅助功能程序应该重置之前设置的任何系统值。
音频闪避选项
为了实现音频闪避的功能,我们需要使用 ANRUS_PRIORITY_AUDIO_ACTIVE 和 ANRUS_PRIORITY_AUDIO_ACTIVE_NODUCK 这两个值。它们分别表示: - ANRUS_PRIORITY_AUDIO_ACTIVE:辅助功能程序正在播放重要的音频,并且希望系统降低其他应用程序的音量。 - ANRUS_PRIORITY_AUDIO_ACTIVE_NODUCK:辅助功能程序正在播放重要的音频,但不希望系统降低其他应用程序的音量。 我们可以根据自己的需求,选择其中一个或者两个都使用。如果我们想要让自己的音频始终保持高于其他应用程序的音量,我们可以同时使用这两个值。如果我们想要让自己的音频在开始播放时降低其他应用程序的音量,然后在停止播放时恢复其他应用程序的音量,我们可以在开始播放时使用 ANRUS_PRIORITY_AUDIO_ACTIVE,然后在停止播放时使用 ANRUS_PRIORITY_AUDIO_ACTIVE_NODUCK。
示例代码
下面是一个使用 C# 编写的示例代码,演示了如何调用 AccSetRunningUtilityState 函数实现音频闪避的功能。这个代码定义了一个静态类 AudioDucking,提供了两个静态方法: - SetAudioDucking:设置音频闪避选项为 ANRUS_PRIORITY_AUDIO_ACTIVE,表示辅助功能程序处于活动状态,正在播放重要的音频,并且希望系统降低其他应用程序的音量。 - ResetAudioDucking:设置音频闪避选项为 ANRUS_PRIORITY_AUDIO_ACTIVE_NODUCK,表示辅助功能程序已经停止播放重要的音频,或者不希望系统降低其他应用程序的音量。 这两个方法都接受一个参数,即辅助功能程序的主窗口句柄。它们都调用了 AccSetRunningUtilityState 函数,并返回一个布尔值,表示是否成功。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
namespace WinForms
{
public static class AudioDucking
{
private const uint ANRUS_PRIORITY_AUDIO_ACTIVE = 0x0000004;
private const uint ANRUS_PRIORITY_AUDIO_ACTIVE_NODUCK = 0x0000008;
[DllImport("oleacc.dll", SetLastError = true)]
private static extern int AccSetRunningUtilityState(IntPtr hwndApp, uint dwUtilityStateMask, uint dwUtilityState);
public static bool SetAudioDucking(IntPtr hwnd)
{
int result = AccSetRunningUtilityState(hwnd, ANRUS_PRIORITY_AUDIO_ACTIVE | ANRUS_PRIORITY_AUDIO_ACTIVE_NODUCK, ANRUS_PRIORITY_AUDIO_ACTIVE | ANRUS_PRIORITY_AUDIO_ACTIVE_NODUCK);
return result == 0;
}
public static bool ResetAudioDucking(IntPtr hwnd)
{
int result = AccSetRunningUtilityState(hwnd, ANRUS_PRIORITY_AUDIO_ACTIVE | ANRUS_PRIORITY_AUDIO_ACTIVE_NODUCK, ANRUS_PRIORITY_AUDIO_ACTIVE_NODUCK);
return result == 0;
}
}
}
使用方法
为了使用这个示例代码,我们需要在程序中引用 AudioDucking 类,并在合适的时机调用它的方法。例如,如果我们的辅助功能程序是一个文字转语音的应用程序,我们可以在开始播放语音时调用 SetAudioDucking 方法,然后在停止播放语音时调用 ResetAudioDucking 方法。这样就可以实现音频闪避的功能,让用户更清楚地听到我们的语音输出。
总结
本文介绍了如何使用 Windows API 中的 AccSetRunningUtilityState 函数实现音频闪避的功能。这个函数可以让辅助功能程序设置自己的音频闪避选项,从而影响系统对其他应用程序的音量控制。我们还给出了一个使用 C# 编写的示例代码,演示了如何调用这个函数。希望本文对你有所帮助。
参考资料
1.NVDA Audio Ducking Mode: https://github.com/nvaccess/nvda/blob/master/source/audioDucking.py
2.AccSetRunningUtilityState function (oleacc.h): https://learn.microsoft.com/en-us/windows/win32/api/oleacc/nf-oleacc-accsetrunningutilitystate#anrus_priority_audio_active_noduck
 文章来源地址https://www.toymoban.com/news/detail-435757.html

到了这里,关于用 C# 实现独占音频设备降低其它程序的音量的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ffmpeg调整音频音量踩坑

    前一阵用 Flutter 结合 ffmpeg 做了一个音视频合并功能,记录一下遇到的问题。 首先是音视频合并命令: 说明: -i input.mp4 :指定输入视频文件。 -i input.mp3 :指定输入音频文件。 -filter_complex \\\"[1:a]adelay=0s:all=1[a1];[a1]amix=inputs=1[amixout]\\\" :使用filter_complex选项进行音频处理。首先,

    2024年02月06日
    浏览(41)
  • Android 音频开发——音量调节基础(十)

            AudioManager,音频管理类。它主要提供了丰富的 API 让开发者对应用的音量和铃声模式进行控制以及访问。主要内容涉及到音频流、声音、蓝牙、扩音器、耳机等等。 1、接口列表 接口 描述 dispatchMediaKeyEvent 发送媒体按钮的模拟键事件 isVolumeFixed 显示设备是否执行固

    2024年02月04日
    浏览(32)
  • rk3568 音频调节音量-rk809

    daisy使用的是rk3568的主板,系统使用的是v2版本的,使用正常-6dB的音频的文件和耳机声道输出听不清楚,但是使用0dB的能听清楚,所以先从软件上下手修改音量配置,从默认的3改到了0,因为手册里面写的0是最大音量配置参数,如果还是不行就需要硬件上做功放模块 IDO-EVB35

    2024年02月16日
    浏览(34)
  • 解析音频输出调节音量的原理以及调节的方法

    通常,音量调整可以在音频流水线的两个主要阶段进行:数字域和模拟域。当我们在系统设置中调整音量时,通常是在模拟域(即音频设备)进行调整。在这种情况下,所有的音频输出(包括来自不同应用的音频)都会受到影响。 如果你只想改变特定音频的音量,你可以在数

    2024年02月05日
    浏览(38)
  • 【多音音频测试信号】具有指定采样率和样本数的多音信号,生成多音信号的相位降低波峰因数研究(Matlab代码实现)

    💥💥💞💞 欢迎来到本博客 ❤️❤️💥💥 🏆博主优势: 🌞🌞🌞 博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️ 座右铭: 行百里者,半于九十。 📋📋📋 本文目录如下: 🎁🎁🎁 目录 💥1 概述 📚2 运行结果 🎉3 参考文献 🌈4 Matlab代码实现 多音信号

    2024年02月13日
    浏览(28)
  • vue前端获取/切换麦克风,播放采集音频和采集音量大小

    使用时确保你有如下依赖且版本为Vue2,终端里面运行 重要代码:audio: { deviceId: this.form.chooseMicDeviceId },将上面选的麦克风放到getUserMedia中,即可启用用户自己选择的麦克风 在sendData中可以把数据流传给后端,可以播放/下载采集到的数据流,也可以将数据流转换成file传给后端

    2024年02月08日
    浏览(33)
  • 【Win下实现一键快速切换音频输出设备】

    装完新电脑后遇到一个烦恼,我在看视频时喜欢用音响外放,但打游戏时又需要用耳机听声辨位,每次切换都得用鼠标点右下角的小喇叭,对于我这样的懒狗来说,这个过程真的很麻烦,就想自己搞一个脚本,只需要按下一个按键就能快速在两个设备间切换,就像静音键那样

    2024年02月01日
    浏览(30)
  • Unity 3D通过脚本控制音频音量、继续、暂停、停止播放;判断当前音乐是否播放;切换音乐;

    演示 在HideInInspector中将三首音乐拖到音乐组中,自定义音乐数量也可以,需要修改代码中切换音乐函数中的部分内容。调用脚本中的函数即可实现对应功能。 重复播放音乐代码如下

    2024年02月12日
    浏览(46)
  • 75v5等客制化蓝牙键盘及其它设备重新连接问题

    【我的电脑】-【高级系统设置】-【设备管理器】-【查看隐藏的设备】 在这里插入图片描述 这些出了问题的蓝牙设备,删除再重新连接就好了 转载 https://zh.tinystm.org/fix-can-t-remove-bluetooth-mouse

    2024年02月12日
    浏览(30)
  • 计算机组成原理-程序查询方式(流程图 演示过程 例题 定时查询 独占查询)

    每次输一个字,就认为状态完成,CPU就会取走数据寄存器的内容 此时模拟打印三个字符 假设此时三个字符在主存,CPU先从主存读一个字符放到CPU的寄存器中,此时是读主存操作. CPU向打印机发出打印的命令字,此时需要先经过打印机驱动程序的处理将打印的命令字放到CPU寄存

    2024年01月24日
    浏览(26)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包