첨부 실행 코드는 나눔고딕코딩 폰트를 사용합니다.
본 블로그는 광고를 포함하고 있습니다.
광고 클릭에서 발생하는 수익금은 모두 블로그 콘텐츠 향상을 위해 쓰여집니다.

728x90
반응형

TestProject.zip
0.16MB

▶ MainForm.cs

using System;
using System.Media;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace TestProject
{
    /// <summary>
    /// 메인 폼
    /// </summary>
    public partial class MainForm : Form
    {
        //////////////////////////////////////////////////////////////////////////////////////////////////// Import
        ////////////////////////////////////////////////////////////////////////////////////////// Static
        //////////////////////////////////////////////////////////////////////////////// Private

        #region WAVE OUT 볼률 설정하기 - waveOutSetVolume(waveOutHandle, volume)

        /// <summary>
        /// WAVE OUT 볼률 설정하기
        /// </summary>
        /// <param name="waveOutHandle">WAVE OUT 핸들</param>
        /// <param name="volume">볼륨</param>
        /// <returns>처리 결과</returns>
        [DllImport("winmm")]
        private static extern int waveOutSetVolume(IntPtr waveOutHandle, uint volume);

        #endregion
        #region WAVE OUT 볼륨 구하기 - waveOutGetVolume(waveOutHandle, volume)

        /// <summary>
        /// WAVE OUT 볼륨 구하기
        /// </summary>
        /// <param name="waveOutHandle">WAVE OUT 핸들</param>
        /// <param name="volume">볼륨</param>
        /// <returns>처리 결과</returns>
        [DllImport("winmm")]
        private static extern int waveOutGetVolume(IntPtr waveOutHandle, out uint volume);

        #endregion
        #region 메시지 보내기 - SendMessage(windowHandle, message, wordParameter, longParameter)

        /// <summary>
        /// 메시지 보내기
        /// </summary>
        /// <param name="windowHandle">윈도우 핸들</param>
        /// <param name="message">메시지</param>
        /// <param name="wordParameter">WORD 매개 변수</param>
        /// <param name="longParameter">LONG 매개 변수</param>
        /// <returns>처리 결과</returns>
        [DllImport("user32")]
        private static extern IntPtr SendMessage(IntPtr windowHandle, int message, IntPtr wordParameter, IntPtr longParameter);

        #endregion

        //////////////////////////////////////////////////////////////////////////////////////////////////// Field
        ////////////////////////////////////////////////////////////////////////////////////////// Private

        #region Field

        /// <summary>
        /// WM_APPCOMMAND
        /// </summary>
        private const int WM_APPCOMMAND = 0x319;

        /// <summary>
        /// APPCOMMAND_VOLUME_MUTE
        /// </summary>
        private const int APPCOMMAND_VOLUME_MUTE = 0x80000;

        #endregion

        //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor
        ////////////////////////////////////////////////////////////////////////////////////////// Public

        #region 생성자 - MainForm()

        /// <summary>
        /// 생성자
        /// </summary>
        public MainForm()
        {
            InitializeComponent();

            SetVolumeSlider();
        }

        #endregion

        //////////////////////////////////////////////////////////////////////////////////////////////////// Method
        ////////////////////////////////////////////////////////////////////////////////////////// Private
        //////////////////////////////////////////////////////////////////////////////// Event

        #region 왼쪽 볼륨 슬라이더 스크롤시 처리하기 - leftVolumeSlider_Scroll(sender, e)

        /// <summary>
        /// 왼쪽 볼륨 슬라이더 스크롤시 처리하기
        /// </summary>
        /// <param name="sender">이벤트 발생자</param>
        /// <param name="e">이벤트 인자</param>
        private void leftVolumeSlider_Scroll(object sender, EventArgs e)
        {
            if(this.autoBalanceCheckBox.Checked)
            {
                this.rightVolumeSlider.Value = this.leftVolumeSlider.Value;
            }

            SetVolume();
        }

        #endregion
        #region 오른쪽 볼륨 슬라이더 스크롤시 처리하기 - rightVolumeSlider_Scroll(sender, e)

        /// <summary>
        /// 오른쪽 볼륨 슬라이더 스크롤시 처리하기
        /// </summary>
        /// <param name="sender">이벤트 발생자</param>
        /// <param name="e">이벤트 인자</param>
        private void rightVolumeSlider_Scroll(object sender, EventArgs e)
        {
            if(this.autoBalanceCheckBox.Checked)
            {
                this.leftVolumeSlider.Value = this.rightVolumeSlider.Value;
            }

            SetVolume();
        }

        #endregion
        #region 무음 버튼 클릭시 처리하기 - muteButton_Click(sender, e)

        /// <summary>
        /// 무음 버튼 클릭시 처리하기
        /// </summary>
        /// <param name="sender">이벤트 발생자</param>
        /// <param name="e">이벤트 인자</param>
        private void muteButton_Click(object sender, EventArgs e)
        {
            SendMessage(this.Handle, WM_APPCOMMAND, IntPtr.Zero, (IntPtr)APPCOMMAND_VOLUME_MUTE);
        }

        #endregion
        #region 재생 버튼 클릭시 처리하기 - playButton_Click(sender, e)

        /// <summary>
        /// 재생 버튼 클릭시 처리하기
        /// </summary>
        /// <param name="sender">이벤트 발생자</param>
        /// <param name="e">이벤트 인자</param>
        private void playButton_Click(object sender, EventArgs e)
        {
            SoundPlayer player = new SoundPlayer();

            player.SoundLocation = "Test.wav";

            player.Play();
        }

        #endregion
        #region 자동 밸런스 체크 박스 체크 변경시 처리하기 - autoBalanceCheckBox_CheckedChanged(sender, e)

        /// <summary>
        /// 자동 밸런스 체크 박스 체크 변경시 처리하기
        /// </summary>
        /// <param name="sender">이벤트 발생자</param>
        /// <param name="e">이벤트 인자</param>
        private void autoBalanceCheckBox_CheckedChanged(object sender, EventArgs e)
        {
            if(this.autoBalanceCheckBox.Checked)
            {
                int volume = (this.leftVolumeSlider.Value + this.rightVolumeSlider.Value) / 2;

                this.leftVolumeSlider.Value  = volume;
                this.rightVolumeSlider.Value = volume;

                SetVolume();
            }
        }

        #endregion

        //////////////////////////////////////////////////////////////////////////////// Function

        #region 볼륨 슬라이더 설정하기 - SetVolumeSlider()

        /// <summary>
        /// 볼륨 슬라이더 설정하기
        /// </summary>
        private void SetVolumeSlider()
        {
            uint volume;

            waveOutGetVolume(IntPtr.Zero, out volume);

            int leftVolume  = (int)(volume & 0xFFFF);
            int rightVolume = (int)((volume >> 16) & 0xFFFF);

            this.leftVolumeSlider.Value  = leftVolume;
            this.rightVolumeSlider.Value = rightVolume;
        }

        #endregion
        #region 볼륨 설정하기 - SetVolume()

        /// <summary>
        /// 볼륨 설정하기
        /// </summary>
        private void SetVolume()
        {
            uint volume = (uint)(this.leftVolumeSlider.Value + (this.rightVolumeSlider.Value << 16));

            waveOutSetVolume(IntPtr.Zero, volume);
        }

        #endregion
    }
}
728x90
반응형
그리드형(광고전용)
Posted by 사용자 icodebroker
TAG , ,

댓글을 달아 주세요