2012-09-05 84 views
0

如何知道WPF中的設備是插入還是拔出?WndProc檢測設備拔下並插入

我使用下面的代碼來檢測設備的變化:

private void OnSourceInitialized(object sender, EventArgs e) 
      { 
       IntPtr windowHandle = (new WindowInteropHelper(this)).Handle; 
       HwndSource src = HwndSource.FromHwnd(windowHandle); 
       src.AddHook(new HwndSourceHook(WndProc)); 
      } 

      private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled) 
      { 
       // Handle WM_DEVICECHANGE... 
       if (msg == 0x219) 
       { 
        InitHead(); 
       } 

       return IntPtr.Zero; 
      } 

謝謝。

編輯:

我沒了下文,仍然沒有工作:

if (msg == 0x0219) 
      { 
       switch (wParam.ToInt32()) 
       { 
        case 0x8000: 
         { 
          InitHead(); 
         } 
         break; 
       } 
      } 
+0

它的工作。但我想知道設備是插入還是插入。 – Alvin

+0

RTFM:http://msdn.microsoft.com/en-us/library/windows/desktop/aa363480.aspx,DBT_DEVICEARRIVAL/DBT_DEVICEREMOVECOMPLETE/etc。 – Tergiver

+0

我讀過,但wParam不返回。 – Alvin

回答

3

要檢測一個設備已插入的,我們掛鉤加入到我們的Window_Loaded方法如下所示

HwndSource source = HwndSource.FromHwnd(new WindowInteropHelper(this).Handle); 
source.AddHook(new HwndSourceHook(this.WndProc)); 

處理程序如下所示:

private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled) 
{ 
    if (msg == 0x0219 && (int)wParam == 0x8000) // 0x8000 is DBT_DEVICEARRIVAL 
    { 
     ProcessConnected(); 
    } 

    return IntPtr.Zero; 
} 

不幸的是,當拔下某個設備時,沒有觸發DBT_DEVICE常量,而是在您嘗試從Windows彈出設備時調用它們。