因为自己写的小程序需要在工作时间把本本静音、切换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);
}
本文介绍两种在Windows系统中实现音量控制及静音状态切换的方法。第一种为传统API调用,适用于早期系统;第二种推荐方法利用CoreAudioApi库,支持最新系统如Win7,并提供静音状态判断。
3939

被折叠的 条评论
为什么被折叠?



