因为自己写的小程序需要在工作时间把本本静音、切换IP的操作,查了win API切换静音是调用同一个函数,无法判断系统是否处在静音的状态。而且旧的API代码对Vista/win7支持不好,这里提供两种解决方案(至于判断系统是否静音尚缺中文资料,故撰写此文以供需要的朋友参考),一种是旧的,下面先贴的代码是大家基本上都能找到的:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Runtime.InteropServices; using System.Windows.Forms; //CoreAudioApi支持最新的Vista/Win7作業系統,下麵的代碼可能是較早的API版本,不推薦使用 namespace SwitchIP { class VolumeControl { //调用该函数的窗体 public Form myForm; [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, uint wParam, uint lParam); const uint WM_APPCOMMAND = 0x319; const uint APPCOMMAND_VOLUME_UP = 0x0a; const uint APPCOMMAND_VOLUME_DOWN = 0x09; const uint APPCOMMAND_VOLUME_MUTE = 0x08; //增大音量 public void VolumeUp(){ SendMessage(myForm.Handle, WM_APPCOMMAND, 0x30292, APPCOMMAND_VOLUME_UP * 0x10000); } //降低音量 public void VolumeDown() { SendMessage(myForm.Handle, WM_APPCOMMAND, 0x30292, APPCOMMAND_VOLUME_DOWN * 0x10000); } //该函数会自动在静音和非静音状态下切换 public void VolumeMute() { SendMessage(myForm.Handle, WM_APPCOMMAND, 0x200eb0, APPCOMMAND_VOLUME_MUTE * 0x10000); } } }
第二种也是推荐的方法,仅在win7上测试过:
这里引用了国外友人封装好的Audio类(包含更多的音频操作),具体代码下载可以参考如下链接
using CoreAudioApi; /*QFord@QQ.COM 需要引用CoreAudioApi.dll 可在下面的链接中找到 */ ...... private MMDevice defaultDevice = null; ...... /*參考資料 http://www.codeproject.com/KB/vista/CoreAudio.aspx?msg=2747721 */ //判斷當前系統揚聲器狀態 private bool isMuted() { return defaultDevice.AudioEndpointVolume.Mute; } //靜音 private void setMute() { defaultDevice.AudioEndpointVolume.Mute = true; } //解除靜音 private void setUnMute() { defaultDevice.AudioEndpointVolume.Mute = false; } //初始化MMDevice private void muteInit() { MMDeviceEnumerator devEnum = new MMDeviceEnumerator(); defaultDevice = devEnum.GetDefaultAudioEndpoint(EDataFlow.eRender, ERole.eMultimedia); }