첨부 소스 코드는 나눔고딕코딩 폰트를 사용합니다.
728x90
반응형
728x170

TestProject.zip
다운로드

▶ USBHelper.cs

using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;

namespace TestProject
{
    /// <summary>
    /// USB 헬퍼
    /// </summary>
    public class USBHelper : IDisposable
    {
        //////////////////////////////////////////////////////////////////////////////////////////////////// Import
        ////////////////////////////////////////////////////////////////////////////////////////// Static
        //////////////////////////////////////////////////////////////////////////////// Private

        #region 장치 통지 등록하기 - RegisterDeviceNotification(recipientHandle, notificationFilter, flag)

        /// <summary>
        /// 장치 통지 등록하기
        /// </summary>
        /// <param name="recipientHandle">수취인 핸들</param>
        /// <param name="notificationFilter">통지 필터</param>
        /// <param name="flag">플래그</param>
        /// <returns>장치 통지 핸들</returns>
        [DllImport("user32.dll", SetLastError = true)]
        private static extern IntPtr RegisterDeviceNotification(IntPtr recipientHandle, IntPtr notificationFilter, uint flag);

        #endregion
        #region 장치 통지 등록 취소하기 - UnregisterDeviceNotification(handle)

        /// <summary>
        /// 장치 통지 등록 취소하기
        /// </summary>
        /// <param name="handle">핸들</param>
        /// <returns>처리 결과</returns>
        [DllImport("user32.dll", SetLastError = true)]
        private static extern bool UnregisterDeviceNotification(IntPtr handle);

        #endregion

        //////////////////////////////////////////////////////////////////////////////////////////////////// Field
        ////////////////////////////////////////////////////////////////////////////////////////// Public

        #region Field

        /// <summary>
        /// WM_DEVICECHANGE
        /// </summary>
        public const int WM_DEVICECHANGE = 0x0219;

        /// <summary>
        /// DBT_DEVTYP_DEVICEINTERFACE
        /// </summary>
        public const int DBT_DEVTYP_DEVICEINTERFACE = 0x05;

        /// <summary>
        /// DEVICE_NOTIFY_WINDOW_HANDLE
        /// </summary>
        public const int DEVICE_NOTIFY_WINDOW_HANDLE = 0x00000000;

        #endregion

        ////////////////////////////////////////////////////////////////////////////////////////// Private

        #region Field

        /// <summary>
        /// 장치 통지 핸들 리스트
        /// </summary>
        private List<IntPtr> deviceNotificationHandleList = new List<IntPtr>();

        private Guid[] DEVINTERFACE_GUID_ARRAY =
        {
            // GUID_DEVINTERFACE_USB_DEVICE
            new Guid(0xA5DCBF10, 0x6530, 0x11D2, 0x90, 0x1F, 0x00, 0xC0, 0x4F, 0xB9, 0x51, 0xED),

            // GUID_DEVINTERFACE_COMPORT
            new Guid(0x86e0d1e0, 0x8089, 0x11d0, 0x9c, 0xe4, 0x08, 0x00, 0x3e, 0x30, 0x1f, 0x73),

            // GUID_DEVINTERFACE_MODEM
            new Guid(0x2c7089aa, 0x2e0e, 0x11d1, 0xb1, 0x14, 0x00, 0xc0, 0x4f, 0xc2, 0xaa, 0xe4),

            // GUID_DEVINTERFACE_DISK
            new Guid(0x53f56307, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b),

            // GUID_DEVINTERFACE_HID, 
            new Guid(0x4D1E55B2, 0xF16F, 0x11CF, 0x88, 0xCB, 0x00, 0x11, 0x11, 0x00, 0x00, 0x30),

            // GUID_NDIS_LAN_CLASS
            new Guid(0xad498944, 0x762f, 0x11d0, 0x8d, 0xcb, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c),

            // GUID_DEVINTERFACE_SERENUM_BUS_ENUMERATOR
            new Guid(0x4D36E978, 0xE325, 0x11CE, 0xBF, 0xC1, 0x08, 0x00, 0x2B, 0xE1, 0x03, 0x18),

            // GUID_DEVINTERFACE_PARALLEL
            new Guid(0x97F76EF0, 0xF883, 0x11D0, 0xAF, 0x1F, 0x00, 0x00, 0xF8, 0x00, 0x84, 0x5C),

            // GUID_DEVINTERFACE_PARCLASS
            new Guid(0x811FC6A5, 0xF728, 0x11D0, 0xA5, 0x37, 0x00, 0x00, 0xF8, 0x75, 0x3E, 0xD1)
        };

        #endregion

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

        #region 생성자 - USBHelper(windowHandle)

        /// <summary>
        /// 생성자
        /// </summary>
        /// <param name="windowHandle">윈도우 핸들</param>
        public unsafe USBHelper(IntPtr windowHandle)
        {
            DEV_BROADCAST_HDR filter = new DEV_BROADCAST_HDR();

            filter.Size       = DEV_BROADCAST_HDR.DefaultSize;
            filter.DeviceType = DBT_DEVTYP_DEVICEINTERFACE;

            foreach(Guid guid in DEVINTERFACE_GUID_ARRAY)
            {
                filter.ClassGUID = guid;

                DEV_BROADCAST_HDR* filterPointer = &filter;

                IntPtr filterHandle = new IntPtr(filterPointer);

                IntPtr deviceNotificationHandle = RegisterDeviceNotification(windowHandle, filterHandle, DEVICE_NOTIFY_WINDOW_HANDLE);

                if(deviceNotificationHandle == IntPtr.Zero)
                {
                    throw new InvalidOperationException("장치 통지 등록을 실패했습니다 : " + guid.ToString());
                }
                else
                {
                    this.deviceNotificationHandleList.Add(deviceNotificationHandle);
                }
            }
        }

        #endregion

        //////////////////////////////////////////////////////////////////////////////////////////////////// Method
        ////////////////////////////////////////////////////////////////////////////////////////// Public

        #region 리소스 해제하기 - Dispose()

        /// <summary>
        /// 리소스 해제하기
        /// </summary>
        public void Dispose()
        {
            foreach(IntPtr deviceNotificationHandle in this.deviceNotificationHandleList)
            {
                UnregisterDeviceNotification(deviceNotificationHandle);
            }
        }

        #endregion
    }
}

 

728x90

 

▶ MainForm.cs

using System;
using System.ComponentModel;
using System.Windows.Forms;

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

        #region Field

        /// <summary>
        /// USB 헬퍼
        /// </summary>
        private USBHelper helper;

        #endregion

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

        #region 생성자 - MainForm()

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

             this.helper = new USBHelper(Handle);
        }

        #endregion

        //////////////////////////////////////////////////////////////////////////////////////////////////// Method
        ////////////////////////////////////////////////////////////////////////////////////////// Protected

        #region 닫을 경우 처리하기 - OnClosing(e)

        /// <summary>
        /// 닫을 경우 처리하기
        /// </summary>
        /// <param name="e">이벤트 인자</param>
        protected override void OnClosing(CancelEventArgs e)
        {
            if(this.helper != null)
            {
                this.helper.Dispose();
            }

            base.OnClosing(e);
        }

        #endregion
        #region 윈도우 프로시저 처리하기 - WndProc(message)

        /// <summary>
        /// 윈도우 프로시저 처리하기
        /// </summary>
        /// <param name="message">메시지</param>
        protected override void WndProc(ref Message message)
        {
            if(message.Msg == USBHelper.WM_DEVICECHANGE)
            {
                this.listBox.Items.Add(DateTime.Now.ToString("HH:mm:ss") + " : " + message.Msg + ", " + message.WParam.ToInt64() + ", " + message.LParam.ToInt64());
            }

            base.WndProc(ref message);
        }

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

댓글을 달아 주세요