728x90
반응형
728x170
▶ IMMDevice.cs
using System;
using System.Runtime.InteropServices;
namespace TestProject
{
/// <summary>
/// 멀티 미디어 디바이스 인터페이스
/// </summary>
[Guid("D666063F-1587-4E43-81F1-B948E807363F"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IMMDevice
{
//////////////////////////////////////////////////////////////////////////////////////////////////// Method
#region 활성화하기 - Activate(interfaceID, classContext, activationParameter, interfaceObject)
/// <summary>
/// 활성화하기
/// </summary>
/// <param name="interfaceID">인터페이스 ID</param>
/// <param name="classContext">클래스 컨텍스트</param>
/// <param name="activationParameter">활성화 매개 변수</param>
/// <param name="interfaceObject">인터페이스 객체</param>
/// <returns>처리 결과</returns>
int Activate
(
[MarshalAs(UnmanagedType.LPStruct)] Guid interfaceID,
int classContext,
IntPtr activationParameter,
[MarshalAs(UnmanagedType.IUnknown)] out object interfaceObject
);
#endregion
}
}
728x90
▶ IMMDeviceEnumerator.cs
using System;
using System.Runtime.InteropServices;
namespace TestProject
{
/// <summary>
/// 멀티 미디어 디바이스 열거자 인터페이스
/// </summary>
[ComImport]
[Guid("A95664D2-9614-4F35-A746-DE8DB63617E6"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IMMDeviceEnumerator
{
//////////////////////////////////////////////////////////////////////////////////////////////////// Method
#region ??? - _VtblGap1_1()
/// <summary>
/// ???
/// </summary>
void _VtblGap1_1();
#endregion
#region 디폴트 오디오 종점 구하기 - GetDefaultAudioEndpoint(dataFlow, role, mmDevice)
/// <summary>
/// 디폴트 오디오 종점 구하기
/// </summary>
/// <param name="dataFlow">데이터 플로우</param>
/// <param name="role">역할</param>
/// <param name="mmDevice">멀티 미디어 디바이스</param>
/// <returns>처리 결과</returns>
int GetDefaultAudioEndpoint(int dataFlow, int role, out IMMDevice mmDevice);
#endregion
}
}
300x250
▶ IAudioEndpointVolume.cs
using System;
using System.Runtime.InteropServices;
namespace TestProject
{
/// <summary>
/// 오디오 종점 볼륨 인터페이스
/// </summary>
[Guid("5CDF2C82-841E-4546-9722-0CF74078229A"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IAudioEndpointVolume
{
//////////////////////////////////////////////////////////////////////////////////////////////////// Method
#region 컨트롤 변경 통지 등록하기 - RegisterControlChangeNotify(audioEndpointVolumeCallbackHandle)
/// <summary>
/// 컨트롤 변경 통지 등록하기
/// </summary>
/// <param name="audioEndpointVolumeCallbackHandle">오디오 종점 볼륨 콜백 핸들</param>
/// <returns>처리 결과</returns>
int RegisterControlChangeNotify(IntPtr audioEndpointVolumeCallbackHandle);
#endregion
#region 컨트롤 변경 통지 등록 취소하기 - UnregisterControlChangeNotify(audioEndpointVolumeCallbackHandle)
/// <summary>
/// 컨트롤 변경 통지 등록 취소하기
/// </summary>
/// <param name="audioEndpointVolumeCallbackHandle">오디오 종점 볼륨 콜백 핸들</param>
/// <returns>처리 결과</returns>
int UnregisterControlChangeNotify(IntPtr audioEndpointVolumeCallbackHandle);
#endregion
#region 채널 수 구하기 - GetChannelCount(channelCount)
/// <summary>
/// 채널 수 구하기
/// </summary>
/// <param name="channelCount">채널 수</param>
/// <returns>처리 결과</returns>
int GetChannelCount(ref uint channelCount);
#endregion
#region 마스터 볼륨 레벨 설정하기 - SetMasterVolumeLevel(levelDB, eventContextGUID)
/// <summary>
/// 마스터 볼륨 레벨 설정하기
/// </summary>
/// <param name="levelDB">레벨(단위 : DB)</param>
/// <param name="eventContextGUID">이벤트 컨텍스트 GUID</param>
/// <returns>처리 결과</returns>
int SetMasterVolumeLevel(float levelDB, Guid eventContextGUID);
#endregion
#region 마스터 볼륨 레벨 스칼라 설정하기 - SetMasterVolumeLevelScalar(level, eventContextGUID)
/// <summary>
/// 마스터 볼륨 레벨 스칼라 설정하기
/// </summary>
/// <param name="level">레벨</param>
/// <param name="eventContextGUID">이벤트 컨텍스트 GUID</param>
/// <returns>처리 결과</returns>
int SetMasterVolumeLevelScalar(float level, Guid eventContextGUID);
#endregion
#region 마스터 볼륨 레벨 구하기 - GetMasterVolumeLevel(levelDB)
/// <summary>
/// 마스터 볼륨 레벨 구하기
/// </summary>
/// <param name="levelDB">레벨 (단위 : decibel)</param>
/// <returns>처리 결과</returns>
int GetMasterVolumeLevel(ref float levelDB);
#endregion
#region 마스터 볼륨 레벨 스칼라 구하기 - GetMasterVolumeLevelScalar(level)
/// <summary>
/// 마스터 볼륨 레벨 스칼라 구하기
/// </summary>
/// <param name="level">레벨</param>
/// <returns>처리 결과</returns>
int GetMasterVolumeLevelScalar(ref float level);
#endregion
}
}
▶ MMDeviceEnumeratorFactory.cs
using System;
namespace TestProject
{
/// <summary>
/// 멀티 미디어 열거자 팩토리
/// </summary>
public static class MMDeviceEnumeratorFactory
{
//////////////////////////////////////////////////////////////////////////////////////////////////// Method
////////////////////////////////////////////////////////////////////////////////////////// Static
//////////////////////////////////////////////////////////////////////////////// Public
#region 인스턴스 생성하기 - CreateInstance()
/// <summary>
/// 인스턴스 생성하기
/// </summary>
/// <returns>인스턴스</returns>
public static IMMDeviceEnumerator CreateInstance()
{
return (IMMDeviceEnumerator)Activator.CreateInstance(Type.GetTypeFromCLSID(new Guid("BCDE0395-E52F-467C-8E3D-C4579291692E")));
}
#endregion
}
}
▶ SoundVolumeHelper.cs
using System;
namespace TestProject
{
/// <summary>
/// 사운드 볼륨 헬퍼
/// </summary>
public static class SoundVolumeHelper
{
//////////////////////////////////////////////////////////////////////////////////////////////////// Method
////////////////////////////////////////////////////////////////////////////////////////// Static
//////////////////////////////////////////////////////////////////////////////// Public
#region 사운드 볼륨 설정하기 - SetSoundVolume(volume)
/// <summary>
/// 사운드 볼륨 설정하기
/// </summary>
/// <param name="volume">볼륨</param>
/// <returns>처리 결과</returns>
public static bool SetSoundVolume(int volume)
{
bool result = false;
try
{
IMMDeviceEnumerator enumerator = MMDeviceEnumeratorFactory.CreateInstance();
IMMDevice device;
const int RENDER = 0;
const int MULTIMEDIA = 1;
enumerator.GetDefaultAudioEndpoint(RENDER, MULTIMEDIA, out device);
object interfaceObject;
device.Activate(typeof(IAudioEndpointVolume).GUID, 0, IntPtr.Zero, out interfaceObject);
IAudioEndpointVolume audioEndpointVolume = (IAudioEndpointVolume)interfaceObject;
Guid zeroGuid = new Guid();
audioEndpointVolume.SetMasterVolumeLevelScalar(volume / 100f, zeroGuid);
result = true;
}
catch
{
}
return result;
}
#endregion
#region 사운드 볼륨 구하기 - GetSoundVolume(volume)
/// <summary>
/// 사운드 볼륨 구하기
/// </summary>
/// <param name="volume">볼륨</param>
/// <returns>처리 결과</returns>
public static bool GetSoundVolume(out int volume)
{
bool result = false;
volume = -1;
try
{
IMMDeviceEnumerator enumerator = MMDeviceEnumeratorFactory.CreateInstance();
IMMDevice device;
const int RENDER = 0;
const int MULTIMEDIA = 1;
enumerator.GetDefaultAudioEndpoint(RENDER, MULTIMEDIA, out device);
object intrefaceObject;
device.Activate(typeof(IAudioEndpointVolume).GUID, 0, IntPtr.Zero, out intrefaceObject);
IAudioEndpointVolume audioEndpointVolume = (IAudioEndpointVolume)intrefaceObject;
float currentVolume = 0;
audioEndpointVolume.GetMasterVolumeLevelScalar(ref currentVolume);
volume = Convert.ToInt32(currentVolume * 100f);
result = true;
}
catch
{
}
return result;
}
#endregion
}
}
▶ MainForm.cs
using System;
using System.Windows.Forms;
namespace TestProject
{
/// <summary>
/// 메인 폼
/// </summary>
public partial class MainForm : Form
{
//////////////////////////////////////////////////////////////////////////////////////////////////// Constructor
////////////////////////////////////////////////////////////////////////////////////////// Public
#region 생성자 - MainForm()
/// <summary>
/// 생성자
/// </summary>
public MainForm()
{
InitializeComponent();
this.setVolumeButton.Click += setVolumeButton_Click;
this.getVolumeButton.Click += getVolumeButton_Click;
}
#endregion
//////////////////////////////////////////////////////////////////////////////////////////////////// Method
////////////////////////////////////////////////////////////////////////////////////////// Private
#region 볼륨 설정하기 버튼 클릭시 처리하기 - setVolumeButton_Click(sender, e)
/// <summary>
/// 볼륨 설정하기 버튼 클릭시 처리하기
/// </summary>
/// <param name="sender">이벤트 발생자</param>
/// <param name="e">이벤트 인자</param>
private void setVolumeButton_Click(object sender, EventArgs e)
{
SoundVolumeHelper.SetSoundVolume(100);
}
#endregion
#region 볼륨 구하기 버튼 클릭시 처리하기 - getVolumeButton_Click(sender, e)
/// <summary>
/// 볼륨 구하기 버튼 클릭시 처리하기
/// </summary>
/// <param name="sender">이벤트 발생자</param>
/// <param name="e">이벤트 인자</param>
private void getVolumeButton_Click(object sender, EventArgs e)
{
int volume;
SoundVolumeHelper.GetSoundVolume(out volume);
MessageBox.Show(volume.ToString());
}
#endregion
}
}
728x90
반응형
그리드형(광고전용)
'C# > Common' 카테고리의 다른 글
[C#/COMMON] IN 조건 문자열 구하기 (0) | 2020.06.10 |
---|---|
[C#/COMMON] Buffer 클래스 : BlockCopy 메소드를 사용해 배열 복사하기 (0) | 2020.06.09 |
[C#/COMMON] FileInfo 클래스 : 특정 디렉토리 경로에서 파일 크기가 0보다 큰 파일 정보 리스트 구하기 (0) | 2020.06.08 |
[C#/COMMON] Ping 클래스 : 네트워크 연결 여부 구하기 (0) | 2020.06.04 |
[C#/COMMON] Process 클래스 : Start 정적 메소드를 사용해 파일 탐색기 실행하기 (0) | 2020.06.04 |
[C#/COMMON] Regex 클래스 : IsMatch 정적 메소드를 사용해 특정 파일 확장자를 갖는 파일 구하기 (0) | 2020.06.04 |
[C#/COMMON] 라운드 트립 서식을 사용해 double 값 문자열 구하기 (0) | 2020.05.26 |
[C#/COMMON] 어셈블리(Assembly) 빌드 번호 자동 증가시키기 (0) | 2020.05.24 |
[C#/COMMON] PerformanceCounter 클래스 : NextValue 메소드를 사용해 PC 사용 시간 구하기 (0) | 2020.05.22 |
[C#/COMMON] 엣지 브라우저 실행하기 (0) | 2020.04.12 |
댓글을 달아 주세요