2010-03-24 106 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

相关问题