J'écris une application WPF qui veut accéder à un appareil photo numérique. J'ai beaucoup cherché des solutions sur Google et je suis assez satisfait de la façon dont cela se passe.
C'est ce que j'ai pour le moment :
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;
}
}
}
En fait, tout cela fonctionne parfaitement avec mon appareil photo numérique et je peux en extraire les photos. Je dois noter que lorsque je branche mon appareil photo, il apparaît dans Windows sous la rubrique "périphériques avec stockage amovible" et une lettre de lecteur lui est attribuée.
Cependant Lorsque j'ai branché mon iPhone pour le tester, l'iPhone n'apparaît pas dans cette section et ne semble pas avoir de lettre de lecteur associée...
Mais voici ma question principale : pourquoi le message Windows DBT_DEVNODES_CHANGED se déclenche-t-il lorsque j'ajoute l'iPhone, mais le message DBT_DEVICEARRIVAL se déclenche lorsque j'ajoute la caméra ?
J'aimerais idéalement pouvoir "récupérer" des fichiers à partir de n'importe quel périphérique USB lorsque l'utilisateur le branche.
Quelqu'un a-t-il de l'expérience dans ce domaine ? Ma programmation Win32 est très limitée...
A la vôtre, Mark