AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Programm öffnen, wenn USB Stick raus

Ein Thema von Delphi-Narr · begonnen am 30. Jun 2010 · letzter Beitrag vom 1. Jul 2010
Antwort Antwort
Benutzerbild von Delphi-Narr
Delphi-Narr

Registriert seit: 29. Aug 2009
Ort: Duisburg
437 Beiträge
 
Delphi 2007 Professional
 
#1

Programm öffnen, wenn USB Stick raus

  Alt 30. Jun 2010, 20:33
Delphi-Version: 2005
Hallo,
ich möchte gerne ein selbstgeschriebenes Programm aufrufen, wenn ein bestimmter USB-Stick rausgenommen wird.
Das Programm liegt bspw. auf C:\Programm.exe und der USB-Stick heißt z.B. 'Stick'. Jetzt möchte ich ein Programm schreiben, welches erkennt, ob der USB-Stick eingesteckt ist oder nicht und dementsprechend ein Programm starten (wenn raus) oder beenden (wenn wieder rein)...
Ist das möglich und wenn, wie?
Liebe Grüße!
  Mit Zitat antworten Zitat
c4rtm4n

Registriert seit: 28. Jan 2009
Ort: Oldenburg (Oldenburg)
26 Beiträge
 
Delphi 2009 Enterprise
 
#2

AW: Programm öffnen, wenn USB Stick raus

  Alt 30. Jun 2010, 21:32
Hi,

um zu erkennen, ob ein Gerät angeschlossen wurde musst du auf die WM_DEVICECHANGE Windows-Message reagieren.

Wie du das mit dem Namen machst, kann ich dir noch nicht sagen...
Da dran bin ich gerade selber noch am verzweifeln.

Gruß
Carsten
  Mit Zitat antworten Zitat
Benutzerbild von Delphi-Narr
Delphi-Narr

Registriert seit: 29. Aug 2009
Ort: Duisburg
437 Beiträge
 
Delphi 2007 Professional
 
#3

AW: Programm öffnen, wenn USB Stick raus

  Alt 30. Jun 2010, 22:04
Danke, mir würde es auch helfen, wenn ich zumindest den Laufwerksbuchstaben des neuen Laufwerks in Erfahrung bringen könnte.
Weißt du vielleicht, wie das geht?
  Mit Zitat antworten Zitat
c4rtm4n

Registriert seit: 28. Jan 2009
Ort: Oldenburg (Oldenburg)
26 Beiträge
 
Delphi 2009 Enterprise
 
#4

AW: Programm öffnen, wenn USB Stick raus

  Alt 30. Jun 2010, 22:09
Das ist der schwierigste Teil...
Und leider genau der Teil, an dem ich noch am Verzweifeln bin ^^
Carsten
  Mit Zitat antworten Zitat
daywalker9

Registriert seit: 1. Jan 2010
Ort: Leer
594 Beiträge
 
Delphi XE3 Professional
 
#5

AW: Programm öffnen, wenn USB Stick raus

  Alt 30. Jun 2010, 22:14
Guck dir das auf MSDN an: MSDN. Dort kannst du dir die einzelnen Parameter angucken und findest dort auch, wie du an den Buchstaben kommst. Musst du dich mal durchklicken
Lars
  Mit Zitat antworten Zitat
blackfin
(Gast)

n/a Beiträge
 
#6

AW: Programm öffnen, wenn USB Stick raus

  Alt 30. Jun 2010, 23:46
Ich hab damit auch mal rumgespielt.
Ich poste mal den Testcode, ist aber wirklich nur ein Testcode zum Weiterentwickeln / ordnen / abstrahieren / schöner machen:

1) Neues Projekt anlegen, ein Memo auf die Form klatschen und dann unit folgendermaßen anpassen:

Delphi-Quellcode:
unit devicechange_test;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
  private
    function GetVolumeName(FDrive: Char): string;
    procedure WMDeviceChange(var Msg: TMessage); message WM_DEVICECHANGE;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

// Volume-Name herausfinden
function TForm1.GetVolumeName(FDrive: Char): string;
var
max, Flags: DWORD;
Buf: array [0..MAX_PATH] of Char;
begin
  try
    GetVolumeInformation(PChar(string(FDrive + ':')), Buf, sizeof(Buf), nil, max, Flags, nil, 0);
    Result := StrPas(buf);
  except
    result := '';
  end;
end;


// Event beim mounten oder entfernen eines Laufwerks oder Medium
procedure TForm1.WMDeviceChange(var Msg: TMessage);
  type
    PDevBroadcastHdr = ^TDevBroadcastHdr;
    TDevBroadcastHdr = packed record
      dbcd_size, dbcd_devicetype, dbcd_reserved: DWORD;
    end;
    PDevBroadcastVolume = ^TDevBroadcastVolume;

    TDevBroadcastVolume = packed record
      dbcv_size, dbcv_devicetype, dbcv_reserved, dbcv_unitmask: DWORD;
      dbcv_flags: Word;
    end;

  function GetDrive(pDBVol: PDevBroadcastVolume): string;
  var i: Byte; Maske: DWORD;
  begin
    case (pDBVol^.dbcv_flags) of
      // es ist ein entfernbares MEDIUM (CD /DVD)
      0:
        begin

        end;

      // es ist ein entfernbares LAUFWERK (Platte)
      1:
        begin

        end;
    end;


    Maske := pDBVol^.dbcv_unitmask;
    for i := 0 to 25 do
    begin
      if (Maske and 1) = 1 then Result := Char(i + Ord('A')) + ': ';
       Maske := Maske shr 1;
    end;

  end;

var Drive,DriveName: String;
begin

  case Msg.wParam of

  // laufwerk eingelegt
  $8000:
      if PDevBroadcastHdr(Msg.lParam)^.dbcd_devicetype = $0002 then
      begin
        Drive := GetDrive(PDevBroadcastVolume(Msg.lParam));
        DriveName := GetVolumeName(Drive[1]) ;
        memo1.lines.add('Datenträger in Laufwerk '+Drive+'eingelegt ("'+DriveName+'")');
      end;

  // laufwerk entfernt
  $8004:
      if PDevBroadcastHdr(Msg.lParam)^.dbcd_devicetype = $0002 then
      begin
         Drive := GetDrive(PDevBroadcastVolume(Msg.lParam));
         // DriveName ist hier nach dem entfernen nicht mehr verfügbar, also am besten vorher beim einlegen speichern :)
         memo1.lines.add('Datenträger aus Laufwerk '+Drive+'entfernt.');
      end;
  end;
end;

end.
dann das Programm mal laufen lassen und einen usb stick einstecken und / oder entfernen.

Zu beachten ist dabei, wie auch schon im Code kommentiert ist, dass ein Laufwerks-Name dann nicht mehr ausgelesen werden kann, wenn der Event "Laufwerk wurde entfernt" zuschlägt, da das Laufwerk ja zu diesem Zeitpunkt schon nicht mehr verfügbar ist.
Also sollte man beim Programmstart die derzeit verfügbaren Laufwerke durchgehen und die Namen den Driveletters zuordnen und speichern, damit man nach dem Entfernen auch den zugehörigen Namen des entfernten Laufwerks hat.
Bei einem "Laufwerk wurde gemountet"-Event ist diese Liste / das Mapping natürlich zu erweitern.
Mit dem Code kannst du das gewünschte grundlegend schon erreichen, du musst ihn halt noch an deine Bedürfnisse anpassen.

Geändert von blackfin (30. Jun 2010 um 23:56 Uhr)
  Mit Zitat antworten Zitat
blackfin
(Gast)

n/a Beiträge
 
#7

AW: Programm öffnen, wenn USB Stick raus

  Alt 1. Jul 2010, 02:29
Ich hab mal im Schnellverfahren eine kleine Komponente draus gekloppt und hier angehängt.
Ein Package für D2006 / TurboDelphi ist mit drin, ansonsten halt selbst ein neues erzeugen.
Ein Demo-Projekt ist auch mit dabei.

Anleitung:
1) Komponente installieren
2) Neues Projekt erstellen
3) Komponente draufziehen
4) Ereignisse zuweisen:

OnDeviceMounted(ADrive:Char; ADriveName:string); wird ausgelöst, wenn ein Device gemounted wird, in ADrive steht der Laufwerkbuchstabe, in ADrivename der Name der Volume.

In diesem Event könntest du jetzt z.B. abfragen, ob ADrivename "Stick" ist und dann C:\Programm.exe beenden, wenns denn läuft:
Handle von C:\Programm.exe rausfinden und eine WM_CLOSE senden.


OnDeviceUnmounted(ADrive:Char; ADriveName:string); wird ausgelöst, wenn ein Device entfernt wird, in ADrive steht der Laufwerkbuchstabe, in ADrivename der Name der Volume.
Der Volume-Name kommt hierbei aus dem zuvor ermittelten VolumeName-Cache.
Dieser wird immer aktualisiert, sobald sich die Volumes im System ändern, beim Mounted vor dem Event, beim Unmounted danach.

In diesem Event könntest du jetzt z.B. abfragen, ob ADrivename "Stick" ist und dann C:\Programm.exe ausführen:
if (ADriveName = 'Stick') then ShellExecute(self.Handle,nil,PChar('C:\Programm.ex e'),nil,nil,SW_SHOW);


Anregungen und auch wenns nötig Beschimpfungen sind erwünscht
Das ganze Ding ist wirklich schnell zusammengekloppt worden...
Getestet is es derzeit nur unter Win7 x64.
Angehängte Dateien
Dateityp: zip ehXDeviceChange.zip (648,9 KB, 51x aufgerufen)

Geändert von blackfin ( 1. Jul 2010 um 03:25 Uhr)
  Mit Zitat antworten Zitat
hathor
(Gast)

n/a Beiträge
 
#8

AW: Programm öffnen, wenn USB Stick raus

  Alt 1. Jul 2010, 08:02
@blackfin:

Dein Programm hat noch Überarbeitungsbedarf.
Problem:
SDcard reingeschoben - hält nicht - rutscht wieder heraus - wieder reingeschoben - hält:
Ergebnis siehe Anhang: die 2. Zeile ist definitiv falsch.
Vorschlag: Delay einbauen - Ergebnis erst auswerten/anzeigen, wenn sich 2 Sec lang nichts mehr ändert.
Miniaturansicht angehängter Grafiken
mount_unmount.jpg  
  Mit Zitat antworten Zitat
blackfin
(Gast)

n/a Beiträge
 
#9

AW: Programm öffnen, wenn USB Stick raus

  Alt 1. Jul 2010, 09:11
Zitat:
Dein Programm hat noch Überarbeitungsbedarf
Klar, ist ja auch nur schnell zusammengeklopt worden

Danke für die Hinweise!

Mal sehen, wenn ich zeit und Muße habe, werd ichs vielleicht mal ausbauen / besser machen, ich wollte aber in erster Linie den Code nur hier veröffentlichen, vielleicht kann der Threadersteller damit ja etwas anfangen, sozusagen als Start.
Bei mir würd er derzeit nur auf der Backup-Platte im Testverzeichnis vergammeln
  Mit Zitat antworten Zitat
Benutzerbild von Delphi-Narr
Delphi-Narr

Registriert seit: 29. Aug 2009
Ort: Duisburg
437 Beiträge
 
Delphi 2007 Professional
 
#10

AW: Programm öffnen, wenn USB Stick raus

  Alt 1. Jul 2010, 22:42
Danke blackfin! #6 ist genau, was ich brauchte. Jetzt kann ich sowohl Namen des Laufwerks als auch eine Datei dadrauf abfragen und dementsprechend reagieren.

Danke!
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:14 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz