Je suis en train d'écrire une application WPF qui veut accéder à un appareil photo numérique, et je suis fou de trouver des solutions et je suis assez content de la façon dont ça se passe.Comment obtenir des fichiers à partir d'un périphérique utilisant USB
C'est ce que j'ai en ce 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;
}
}
}
Cela fait tout fonctionne très bien pour mon appareil photo numérique et je peux obtenir les photos disponibles en dehors. Je dois noter à ce moment-là que lorsque je branche mon appareil photo, il apparaît dans les fenêtres sous les "périphériques avec stockage amovible", et il a une lettre de lecteur qui lui est attribuée.
Cependant, quand je branché mon iPhone pour le tester, l'iPhone n'a pas apparaît sous cet article, et ne semble pas avoir une lettre de lecteur lui est associé ...
Mais voici mon 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?
Je voudrais idéalement être en mesure de fichiers « get » de tout périphérique USB lorsque l'utilisateur se branche dans.
Quelqu'un at-il une expérience avec cela? Ma programmation Win32 est très limité ...
Cheers, Mark
Merci, en fait, je ne suis pas trop préoccupé par le fait que les appareils Apple ne fonctionnent pas, j'ai juste besoin de caméras pour fonctionner. J'étais plus curieux à propos de tout cela, et si ça va être difficile, alors je m'en tiens aux appareils photo numériques à ce moment-là. – Mark
Le problème est que la plupart des caméras ne prennent en charge que le modèle des périphériques Windows Media. Les caméras agissant comme stockage de masse USB sont la minorité, ou au mieux, elles étaient minoritaires il y a quelques années. Bonne chance avec ça. – Coincoin
Je vois, alors comment pourrais-je obtenir les fichiers par programmation sur un appareil multimédia? – Mark