이전 포스팅에 USB 장치 인식시 자동으로 Comport를 찾아주는 소스를... (윈폼)
올려 드렸습니다..
이번 포스팅은 WPF에서 USB인식시 Comport를 찾아주는 소스 입니다.
using System; using System.Windows; using System.IO.Ports; using System.Windows.Threading; using System.Windows.Interop; using System.Runtime.InteropServices; namespace Wpf_Serial { ///음 WPF에서 요 코드를 사용하기 전에 WindowsBase 항목을 참조를 해주어야 했던걸로 기억이 납니다../// MainWindow.xaml에 대한 상호 작용 논리 /// public partial class MainWindow : Window { decimal LineNumber = 1; SerialPort SP = new SerialPort(); public MainWindow() { InitializeComponent(); } IntPtr WndProc(IntPtr hWnd, int nMsg, IntPtr wParam, IntPtr lParam, ref bool handled) { UInt32 WM_DEVICECHANGE = 0x0219; UInt32 DBT_DEVTUP_VOLUME = 0x02; UInt32 DBT_DEVICEARRIVAL = 0x8000; UInt32 DBT_DEVICEREMOVECOMPLETE = 0x8004; //디바이스 연결시 if ((nMsg == WM_DEVICECHANGE) && (wParam.ToInt32() == DBT_DEVICEARRIVAL)) { int devType = Marshal.ReadInt32(lParam, 4); if (devType == DBT_DEVTUP_VOLUME) { GetSerialPort(); } } //디바이스 연결 해제시... if((nMsg == WM_DEVICECHANGE) && (wParam.ToInt32() == DBT_DEVICEREMOVECOMPLETE)) { int devType = Marshal.ReadInt32(lParam,4); if(devType == DBT_DEVTUP_VOLUME) { GetSerialPort(); } } return IntPtr.Zero; } private void Window_Loaded(object sender, RoutedEventArgs e) { WindowInteropHelper helper = new WindowInteropHelper(this); HwndSource source = HwndSource.FromHwnd(helper.Handle); source.AddHook(new HwndSourceHook(this.WndProc)); SP.DataReceived += new SerialDataReceivedEventHandler(SP_DataReceived); } private void SP_DataReceived(object sender, SerialDataReceivedEventArgs e) { Dispatcher.Invoke(DispatcherPriority.Normal, new Action(delegate { string str = SP.ReadLine(); textBox1.AppendText("[" + LineNumber++.ToString() + "] : " + str); textBox1.ScrollToEnd(); })); } private void btnPortSearch_Click(object sender, RoutedEventArgs e) { GetSerialPort(); } private void GetSerialPort() { lst_ComPort.Items.Clear(); foreach (string comport in SerialPort.GetPortNames()) { lst_ComPort.Items.Add(comport); } if (lst_ComPort.Items.Count <= 0) { lst_ComPort.Items.Add("찾을 수 없음"); } } private void btnPortOpen_Click(object sender, RoutedEventArgs e) { if (SP.IsOpen) { } else { SP.Open(); } } private void lst_ComPort_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e) { SP.PortName = lst_ComPort.SelectedItem.ToString(); } private void btnPortClose_Click(object sender, RoutedEventArgs e) { if (SP.IsOpen) { SP.Close(); } } } }