Laden...

USB Stick erkennen

Erstellt von Akhanto vor 11 Jahren Letzter Beitrag vor 11 Jahren 5.909 Views
A
Akhanto Themenstarter:in
28 Beiträge seit 2012
vor 11 Jahren
USB Stick erkennen

Hi,
Neu hier und schon ne Frage =)
Ich suche seit gestern nach einer Möglichkeit einen angesteckten USB Stick zu erkennen und darauf zu reagieren (in meinem Fall bestimmte Daten automatisch runter kopieren). WndProc gibt es ja in WPF nicht.
Bei meiner Suche habe ich das, sowie das

beides kombiniert sieht das bei mir so aus:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Windows.Interop;

namespace USB_Stick
{
    /// <summary>
    /// Interaktionslogik für MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {

        USBerkennung objCD = new USBerkennung(); 
        const int WM_DEVICECHANGE = 0x219;
        int intUSBCount;

        public MainWindow()
        {
            InitializeComponent();
            CheckDrives();
        }

        protected override void OnSourceInitialized(EventArgs e)
        {
            base.OnSourceInitialized(e);
            HwndSource source = PresentationSource.FromVisual(this) as HwndSource;
            source.AddHook(WndProc);
        }

        private void CheckDrives()
        {
            intUSBCount = 0;
            foreach (System.IO.DriveInfo d in System.IO.DriveInfo.GetDrives())
            {
                if (d.DriveType == System.IO.DriveType.Removable)
                    intUSBCount++;
            }
        }

        IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
        {
            if (msg == WM_DEVICECHANGE)
            {
                int intOldUSBCount = intUSBCount;
                CheckDrives();
                if (intUSBCount > intOldUSBCount)
                    tbStatus.Text = "Gerät gefunden";
                if (intUSBCount < intOldUSBCount)
                    tbStatus.Text = "Gerät entfernt";
            }
            return IntPtr.Zero;
        }

    }
}

Wenn ein Gerät eingesteckt wurde, soll in eine Textbox eine entsprechende Meldung geschrieben werden. Leider passiert das nicht. Kann mir da jemand weiter helfen? Eine Fehlermeldung wird mir nicht angezeigt. Ist eventuell der msg Code falsch? Der bezieht sich ja auf WndProc.

EDIT: Nach Zugabe einer weiteren Textbox, die die Anzahl der Geräte anzeigt funktioniert nun das ganze Programm! Problem gelöst. Nun stehe ich jedoch vor einem anderen Problem: Wie erkenne ich Name und Pfad des Geräts? (ich möchte ja Dateien kopieren)

vielen Dank
Akhanto

76 Beiträge seit 2008
vor 11 Jahren

http://msdn.microsoft.com/de-de/library/system.io.driveinfo.aspx

public DirectoryInfo RootDirectory { get; }

Typ: System.IO.DirectoryInfo
Ein DirectoryInfo-Objekt, das das Stammverzeichnis des Laufwerks enthält.

16.806 Beiträge seit 2008
vor 11 Jahren

A USB Library to Detect USB Devices hilft vielleicht weiter, soferns auch darum geht, dass neue USB Sticks erkannt werden.

Für den Pfad hat Dir DeZio ja schon das entsprechende gesagt.

E
180 Beiträge seit 2010
vor 11 Jahren
Hi

ich persönlich verwendet die DriveDetector-Klasse. Mit der sind genau deine beiden Probleme gelöst. Ist auch zuverlässig und stabil.

Gruß

A
Akhanto Themenstarter:in
28 Beiträge seit 2012
vor 11 Jahren

Wie geschrieben funktioniert die Erkennung mittlerweile. Meine Version ist auch ganz gut glaube ich. Mein Problem ist leider jedoch immernoch, dass es nötig wäre, dass der Laufwerkbuchstabe von dem gerade angesteckten Gerät übermittelt wird. mit der DriveInfo Klasse hilft mir hier jedoch nur begrenzt, da ich entweder speziell ein Laufwerk abfragen kann oder alle, aber nicht das, was zuletzt geändert bzw. hinzugefügt wurde.

Wird der Laufwerksbuchstabe bei Devicechange mit übermittelt oder habt ihr nen andern Ansatz für mich?

Danke
Akhanto

E
180 Beiträge seit 2010
vor 11 Jahren

wenn du dir mein codebeispiel auf Codeproject angeguckt hättest, dann wäre die Frage überflüssig, denn denn dort wurde genau dies bereits implementiert und gelöst.

A
Akhanto Themenstarter:in
28 Beiträge seit 2012
vor 11 Jahren

Stimmt. Ich werde mir das nochmal genauer ansehen!

Danke soweit

Akhanto