首页 > 编程语言 >C# 控制系统音量/麦克风大小

C# 控制系统音量/麦克风大小

时间:2023-11-24 17:45:00浏览次数:26  
标签:麦克风 C# VK private VOLUME int 音量 UInt32

场景:在做播放设备的时候需要控制音量的大小,下面几种方法将满足你的要求

方法一: 改变系统音量设置,每次2个音量

[DllImport("user32.dll")]
static extern void keybd_event(byte bVk, byte bScan, UInt32 dwFlags, UInt32 dwExtraInfo);
 
[DllImport("user32.dll")]
static extern Byte MapVirtualKey(UInt32 uCode, UInt32 uMapType);
 
private const byte VK_VOLUME_MUTE = 0xAD;
private const byte VK_VOLUME_DOWN = 0xAE;
private const byte VK_VOLUME_UP = 0xAF;
private const UInt32 KEYEVENTF_EXTENDEDKEY = 0x0001;
private const UInt32 KEYEVENTF_KEYUP = 0x0002;
 
/// <summary>
/// 改变系统音量大小,增加
/// </summary>
public void VolumeUp()
{
    keybd_event(VK_VOLUME_UP, MapVirtualKey(VK_VOLUME_UP, 0), KEYEVENTF_EXTENDEDKEY, 0);
    keybd_event(VK_VOLUME_UP, MapVirtualKey(VK_VOLUME_UP, 0), KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
}
 
/// <summary>
/// 改变系统音量大小,减小
/// </summary>
public void VolumeDown()
{
    keybd_event(VK_VOLUME_DOWN, MapVirtualKey(VK_VOLUME_DOWN, 0), KEYEVENTF_EXTENDEDKEY, 0);
    keybd_event(VK_VOLUME_DOWN, MapVirtualKey(VK_VOLUME_DOWN, 0), KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
}
 
/// <summary>
/// 改变系统音量大小,静音
/// </summary>
public void Mute()
{
    keybd_event(VK_VOLUME_MUTE, MapVirtualKey(VK_VOLUME_MUTE, 0), KEYEVENTF_EXTENDEDKEY, 0);
    keybd_event(VK_VOLUME_MUTE, MapVirtualKey(VK_VOLUME_MUTE, 0), KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
}
View Code

方法二: 改变程序音量,但不改变系统音量设置,每次2个音量

[DllImport("Winmm.dll")]
private static extern int waveOutSetVolume(int hwo, System.UInt32 pdwVolume);
 
[DllImport("Winmm.dll")]
private static extern uint waveOutGetVolume(int hwo, out    System.UInt32 pdwVolume);  
#region 
 
private int volumeMinScope = 0;
private int volumeMaxScope = 100;
private int volumeSize = 100;
 
/// <summary>
/// 音量控制,但不改变系统音量设置
/// </summary>
public int VolumeSize
{
    get { return volumeSize; }
    set { volumeSize = value; }
}
 
public void SetCurrentVolume()
{
    if (volumeSize < 0)
    {
        volumeSize = 0;
    }
 
    if (volumeSize > 100)
    {
        volumeSize = 100;
    }
    System.UInt32 Value = (System.UInt32)((double)0xffff * (double)volumeSize / (double)(volumeMaxScope - v           
 
              olumeMinScope));//先把trackbar的value值映射到0x0000~0xFFFF范围
 
 
    //限制value的取值范围
    if (Value < 0)
    {
        Value = 0;
    }
 
    if (Value > 0xffff)
    {
        Value = 0xffff;
    }
 
    System.UInt32 left = (System.UInt32)Value;//左声道音量
    System.UInt32 right = (System.UInt32)Value;//右
    waveOutSetVolume(0, left << 16 | right); //"<<"左移,“|”逻辑或运算
}
public int GetVolume()
        {
            System.UInt32 value = 0;
            waveOutGetVolume(0, out value);
            return (int)(value >> 16);
        }
View Code

方法三

 

#region 调节音量

        private const int APPCOMMAND_VOLUME_MUTE = 0x80000;
        private const int APPCOMMAND_VOLUME_UP = 0xA0000;
        private const int APPCOMMAND_VOLUME_DOWN = 0x90000;
        private const int WM_APPCOMMAND = 0x319;
        [DllImport("user32.dll")]
        public static extern IntPtr SendMessageW(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam);


        #endregion

SendMessageW(this.Handle, WM_APPCOMMAND, this.Handle,(IntPtr)APPCOMMAND_VOLUME_UP);
View Code

 

转:https://www.cnblogs.com/gc2013/p/4259981.html

 

C#窗体模拟键盘按键(组合键)产生事件 ---- 通过keybd_event()函数

https://www.cnblogs.com/mq0036/p/10416759.html

标签:麦克风,C#,VK,private,VOLUME,int,音量,UInt32
From: https://www.cnblogs.com/love201314/p/17854329.html

相关文章

  • C++类继承
    #include<iostream>classtopClass{  public:       topClass(intvalue)        {                ival=value;                printf("\nthei......
  • CF685E Travelling Through the Snow Queen's Kingdom
    题意给定一张图,走出当前边的时间为\(i\)。\(q\)次询问,问\(s\)是否能在\(l\tor\)中走到\(t\)。Sol考虑将边从大到小插入图中。注意到当前边只能对起点造成贡献。复杂度\(O(n\times\max\{n,m\})\)Code#include<iostream>#include<algorithm>#include<cstd......
  • 手写线程池——C和C++版本
    内容参考:爱编程的大丙(subingwen.cn)C语言版大致思路采用生产者——消费者模型:生产者:用户向任务队列添加任务,是生产者。消费者:线程池里面的线程从任务队列中取出任务是,是消费者。任务队列:单个任务结构:使用结构体封装,其中包含一个函数指针,用于指向要处理的具体任务......
  • [ARC117E] Zero-Sum Ranges 2题解
    题解前言个人认为官方题解写得最为详细、干净、清楚,如果有意向阅读外文版的题解的话,还是推荐去读一读:Editorial-AtCoderRegularContest117本文属于转载(?),有一些自己的思考过程,希望有帮助。题意有多少个长度为\(2N\)的序列\(A\)满足:序列\(A\)包含\(N\)个\(+1\)......
  • C++ Thread使用类成员函数
    C++Thread使用类成员函数1#include<thread>2#include<iostream>34usingstd::cout;5usingstd::endl;6usingstd::thread;78classJob{9public:10Job(intm):_m(m){}11voiddoSomeThing(inta,intb){12intc=a+b......
  • AI智能检测算法与LiteCVR平台铁路沿线周界入侵防护方案
    在现在铁路视频监控系统基础上,结合AI人工智能技术,通过智能算法判断铁路延线相关风险,形成“互联网+专网”常态护路联防模式,实现铁路护路“一键可控”,中心与值勤人员动态联防新格局。铁路周界的入侵防范主要包括人防、物防、技防模式。其中,人防是利用人工巡逻的方式对铁路关键位置......
  • Codeforces Round 910 (Div. 2)
    CodeforcesRound910(Div.2)A.MilicaandString解题思路:统计给定字符串\(s\)中的\(B\)的数量,记录为\(cnt\)。如果\(cnt==k\):输出0;如果\(cnt<k\):从左往右数,将第\(cnt-k\)个\(A\)的位置前的数全部变成\(B\).如果\(cnt>k\):从左往右数,将第\(k-cnt\)个\(B\)的......
  • React 组件之状态
    没有什么是不可能的,只是需要找到正确的方法。1.什么是状态?状态就是组件内部特有数据的载体(组件数据挂载方式),改变数据页面就会刷新,由组件自己设置和更改,也就是说由组件自己产生、维护,使用状态的目的就是为了在不同的状态下使组件的显示不同(自己管理),这在React中称为:条件渲染......
  • error:0308010C:digital envelope routines::unsupported
    执行:npmrunserve 出现:error:0308010C:digitalenveloperoutines::unsupported原因:npm版本升级解决:package.json增加配置"scripts":{"serve":"setNODE_OPTIONS=--openssl-legacy-provider&&vue-cli-serviceserve","b......
  • LiteCVR前端解码与后端解码有何区别?一文看懂
    高效的视频监控安防解决方案不仅能够捕捉相关画面,更有助于在将来实现以数据驱动的安防功能。视频监控是安防模块的重要环节,随着互联网技术的进步,视频监控技术的发展也越来越快。前两期我们介绍了LiteCVRv3.4版本的页面布局,在【配置中心】-【基础配置】-【开关配置】中有个【前端......