很久以前写的一个控制系统音量的组件,看看吧 using System; using System.Collections.Generic; using System.Text; using System.Runtime.InteropServices;namespace StartsSystemVolumeContrlLib { public partial class StartsSystemVolumeContrl { #region SetWave Const /************************* waveVolume const ******************************/ private const int MMSYSERR_NOERROR = 0; private const int MAXPNAMELEN = 32; private const int MIXER_LONG_NAME_CHARS = 64; private const int MIXER_SHORT_NAME_CHARS = 16; private const int MIXER_GETLINEINFOF_COMPONENTTYPE = 0x3; private const int MIXER_GETCONTROLDETAILSF_VALUE = 0x0; private const int MIXER_GETLINECONTROLSF_ONEBYTYPE = 0x2; private const int MIXER_SETCONTROLDETAILSF_VALUE = 0x0; private const int MIXERLINE_COMPONENTTYPE_DST_FIRST = 0x0; private const int MIXERLINE_COMPONENTTYPE_DST_SPEAKERS = (MIXERLINE_COMPONENTTYPE_DST_FIRST + 4); private const int MIXERLINE_COMPONENTTYPE_SRC_FIRST = 0x1000; private const int MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE = (MIXERLINE_COMPONENTTYPE_SRC_FIRST + 3); private const int MIXERLINE_COMPONENTTYPE_SRC_WAVEOUT = (MIXERLINE_COMPONENTTYPE_SRC_FIRST + 8); private const int MIXERCONTROL_CT_UNITS_BOOLEAN = 0x10000; private const int MIXERCONTROL_CT_UNITS_UNSIGNED = 0x30000; private const int MIXERCONTROL_CT_CLASS_SWITCH = 0x20000000; private const int MIXERCONTROL_CT_CLASS_FADER = 0x50000000; private const int MIXERCONTROL_CT_SC_SWITCH_BOOLEAN = 0x0; private const int MIXER_OBJECTF_MIXER = 0x00000000; private const int MIXERCONTROL_CONTROLTYPE_FADER = (MIXERCONTROL_CT_CLASS_FADER | MIXERCONTROL_CT_UNITS_UNSIGNED); private const int MIXERCONTROL_CONTROLTYPE_VOLUME = (MIXERCONTROL_CONTROLTYPE_FADER + 1); private const int MIXERCONTROL_CONTROLTYPE_BOOLEAN = MIXERCONTROL_CT_CLASS_SWITCH | MIXERCONTROL_CT_SC_SWITCH_BOOLEAN | MIXERCONTROL_CT_UNITS_BOOLEAN; private const int MIXERCONTROL_CONTROLTYPE_MUTE = MIXERCONTROL_CONTROLTYPE_BOOLEAN + 2; private const int CALLBACK_WINDOW = 0x00010000; private const int MM_MIXM_LINE_CHANGE = 0x3D0; private const int MM_MIXM_CONTROL_CHANGE = 0x3D1; /************************* waveVolume const ******************************/ #endregion #region SetWave API [DllImport("winmm.dll", CharSet = CharSet.Ansi)] private static extern int mixerOpen(out int phmx, int uMxId, int dwCallback, int dwInstance, int fdwOpen); [DllImport("winmm.dll", CharSet = CharSet.Ansi)] private static extern int mixerClose(int hmx); [DllImport("winmm.dll", CharSet = CharSet.Ansi)] private static extern int mixerGetControlDetailsA(int hmxobj, ref MIXERCONTROLDETAILS pmxcd, int fdwDetails); [DllImport("winmm.dll", CharSet = CharSet.Ansi)] private static extern int mixerGetDevCapsA(int uMxId, ref MIXERCAPS pmxcaps, int cbmxcaps); [DllImport("winmm.dll", CharSet = CharSet.Ansi)] private static extern int mixerGetID(int hmxobj, int pumxID, int fdwId); [DllImport("winmm.dll", CharSet = CharSet.Ansi)] private static extern int mixerGetLineControlsA(int hmxobj, ref MIXERLINECONTROLS pmxlc, int fdwControls); [DllImport("winmm.dll", CharSet = CharSet.Ansi)] private static extern int mixerGetLineInfoA(int hmxobj, ref MIXERLINE pmxl, int fdwInfo); [DllImport("winmm.dll", CharSet = CharSet.Ansi)] private static extern int mixerGetNumDevs(); [DllImport("winmm.dll", CharSet = CharSet.Ansi)] private static extern int mixerMessage(int hmx, int uMsg, int dwParam1, int dwParam2); [DllImport("winmm.dll", CharSet = CharSet.Ansi)] private static extern int mixerSetControlDetails(int hmxobj, ref MIXERCONTROLDETAILS pmxcd, int fdwDetails); [StructLayout(LayoutKind.Sequential)] private struct MIXERCAPS { public int wMid; public int wPid; public int vDriverVersion; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = MAXPNAMELEN)] public string szPname; public int fdwSupport; public int cDestinations; } [StructLayout(LayoutKind.Sequential)] private struct MIXERCONTROL { public int cbStruct; public int dwControlID; public int dwControlType; public int fdwControl; public int cMultipleItems; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = MIXER_SHORT_NAME_CHARS)] public string szShortName; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = MIXER_LONG_NAME_CHARS)] public string szName; public int lMinimum; public int lMaximum; [MarshalAs(UnmanagedType.U4, SizeConst = 10)] public int reserved; } [StructLayout(LayoutKind.Sequential)] private struct MIXERCONTROLDETAILS { public int cbStruct; public int dwControlID; public int cChannels; public int item; public int cbDetails; public IntPtr paDetails; } [StructLayout(LayoutKind.Sequential)] private struct MIXERCONTROLDETAILS_UNSIGNED { public int dwValue; } [StructLayout(LayoutKind.Sequential)] private struct MIXERCONTROLDETAILS_UNSIGNED1 { public int dwValueL; public int dwValueR; } [StructLayout(LayoutKind.Sequential)] private struct MIXERCONTROLDETAILS_BOOLEAN { public int fValue; } [StructLayout(LayoutKind.Sequential)] private struct MIXERLINE { public int cbStruct; public int dwDestination; public int dwSource; public int dwLineID; public int fdwLine; public int dwUser; public int dwComponentType; public int cChannels; public int cConnections; public int cControls; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = MIXER_SHORT_NAME_CHARS)] public string szShortName; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = MIXER_LONG_NAME_CHARS)] public string szName; public int dwType; public int dwDeviceID; public int wMid; public int wPid; public int vDriverVersion; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = MAXPNAMELEN)] public string szPname; } [StructLayout(LayoutKind.Sequential)] private struct MIXERLINECONTROLS { public int cbStruct; public int dwLineID; public int dwControl; public int cControls; public int cbmxctrl; public IntPtr pamxctrl; } #endregion } }
using System; using System.Collections.Generic; using System.Text; using System.ComponentModel; using System.Windows.Forms; using System.Runtime.InteropServices; using System.Drawing;namespace StartsSystemVolumeContrlLib { #region Enum /// <summary> /// 控制声音类型。 /// </summary> public enum MixerLineComponeType { /// <summary> /// 主音控制。 /// </summary> SPEAKERS = 0x0004, /// <summary> /// 麦克风控制。 /// </summary> MICROPHONE = 0x1003, /// <summary> /// 波形控制。 /// </summary> WAVEOUT = 0x1008, } /// <summary> /// 声道。 /// </summary> public enum AudioSource : int { /// <summary> /// 左声道。 /// </summary> Left = 1, /// <summary> /// 立体声。 /// </summary> Stereo = 0, /// <summary> /// 右声道。 /// </summary> Right = 2 } #endregion #region EventHandler /// <summary> /// 表示将处理 SystemVolumeContrlLib.SystemVolumeContrl 对象的 SystemVolumeContrl 的声音音量改变事件的方法。 /// </summary> /// <param name="volume">声音音量。</param> public delegate void SystemVolumeChangeEventHandler(int volume); /// <summary> /// 表示将处理 SystemVolumeContrlLib.SystemVolumeContrl 对象的 SystemVolumeContrl 的声音静间改变事件的方法。 /// </summary> /// <param name="mute">是否静音。</param> public delegate void SystemVolumeMuteEventHandler(bool mute); #endregion #region /// <summary> /// 系统声音控制组件。 /// </summary> [ToolboxItem(true)] [ToolboxBitmap(typeof(StartsSystemVolumeContrl), "Player.ico")] [Description("StartsSystemVolumeContrl 控制系统声音组件。")] [DefaultProperty("SystemVolumeStep")] [DefaultEvent("SystemSpeakersVolumeChange")] public partial class StartsSystemVolumeContrl : Component { #region 变量 private int systemVolumeStep = 15; private int hmixer = 0; private IntPtr handle = IntPtr.Zero; #endregion #region Event /// <summary> /// 主声音音量改变。 /// </summary> [Category("系统声音")] [Description("Speakers 音量改变。")] public event SystemVolumeChangeEventHandler SystemSpeakersVolumeChange; /// <summary> /// 主声音静音改变。 /// </summary> [Category("系统声音")] [Description("Speakers 音静音改变。")] public event SystemVolumeMuteEventHandler SystemSpeakersMuteChange; /// <summary> /// WAVE 音量改变。 /// </summary> [Category("系统声音")] [Description("WAVE 音量改变。")] public event SystemVolumeChangeEventHandler SystemWaveVolumeChange; /// <summary> /// WAVE 静音改变。 /// </summary> [Category("系统声音")] [Description("WAVE 静音改变。")] public event SystemVolumeMuteEventHandler SystemWaveMuteChange; /// <summary> /// MicroPhone 音量改变。 /// </summary> [Category("系统声音")] [Description("MicroPhone 音量改变。")] public event SystemVolumeChangeEventHandler SystemMicroPhoneVolumeChange; /// <summary> /// MicroPhone 静音改变。 /// </summary> [Category("系统声音")] [Description("MicroPhone 静音改变。")] public event SystemVolumeMuteEventHandler SystemMicroPhoneMuteChange; #endregion #region 属性 #region 构造函数 /// <summary> /// 初始化一个 StartsSystemVolumeContrlLib.StartsSystemVolumeContrl 实例。 /// </summary> public StartsSystemVolumeContrl() { } /// <summary> /// 初始化一个 StartsSystemVolumeContrlLib.StartsSystemVolumeContrl 实例。 /// </summary> /// <param name="container">容器的接口。</param> public StartsSystemVolumeContrl(IContainer container) { container.Add(this); } /// <summary> /// 初始化一个 StartsSystemVolumeContrlLib.StartsSystemVolumeContrl 实例。 /// </summary> /// <param name="handle">接受系统声音改变消息的窗口的句柄。</param> public StartsSystemVolumeContrl(IntPtr handle) { this.handle = handle; } #endregion /// <summary> /// 获取系统 WAVE 声音的音量值(最大音量为255)。 /// </summary> [Category("系统音量设置")] [Description("获取系统波形声音音量值(最大音量为255)。")] [DesignerSerializationVisibility( DesignerSerializationVisibility.Hidden)] public int SystemWaveVolume { get { return GetSystemVolume(MixerLineComponeType.WAVEOUT); } set { int volume = 0; if (value > 255) volume = 255; else if (value < 0) volume = 0; else volume = value; SetSystemVolume(MixerLineComponeType.WAVEOUT, value); } } /// <summary> /// 获取系统主声音的音量值(最大音量为255)。 /// </summary> [Category("系统音量设置")] [Description("获取系统主声音音量值(最大音量为255)。")] [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public int SystemSpeakersVolume { get { return GetSystemVolume(MixerLineComponeType.SPEAKERS); } set { int volume = 0; if (value > 255) volume = 255; else if (value < 0) volume = 0; else volume = value; SetSystemVolume(MixerLineComponeType.SPEAKERS, value); } } /// <summary> /// 获取系统麦克风声音的音量值(最大音量为255)。 /// </summary> [Browsable(false)] [Category("系统音量设置")] [Description("获取系统麦克风声音音量值(最大音量为255)。")] [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public int SystemMicroPhoneVolume { get { return GetSystemVolume(MixerLineComponeType.MICROPHONE); } set { int volume = 0; if (value > 255) volume = 255; else if (value < 0) volume = 0; else volume = value; SetSystemVolume(MixerLineComponeType.MICROPHONE, value); } } /// <summary> /// 获取和设置系统波形声音声道。 /// </summary> [Category("系统音量设置")] [Description("获取和设置系统波形声音声道。")] [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public AudioSource SystemWaveAudioSource { get { int volL, volR; GetSystemVolume(out volL, out volR, MixerLineComponeType.WAVEOUT, false); if (volL > volR) return AudioSource.Left; else if (volL < volR) return AudioSource.Right; else return AudioSource.Stereo; } set { SetSystemVolSource(MixerLineComponeType.WAVEOUT, value); } }
/// <summary> /// 获取和设置系统主声音声道。 /// </summary> [Category("系统音量设置")] [Description("获取和设置系统主声音声道。")] [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public AudioSource SystemSpeakersAudioSource { get { int volL, volR; GetSystemVolume(out volL, out volR, MixerLineComponeType.SPEAKERS, false); if (volL > volR) return AudioSource.Left; else if (volL < volR) return AudioSource.Right; else return AudioSource.Stereo; } set { SetSystemVolSource(MixerLineComponeType.SPEAKERS, value); } } /// <summary> /// 获取或设置系统 WAVE 静音。true:静音;false:取消静音。 /// </summary> [Category("系统音量设置")] [Description("获取或设置系统 WAVE 静音。true:静音;false:取消静音。")] [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public bool SystemWaveMute { get { return GetSystemMute(MixerLineComponeType.WAVEOUT); } set { SetSystemMute(MixerLineComponeType.WAVEOUT, value); } } /// <summary> /// 获取或设置系统主声音静音。true:静音;false:取消静音。 /// </summary> [Category("系统音量设置")] [Description("获取或设置系统主声音静音。true:静音;false:取消静音。")] [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public bool SystemSpeakersMute { get { return GetSystemMute(MixerLineComponeType.SPEAKERS); } set { SetSystemMute(MixerLineComponeType.SPEAKERS, value); } } /// <summary> /// 获取或设置系统麦克风声音静音。true:静音;false:取消静音。 /// </summary> [Browsable(false)] [Category("系统音量设置")] [Description("获取或设置系统麦克风声音静音。true:静音;false:取消静音。")] [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public bool SystemMicroPhoneMute { get { return GetSystemMute(MixerLineComponeType.MICROPHONE); } set { SetSystemMute(MixerLineComponeType.MICROPHONE, value); } } /// <summary> /// 获取或设置每次增加或减少的音量值(默认15)。注意:这个是直接调节系统的音量。 /// </summary> [Category("系统音量设置")] [Description("获取或设置每次增加或减少的音量值(默认15)。注意:这个是直接调节系统的音量。")] [DefaultValue(15)] public int SystemVolumeStep { get { return systemVolumeStep; } set { systemVolumeStep = value; } } #endregion #region SetSystemVolume 函数 /// <summary> /// 打开系统声音控制; /// </summary> private void MixerOpen() { mixerOpen(out hmixer, 0, (int)handle, 0, CALLBACK_WINDOW); } private bool GetLineContrl(int componentType, int ctrlType, out MIXERCONTROL mxc) { MIXERLINECONTROLS mxlc = new MIXERLINECONTROLS(); MIXERLINE mxl = new MIXERLINE(); mxc = new MIXERCONTROL(); int rc = -1; bool retValue = false; if (hmixer < 1) { MixerOpen(); } if (hmixer > 0) { mxl.cbStruct = Marshal.SizeOf(mxl); mxl.dwComponentType = componentType; rc = mixerGetLineInfoA(hmixer, ref mxl, MIXER_GETLINEINFOF_COMPONENTTYPE); if (rc == MMSYSERR_NOERROR) { int sizeofMIXERCONTROL = 152; int ctrl = Marshal.SizeOf(typeof(MIXERCONTROL)); mxlc.pamxctrl = Marshal.AllocCoTaskMem(sizeofMIXERCONTROL); mxlc.cbStruct = Marshal.SizeOf(mxlc); mxlc.dwLineID = mxl.dwLineID; mxlc.dwControl = ctrlType; mxlc.cControls = 1; mxlc.cbmxctrl = sizeofMIXERCONTROL; // Allocate a buffer for the control mxc.cbStruct = sizeofMIXERCONTROL; // Get the control rc = mixerGetLineControlsA(hmixer, ref mxlc, MIXER_GETLINECONTROLSF_ONEBYTYPE); if (rc == MMSYSERR_NOERROR) { retValue = true; // Copy the control into the destination structure mxc = (MIXERCONTROL)Marshal.PtrToStructure(mxlc.pamxctrl, typeof(MIXERCONTROL)); } } } return retValue; } private void GetControlID(MixerLineComponeType mixerLCT, out int VolumeControlID, out int MuteControlID) { MIXERCONTROL mxcVol = new MIXERCONTROL(); MIXERCONTROL mxcMute = new MIXERCONTROL(); VolumeControlID = -1; MuteControlID = -1; int componentType = (int)mixerLCT; int ctrlTypeVol = MIXERCONTROL_CONTROLTYPE_VOLUME; int ctrlTypeMute = MIXERCONTROL_CONTROLTYPE_MUTE; GetLineContrl(componentType, ctrlTypeVol, out mxcVol); GetLineContrl(componentType, ctrlTypeMute, out mxcMute); VolumeControlID = mxcVol.dwControlID; MuteControlID = mxcMute.dwControlID; }
http://bbs.gameres.com/showthread.asp?postid=7516
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;namespace StartsSystemVolumeContrlLib
{
public partial class StartsSystemVolumeContrl
{
#region SetWave Const
/************************* waveVolume const ******************************/
private const int MMSYSERR_NOERROR = 0;
private const int MAXPNAMELEN = 32;
private const int MIXER_LONG_NAME_CHARS = 64;
private const int MIXER_SHORT_NAME_CHARS = 16; private const int MIXER_GETLINEINFOF_COMPONENTTYPE = 0x3;
private const int MIXER_GETCONTROLDETAILSF_VALUE = 0x0;
private const int MIXER_GETLINECONTROLSF_ONEBYTYPE = 0x2; private const int MIXER_SETCONTROLDETAILSF_VALUE = 0x0; private const int MIXERLINE_COMPONENTTYPE_DST_FIRST = 0x0;
private const int MIXERLINE_COMPONENTTYPE_DST_SPEAKERS = (MIXERLINE_COMPONENTTYPE_DST_FIRST + 4); private const int MIXERLINE_COMPONENTTYPE_SRC_FIRST = 0x1000;
private const int MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE = (MIXERLINE_COMPONENTTYPE_SRC_FIRST + 3);
private const int MIXERLINE_COMPONENTTYPE_SRC_WAVEOUT = (MIXERLINE_COMPONENTTYPE_SRC_FIRST + 8); private const int MIXERCONTROL_CT_UNITS_BOOLEAN = 0x10000;
private const int MIXERCONTROL_CT_UNITS_UNSIGNED = 0x30000; private const int MIXERCONTROL_CT_CLASS_SWITCH = 0x20000000;
private const int MIXERCONTROL_CT_CLASS_FADER = 0x50000000; private const int MIXERCONTROL_CT_SC_SWITCH_BOOLEAN = 0x0; private const int MIXER_OBJECTF_MIXER = 0x00000000; private const int MIXERCONTROL_CONTROLTYPE_FADER = (MIXERCONTROL_CT_CLASS_FADER | MIXERCONTROL_CT_UNITS_UNSIGNED);
private const int MIXERCONTROL_CONTROLTYPE_VOLUME = (MIXERCONTROL_CONTROLTYPE_FADER + 1);
private const int MIXERCONTROL_CONTROLTYPE_BOOLEAN = MIXERCONTROL_CT_CLASS_SWITCH | MIXERCONTROL_CT_SC_SWITCH_BOOLEAN | MIXERCONTROL_CT_UNITS_BOOLEAN;
private const int MIXERCONTROL_CONTROLTYPE_MUTE = MIXERCONTROL_CONTROLTYPE_BOOLEAN + 2; private const int CALLBACK_WINDOW = 0x00010000;
private const int MM_MIXM_LINE_CHANGE = 0x3D0;
private const int MM_MIXM_CONTROL_CHANGE = 0x3D1;
/************************* waveVolume const ******************************/
#endregion #region SetWave API
[DllImport("winmm.dll", CharSet = CharSet.Ansi)]
private static extern int mixerOpen(out int phmx, int uMxId, int dwCallback, int dwInstance, int fdwOpen); [DllImport("winmm.dll", CharSet = CharSet.Ansi)]
private static extern int mixerClose(int hmx); [DllImport("winmm.dll", CharSet = CharSet.Ansi)]
private static extern int mixerGetControlDetailsA(int hmxobj, ref MIXERCONTROLDETAILS pmxcd, int fdwDetails); [DllImport("winmm.dll", CharSet = CharSet.Ansi)]
private static extern int mixerGetDevCapsA(int uMxId, ref MIXERCAPS pmxcaps, int cbmxcaps); [DllImport("winmm.dll", CharSet = CharSet.Ansi)]
private static extern int mixerGetID(int hmxobj, int pumxID, int fdwId); [DllImport("winmm.dll", CharSet = CharSet.Ansi)]
private static extern int mixerGetLineControlsA(int hmxobj, ref MIXERLINECONTROLS pmxlc, int fdwControls); [DllImport("winmm.dll", CharSet = CharSet.Ansi)]
private static extern int mixerGetLineInfoA(int hmxobj, ref MIXERLINE pmxl, int fdwInfo); [DllImport("winmm.dll", CharSet = CharSet.Ansi)]
private static extern int mixerGetNumDevs(); [DllImport("winmm.dll", CharSet = CharSet.Ansi)]
private static extern int mixerMessage(int hmx, int uMsg, int dwParam1, int dwParam2); [DllImport("winmm.dll", CharSet = CharSet.Ansi)]
private static extern int mixerSetControlDetails(int hmxobj, ref MIXERCONTROLDETAILS pmxcd, int fdwDetails); [StructLayout(LayoutKind.Sequential)]
private struct MIXERCAPS
{
public int wMid;
public int wPid;
public int vDriverVersion;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = MAXPNAMELEN)]
public string szPname;
public int fdwSupport;
public int cDestinations;
} [StructLayout(LayoutKind.Sequential)]
private struct MIXERCONTROL
{
public int cbStruct;
public int dwControlID;
public int dwControlType;
public int fdwControl;
public int cMultipleItems;
[MarshalAs(UnmanagedType.ByValTStr,
SizeConst = MIXER_SHORT_NAME_CHARS)]
public string szShortName;
[MarshalAs(UnmanagedType.ByValTStr,
SizeConst = MIXER_LONG_NAME_CHARS)]
public string szName;
public int lMinimum;
public int lMaximum;
[MarshalAs(UnmanagedType.U4, SizeConst = 10)]
public int reserved;
} [StructLayout(LayoutKind.Sequential)]
private struct MIXERCONTROLDETAILS
{
public int cbStruct;
public int dwControlID;
public int cChannels;
public int item;
public int cbDetails;
public IntPtr paDetails;
} [StructLayout(LayoutKind.Sequential)]
private struct MIXERCONTROLDETAILS_UNSIGNED
{
public int dwValue;
} [StructLayout(LayoutKind.Sequential)]
private struct MIXERCONTROLDETAILS_UNSIGNED1
{
public int dwValueL;
public int dwValueR;
} [StructLayout(LayoutKind.Sequential)]
private struct MIXERCONTROLDETAILS_BOOLEAN
{
public int fValue;
} [StructLayout(LayoutKind.Sequential)]
private struct MIXERLINE
{
public int cbStruct;
public int dwDestination;
public int dwSource;
public int dwLineID;
public int fdwLine;
public int dwUser;
public int dwComponentType;
public int cChannels;
public int cConnections;
public int cControls;
[MarshalAs(UnmanagedType.ByValTStr,
SizeConst = MIXER_SHORT_NAME_CHARS)]
public string szShortName;
[MarshalAs(UnmanagedType.ByValTStr,
SizeConst = MIXER_LONG_NAME_CHARS)]
public string szName;
public int dwType;
public int dwDeviceID;
public int wMid;
public int wPid;
public int vDriverVersion;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = MAXPNAMELEN)]
public string szPname;
} [StructLayout(LayoutKind.Sequential)]
private struct MIXERLINECONTROLS
{
public int cbStruct;
public int dwLineID; public int dwControl;
public int cControls;
public int cbmxctrl;
public IntPtr pamxctrl;
}
#endregion
}
}
using System.Collections.Generic;
using System.Text;
using System.ComponentModel;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Drawing;namespace StartsSystemVolumeContrlLib
{
#region Enum /// <summary>
/// 控制声音类型。
/// </summary>
public enum MixerLineComponeType
{
/// <summary>
/// 主音控制。
/// </summary>
SPEAKERS = 0x0004,
/// <summary>
/// 麦克风控制。
/// </summary>
MICROPHONE = 0x1003,
/// <summary>
/// 波形控制。
/// </summary>
WAVEOUT = 0x1008,
} /// <summary>
/// 声道。
/// </summary>
public enum AudioSource : int
{
/// <summary>
/// 左声道。
/// </summary>
Left = 1,
/// <summary>
/// 立体声。
/// </summary>
Stereo = 0,
/// <summary>
/// 右声道。
/// </summary>
Right = 2
}
#endregion #region EventHandler
/// <summary>
/// 表示将处理 SystemVolumeContrlLib.SystemVolumeContrl 对象的 SystemVolumeContrl 的声音音量改变事件的方法。
/// </summary>
/// <param name="volume">声音音量。</param>
public delegate void SystemVolumeChangeEventHandler(int volume); /// <summary>
/// 表示将处理 SystemVolumeContrlLib.SystemVolumeContrl 对象的 SystemVolumeContrl 的声音静间改变事件的方法。
/// </summary>
/// <param name="mute">是否静音。</param>
public delegate void SystemVolumeMuteEventHandler(bool mute); #endregion #region
/// <summary>
/// 系统声音控制组件。
/// </summary>
[ToolboxItem(true)]
[ToolboxBitmap(typeof(StartsSystemVolumeContrl), "Player.ico")]
[Description("StartsSystemVolumeContrl 控制系统声音组件。")]
[DefaultProperty("SystemVolumeStep")]
[DefaultEvent("SystemSpeakersVolumeChange")]
public partial class StartsSystemVolumeContrl : Component
{
#region 变量 private int systemVolumeStep = 15;
private int hmixer = 0;
private IntPtr handle = IntPtr.Zero; #endregion #region Event /// <summary>
/// 主声音音量改变。
/// </summary>
[Category("系统声音")]
[Description("Speakers 音量改变。")]
public event SystemVolumeChangeEventHandler SystemSpeakersVolumeChange; /// <summary>
/// 主声音静音改变。
/// </summary>
[Category("系统声音")]
[Description("Speakers 音静音改变。")]
public event SystemVolumeMuteEventHandler SystemSpeakersMuteChange; /// <summary>
/// WAVE 音量改变。
/// </summary>
[Category("系统声音")]
[Description("WAVE 音量改变。")]
public event SystemVolumeChangeEventHandler SystemWaveVolumeChange; /// <summary>
/// WAVE 静音改变。
/// </summary>
[Category("系统声音")]
[Description("WAVE 静音改变。")]
public event SystemVolumeMuteEventHandler SystemWaveMuteChange; /// <summary>
/// MicroPhone 音量改变。
/// </summary>
[Category("系统声音")]
[Description("MicroPhone 音量改变。")]
public event SystemVolumeChangeEventHandler SystemMicroPhoneVolumeChange; /// <summary>
/// MicroPhone 静音改变。
/// </summary>
[Category("系统声音")]
[Description("MicroPhone 静音改变。")]
public event SystemVolumeMuteEventHandler SystemMicroPhoneMuteChange; #endregion #region 属性 #region 构造函数 /// <summary>
/// 初始化一个 StartsSystemVolumeContrlLib.StartsSystemVolumeContrl 实例。
/// </summary>
public StartsSystemVolumeContrl()
{
} /// <summary>
/// 初始化一个 StartsSystemVolumeContrlLib.StartsSystemVolumeContrl 实例。
/// </summary>
/// <param name="container">容器的接口。</param>
public StartsSystemVolumeContrl(IContainer container)
{
container.Add(this);
} /// <summary>
/// 初始化一个 StartsSystemVolumeContrlLib.StartsSystemVolumeContrl 实例。
/// </summary>
/// <param name="handle">接受系统声音改变消息的窗口的句柄。</param>
public StartsSystemVolumeContrl(IntPtr handle)
{
this.handle = handle;
} #endregion /// <summary>
/// 获取系统 WAVE 声音的音量值(最大音量为255)。
/// </summary>
[Category("系统音量设置")]
[Description("获取系统波形声音音量值(最大音量为255)。")]
[DesignerSerializationVisibility( DesignerSerializationVisibility.Hidden)]
public int SystemWaveVolume
{
get
{
return GetSystemVolume(MixerLineComponeType.WAVEOUT);
}
set
{
int volume = 0;
if (value > 255)
volume = 255;
else if (value < 0)
volume = 0;
else
volume = value;
SetSystemVolume(MixerLineComponeType.WAVEOUT, value);
}
} /// <summary>
/// 获取系统主声音的音量值(最大音量为255)。
/// </summary>
[Category("系统音量设置")]
[Description("获取系统主声音音量值(最大音量为255)。")]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public int SystemSpeakersVolume
{
get
{
return GetSystemVolume(MixerLineComponeType.SPEAKERS);
}
set
{
int volume = 0;
if (value > 255)
volume = 255;
else if (value < 0)
volume = 0;
else
volume = value;
SetSystemVolume(MixerLineComponeType.SPEAKERS, value);
}
} /// <summary>
/// 获取系统麦克风声音的音量值(最大音量为255)。
/// </summary>
[Browsable(false)]
[Category("系统音量设置")]
[Description("获取系统麦克风声音音量值(最大音量为255)。")]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public int SystemMicroPhoneVolume
{
get
{
return GetSystemVolume(MixerLineComponeType.MICROPHONE);
}
set
{
int volume = 0;
if (value > 255)
volume = 255;
else if (value < 0)
volume = 0;
else
volume = value;
SetSystemVolume(MixerLineComponeType.MICROPHONE, value);
}
} /// <summary>
/// 获取和设置系统波形声音声道。
/// </summary>
[Category("系统音量设置")]
[Description("获取和设置系统波形声音声道。")]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public AudioSource SystemWaveAudioSource
{
get
{
int volL, volR;
GetSystemVolume(out volL, out volR, MixerLineComponeType.WAVEOUT, false); if (volL > volR)
return AudioSource.Left;
else if (volL < volR)
return AudioSource.Right;
else
return AudioSource.Stereo;
}
set
{
SetSystemVolSource(MixerLineComponeType.WAVEOUT, value);
}
}
/// 获取和设置系统主声音声道。
/// </summary>
[Category("系统音量设置")]
[Description("获取和设置系统主声音声道。")]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public AudioSource SystemSpeakersAudioSource
{
get
{
int volL, volR;
GetSystemVolume(out volL, out volR, MixerLineComponeType.SPEAKERS, false); if (volL > volR)
return AudioSource.Left;
else if (volL < volR)
return AudioSource.Right;
else
return AudioSource.Stereo;
}
set
{
SetSystemVolSource(MixerLineComponeType.SPEAKERS, value);
}
} /// <summary>
/// 获取或设置系统 WAVE 静音。true:静音;false:取消静音。
/// </summary>
[Category("系统音量设置")]
[Description("获取或设置系统 WAVE 静音。true:静音;false:取消静音。")]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public bool SystemWaveMute
{
get
{
return GetSystemMute(MixerLineComponeType.WAVEOUT);
}
set
{
SetSystemMute(MixerLineComponeType.WAVEOUT, value);
}
} /// <summary>
/// 获取或设置系统主声音静音。true:静音;false:取消静音。
/// </summary>
[Category("系统音量设置")]
[Description("获取或设置系统主声音静音。true:静音;false:取消静音。")]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public bool SystemSpeakersMute
{
get
{
return GetSystemMute(MixerLineComponeType.SPEAKERS);
}
set
{
SetSystemMute(MixerLineComponeType.SPEAKERS, value);
}
} /// <summary>
/// 获取或设置系统麦克风声音静音。true:静音;false:取消静音。
/// </summary>
[Browsable(false)]
[Category("系统音量设置")]
[Description("获取或设置系统麦克风声音静音。true:静音;false:取消静音。")]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public bool SystemMicroPhoneMute
{
get
{
return GetSystemMute(MixerLineComponeType.MICROPHONE);
}
set
{
SetSystemMute(MixerLineComponeType.MICROPHONE, value);
}
} /// <summary>
/// 获取或设置每次增加或减少的音量值(默认15)。注意:这个是直接调节系统的音量。
/// </summary>
[Category("系统音量设置")]
[Description("获取或设置每次增加或减少的音量值(默认15)。注意:这个是直接调节系统的音量。")]
[DefaultValue(15)]
public int SystemVolumeStep
{
get
{
return systemVolumeStep;
}
set
{
systemVolumeStep = value;
}
} #endregion #region SetSystemVolume 函数 /// <summary>
/// 打开系统声音控制;
/// </summary>
private void MixerOpen()
{
mixerOpen(out hmixer, 0, (int)handle, 0, CALLBACK_WINDOW);
} private bool GetLineContrl(int componentType, int ctrlType, out MIXERCONTROL mxc)
{
MIXERLINECONTROLS mxlc = new MIXERLINECONTROLS();
MIXERLINE mxl = new MIXERLINE();
mxc = new MIXERCONTROL();
int rc = -1;
bool retValue = false; if (hmixer < 1)
{
MixerOpen();
}
if (hmixer > 0)
{
mxl.cbStruct = Marshal.SizeOf(mxl);
mxl.dwComponentType = componentType; rc = mixerGetLineInfoA(hmixer, ref mxl, MIXER_GETLINEINFOF_COMPONENTTYPE);
if (rc == MMSYSERR_NOERROR)
{
int sizeofMIXERCONTROL = 152;
int ctrl = Marshal.SizeOf(typeof(MIXERCONTROL));
mxlc.pamxctrl = Marshal.AllocCoTaskMem(sizeofMIXERCONTROL);
mxlc.cbStruct = Marshal.SizeOf(mxlc);
mxlc.dwLineID = mxl.dwLineID;
mxlc.dwControl = ctrlType;
mxlc.cControls = 1;
mxlc.cbmxctrl = sizeofMIXERCONTROL; // Allocate a buffer for the control
mxc.cbStruct = sizeofMIXERCONTROL; // Get the control
rc = mixerGetLineControlsA(hmixer, ref mxlc, MIXER_GETLINECONTROLSF_ONEBYTYPE); if (rc == MMSYSERR_NOERROR)
{
retValue = true;
// Copy the control into the destination structure
mxc = (MIXERCONTROL)Marshal.PtrToStructure(mxlc.pamxctrl, typeof(MIXERCONTROL));
}
}
}
return retValue;
} private void GetControlID(MixerLineComponeType mixerLCT, out int VolumeControlID, out int MuteControlID)
{
MIXERCONTROL mxcVol = new MIXERCONTROL();
MIXERCONTROL mxcMute = new MIXERCONTROL(); VolumeControlID = -1;
MuteControlID = -1;
int componentType = (int)mixerLCT;
int ctrlTypeVol = MIXERCONTROL_CONTROLTYPE_VOLUME;
int ctrlTypeMute = MIXERCONTROL_CONTROLTYPE_MUTE; GetLineContrl(componentType, ctrlTypeVol, out mxcVol);
GetLineContrl(componentType, ctrlTypeMute, out mxcMute); VolumeControlID = mxcVol.dwControlID;
MuteControlID = mxcMute.dwControlID;
}