2011-01-15 6 views
2

Ich habe einige Computer mit einem vereinfachten Windows in dem Speichergeräte, die hinzugefügt/entfernt werden nicht automatisch Laufwerksbuchstaben erhalten. Also muss ich einen Weg finden zu erkennen, dass hinzugefügt/entfernt werden. Ein Weg (den ich kenne) ist mit WM_DEVICECHANGE Nachricht. Auf diesen Computern wird die Nachricht nur mit WParam 7 und LParam 0 an Fenster gesendet. So könnte ich meinen Erkennungscode ausführen, wenn diese Nachricht von meiner Anwendung empfangen wird. Das Problem ist, dass es einige Zeit braucht, bis das Gerät vollständig erkannt wurde. Zwischenzeitlich wird meine Anwendung mit einer "Salve" von WM_DEVICECHANGE-Nachrichten "bombardiert" und der Erkennungscode wird sogar 6,7-mal gestartet. Zum Lösen könnte ich einen Timer hinzufügen, der durch eine neue Nachricht neu initialisiert wird; Wenn nach einiger Zeit (1..2 sec) die Anwendung die Nachricht nicht empfängt, wird der Erkennungscode gestartet. Aber ich mag diesen Ansatz nicht 100%, weil es andere Faktoren nicht berücksichtigt wie: die Geschwindigkeit des Computers, andere Programme, die Windows verlangsamen, verschiedene Speichergerätetypen usw. Und die Tatsache, dass der Erkennungscode endet Nach einer Verzögerung ist es ein bisschen nervig.wie erkennen, dass Windows beendet Hinzufügen/Entfernen von Speichergeräten (nicht als Laufwerkbuchstaben, nur als Geräte)

Kennt jemand eine professionellere Lösung ...?

Vielen Dank für jede Hilfe.

+0

Ich habe noch nichts ähnliches getan, aber schaue auf Shell-Ereignisse, mit Shell können Sie auch benachrichtigt werden (nur einmal/Aktion), wenn eine Datei entfernt, geändert, geändert, etc. Ich bin sicher, dass Sie kann auf msdn etwas Nützliches finden und dann Leute bitten, den Code nach Delphi zu konvertieren, wenn Sie nicht mit der Syntax (VC) oder dem Äquivalent von C# zu Delphi vertraut sind. – ComputerSaysNo

+0

@Dorin, Ok, ich weiß, ich kann schauen und suchen, aber ich habe das schon getan und habe nichts und ich kam hier um Hilfe ... –

Antwort

1

Ich spielte gestern mit diesen Nachrichten und in meinem Testprogramm bekomme ich nur eine Nachricht zum Hinzufügen und eine zum Entfernen, wenn ich die Nachrichten filtere.

Siehe meine blog für eine detailliertere Beschreibung.

+0

Ich schaute auf Ihren Blog. Das Problem in meinem Fall ist, dass in den Nachrichten (WParam) habe ich nicht DEV_BROADCAST_HDR Struktur, nur Nummer "7". Gibt es eine andere Möglichkeit, diese Nachrichten zu filtern ...? –

+0

@John Mirror: sie sind in der Jedi Apilib definiert http://blog.delphi-jedi.net/jedi-api-headers/ – Remko

+0

Und das wurde abgelehnt warum? – Remko

0

Es ist wahr, für die meisten Fälle erhalten Sie zahlreiche Nachrichten. Meine Lösung war ähnlich wie bei dir, nur dass ich anstelle des Timers einen Thread verwendet habe. Meine Wartezeit war in diesem Fall 15s (nach DBT_DEVICEARRIVAL).

In der Tat ist DBT_DEVICEARRIVAL genau das, was Sie suchen, wenn ich auf den Wortlaut Ihrer Frage schaue. Das Gerät ist zu dieser Zeit verfügbar, auch wenn weitere Benachrichtigungen folgen. Ich erhalte die folgende, wenn sie in einem USB-Stick einstecken:

  • DBT_DEVNODES_CHANGED
  • DBT_DEVNODES_CHANGED
  • DBT_DEVNODES_CHANGED
  • DBT_DEVICEARRIVAL (DBT_DEVTYP_VOLUME hat Laufwerksbuchstaben verfügbar gemacht worden)
  • DBT_DEVNODES_CHANGED
  • DBT_DEVNODES_CHANGED
  • DBT_DEVNODES_CHANGED

Für Ihren Zweck sind die DBT_DEVNODES_CHANGED Benachrichtigungen irrelevant. Sie sind ausschließlich an DBT_DEVICEARRIVAL interessiert ($ 8000 in Delphi).

Außerdem würde es wirklich helfen, wenn Sie die Nachrichten durch ihren symbolischen Namen, nicht ihre Nummer beziehen würden.