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
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.
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.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
ich persönlich verwendet die DriveDetector-Klasse. Mit der sind genau deine beiden Probleme gelöst. Ist auch zuverlässig und stabil.
Gruß
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
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.