2010-03-24 56 views
1

我正在編寫一個想要訪問數碼相機的WPF應用程序,並且一直瘋狂地搜索解決方案,我很滿意它的一切。如何使用USB從設備獲取文件

這是我的時刻:

private const decimal WM_DEVICECHANGE = 0x0219; 
    private const int DBT_DEVTYP_HANDLE = 6; 
    private const int DBT_DEVNODES_CHANGED = 7; 
    private const int BROADCAST_QUERY_DENY = 0x424D5144; 
    private const int DBT_DEVICEARRIVAL = 0x8000; // system detected a new device 
    private const int DBT_DEVICEQUERYREMOVE = 0x8001; // Preparing to remove (any program can disable the removal) 
    private const int DBT_DEVICEREMOVECOMPLETE = 0x8004; // removed 
    private const int DBT_DEVTYP_VOLUME = 0x00000002; // drive type is logical volume 

    protected override void OnSourceInitialized(EventArgs e) 
    { 
     base.OnSourceInitialized(e); 
     var mainFormWinInteropHelper = new System.Windows.Interop.WindowInteropHelper(this); 
     System.Windows.Interop.HwndSource.FromHwnd(mainFormWinInteropHelper.Handle).AddHook(HwndHandler); 
    } 

    private IntPtr HwndHandler(IntPtr hwnd, int msg, IntPtr wparam, IntPtr lparam, ref bool handled) 
    { 
     ProcessWinMessage(msg, wparam, lparam); 
     handled = false; 
     return IntPtr.Zero; 
    } 

    private void ProcessWinMessage(int msg, IntPtr wparam, IntPtr lparam) 
    { 
     int deviceType; 
     char driveLetter; 

     if (msg == WM_DEVICECHANGE) 
     { 
      var int32 = wparam.ToInt32(); 

      switch (int32) 
      { 
       case DBT_DEVICEARRIVAL: 
        Console.WriteLine("Device Arrival"); 
        break; 
       case DBT_DEVICEQUERYREMOVE: 
        Console.WriteLine("Device Query Removed"); 
        break; 
       case DBT_DEVICEREMOVECOMPLETE: 
        Console.WriteLine("Device Removed"); 
        break; 
       case DBT_DEVNODES_CHANGED: 
        Console.WriteLine("Device added or removed"); 
        break; 
      } 
     } 
    } 

其實,這一切爲我的數碼相機的偉大工程,我能得到的照片關閉它。我現在應該注意到,當我插入相機時,它出現在「可移動存儲設備」下的窗口中,並且它有一個分配給它的驅動器號。

然而,當我插入我的iPhone進行測試,iPhone不根據該條出現,並沒有出現有關聯的驅動器盤符...

但這裏是我的主要問題,爲什麼添加iPhone時,Windows消息DBT_DEVNODES_CHANGED會觸發,但添加攝像頭時會觸發DBT_DEVICEARRIVAL消息?

我非常希望能夠從任何USB設備「獲取」文件,當用戶在插入它。

有沒有人有這方面的經驗?我的Win32編程是非常有限......

乾杯, 馬克

回答

2

有兩種類型的USB媒體提供的。 USB大容量存儲設備的功能與簡單相機和便攜式媒體播放器的驅動器和Windows媒體設備類似。

某些相機(通常便宜的)只實現Windows Media Device模型,而其他相機則實現USB Mass Storage模型。

從您的解釋中,iPhone被視爲Windows媒體設備,而相機是USB大容量存儲設備。我知道有一些Apple設備(特別是觸摸世代)會在設備上出現圖片或屏幕截圖時突然切換到WMD模式。嘗試刪除使用iPhone拍攝的所有屏幕截圖或圖片,看看它是否解決了問題,如果是這樣,這是因爲您的代碼不支持Windows Media設備模型。

MSDN library可以幫助你解決這個爛攤子。他們多次更新了API,停止了其中的一些部分,在其他地方添加了更多,現在看起來他們有了一個新版本,可以解決這個問題。

+0

謝謝,實際上,我並不太在意蘋果設備無法工作,我真的只需要攝像頭就可以工作。我對這一切都更加好奇,如果它會變得艱難,那麼在這個時候,數碼相機會出現病態。 – Mark 2010-03-24 04:25:41

+0

問題是大多數相機僅支持Windows媒體設備型號。作爲USB羣發存儲的相機是少數,或者至多幾年前它們是少數。祝你好運。 – Coincoin 2010-03-24 04:28:32

+0

我明白了,那麼如何在媒體設備上以編程方式訪問文件? – Mark 2010-03-24 05:03:21

相關問題