Я пишу приложение WPF, которое хочет получить доступ к цифровой камере, и я безумно ищу решения, и я очень доволен тем, как все идет.
Это то, что у меня есть в данный момент:
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 не отображается в этом разделе и, похоже, с ним не связана буква диска ...
Но вот мой главный вопрос, почемуWindows-сообщение DBT_DEVNODES_CHANGED срабатывает, когда я добавляю iPhone, но сообщение DBT_DEVICEARRIVAL срабатывает, когда я добавляю камеру?
В идеале я хотел бы иметь возможность «получать» файлы с любого USB-устройства, когда пользователь подключает его.
У кого-нибудь есть опыт работы с этим?Мои программы на Win32 очень ограничены ...
Приветствия, Марк