USB-Stick wurde eingesteckt
USB-Stick wurde eingesteckt
Hallo,
ich suche nach einer Möglichkeit mein Programm darauf reagieren zu lassen, wenn ein USB-Stick gesteckt wurde.
Am liebsten wäre es mir, wenn man ein Event von Windows auswerten könnte, sobald ein Stick gesteckt wird. Also im Prinzip dieses nette pilimm von Windows erfassen.
ich suche nach einer Möglichkeit mein Programm darauf reagieren zu lassen, wenn ein USB-Stick gesteckt wurde.
Am liebsten wäre es mir, wenn man ein Event von Windows auswerten könnte, sobald ein Stick gesteckt wird. Also im Prinzip dieses nette pilimm von Windows erfassen.
Re: USB-Stick wurde eingesteckt
da muss ich mal alten Code rauskramen...scoty hat geschrieben:ich suche nach einer Möglichkeit mein Programm darauf reagieren zu lassen, wenn ein USB-Stick gesteckt wurde.
Code: Alles auswählen
Procedure.l CheckUSB()
; by Bingo?
Root$="G:" ; Root Directory NUR mit ""
VNB$=Space(100) ; Volume Name Buffer
VNS=100 ; Volume Name Size
VSN=0 ; Volume Serial Number (Hex)
MCL=0 ; Max.File Name Len
FSF=0 ; File System Flags
FSNB$=Space(100) ; File System Name Buffer (FAT/NTFS usw)
FSNS=100 ; File System Name BufferSize
GetVolumeInformation_(@Root$,@VNB$,VNS,@VSN,@MCL,@FSF,@FSNB$,FSNS)
; Returns 0, when no Drive G exists, otherwise 255
ProcedureReturn MCL
EndProcedure
Diese Proc dann regelmäßig mit einem Timer anspringen.
Grüße ... Kiffi
a²+b²=mc²
Und wenn man den Laufwerksbuchstaben nicht weiß?
Der kann sich doch verschieben, wenn man beispielsweise einen 2. USB-Stick ansteckt oder man einen Kartenleser hat...
Ich fände es besser, wenn man in Intervallen alle Laufwerke ermittelt. Habe ich jetzt gerade 4 Laufwerke (1 Diskette, 2 Festplatten, 1 CD-ROM) und beim erneuten Check auf einmal 5 Lauferwke (es kommt ein Wechseldatenträger = USB Stick) hinzu, dann weiß ich, dass ein USB Stick angeschlossen wurde.
Um ganz sicherzugehen, könnte man mit (ich glaube das heißt) GetDriveType_() prüfen, ob das neue Laufwerk ein Wechseldatenträger ist.
Hier der Link zu einem Thread, damit kannst du
Alle Laufwerke ermitteln — OHNE API!
Der kann sich doch verschieben, wenn man beispielsweise einen 2. USB-Stick ansteckt oder man einen Kartenleser hat...
Ich fände es besser, wenn man in Intervallen alle Laufwerke ermittelt. Habe ich jetzt gerade 4 Laufwerke (1 Diskette, 2 Festplatten, 1 CD-ROM) und beim erneuten Check auf einmal 5 Lauferwke (es kommt ein Wechseldatenträger = USB Stick) hinzu, dann weiß ich, dass ein USB Stick angeschlossen wurde.
Um ganz sicherzugehen, könnte man mit (ich glaube das heißt) GetDriveType_() prüfen, ob das neue Laufwerk ein Wechseldatenträger ist.
Hier der Link zu einem Thread, damit kannst du
Alle Laufwerke ermitteln — OHNE API!
PB 4.30
Code: Alles auswählen
Macro Happy
;-)
EndMacro
Happy End
Code: Alles auswählen
#DBT_DEVICEARRIVAL = $8000
#DBT_DEVICEREMOVECOMPLETE = $8004
#DBT_DEVTYP_VOLUME = $0002
Procedure.s GetDevice(Bits)
For i = 'A' To 'Z'
If Bits & 1 = 1
Laufwerk.s = Chr(i)
EndIf
Bits = Bits >> 1
Next
ProcedureReturn Laufwerk
EndProcedure
Procedure CB(hwnd,msg,wParam,lParam)
Protected *db.DEV_BROADCAST_HDR
Protected *dbv.DEV_BROADCAST_VOLUME
If msg = #WM_DEVICECHANGE
Select wParam
Case #DBT_DEVICEARRIVAL
*db = lParam
If *db\dbch_devicetype = #DBT_DEVTYP_VOLUME
*dbv = *db
Laufwerk.s = GetDevice(*dbv\dbcv_unitmask) + ":\"
Debug Laufwerk + " = insert Media"
EndIf
Case #DBT_DEVICEREMOVECOMPLETE
*db = lParam
If *db\dbch_devicetype = #DBT_DEVTYP_VOLUME
*dbv = *db
Laufwerk.s = GetDevice(*dbv\dbcv_unitmask) + ":\"
Debug Laufwerk + " = remove Media"
EndIf
EndSelect
ProcedureReturn 1
EndIf
ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure
hwnd = OpenWindow(0,#PB_Ignore,#PB_Ignore,200,200,"")
SetWindowCallback(@CB(),0)
Repeat : Until WaitWindowEvent() = #WM_CLOSE
Möglichkeit a wäre die /var/log/messages mitzuschneiden:
Hoffe das hilft dir weiter.
mfg
125
möglichkeit b es gibt bestimmt eine passende kernelapi funktion die ich aber leider nicht kenne...Feb 11 01:04:55 alex2007 kernel: usb 5-7: new high speed USB device using ehci_hcd and address 4
Feb 11 01:04:55 alex2007 kernel: usb 5-7: new device found, idVendor=05e3, idProduct=0702
Feb 11 01:04:55 alex2007 kernel: usb 5-7: new device strings: Mfr=0, Product=1, SerialNumber=0
Feb 11 01:04:55 alex2007 kernel: usb 5-7: Product: USB TO IDE
Feb 11 01:04:55 alex2007 kernel: usb 5-7: configuration #1 chosen from 1 choice
Feb 11 01:04:55 alex2007 kernel: scsi7 : SCSI emulation for USB Mass Storage devices
Feb 11 01:04:55 alex2007 kernel: usb-storage: device found at 4
Feb 11 01:04:55 alex2007 kernel: usb-storage: waiting for device to settle before scanning
Feb 11 01:04:56 alex2007 kernel: Vendor: WDC WD30 Model: 00JB-00KFA0 Rev: 0811
Feb 11 01:04:56 alex2007 kernel: Type: Direct-Access ANSI SCSI revision: 00
Feb 11 01:04:56 alex2007 kernel: SCSI device sdc: 586072368 512-byte hdwr sectors (300069 MB)
Feb 11 01:04:56 alex2007 kernel: sdc: test WP failed, assume Write Enabled
Feb 11 01:04:56 alex2007 kernel: sdc: assuming drive cache: write through
Feb 11 01:04:56 alex2007 kernel: SCSI device sdc: 586072368 512-byte hdwr sectors (300069 MB)
Feb 11 01:04:56 alex2007 kernel: sdc: test WP failed, assume Write Enabled
Feb 11 01:04:56 alex2007 kernel: sdc: assuming drive cache: write through
Feb 11 01:04:56 alex2007 kernel: sdc: sdc1
Feb 11 01:04:56 alex2007 kernel: sd 7:0:0:0: Attached scsi disk sdc
Feb 11 01:04:56 alex2007 kernel: sd 7:0:0:0: Attached scsi generic sg2 type 0
Feb 11 01:04:56 alex2007 kernel: usb-storage: device scan complete
Hoffe das hilft dir weiter.
mfg
125


Nee, ich meine:
(Die ersten 8 Bytes des MBR werden wohl irgendwas enthalten
)
Code: Alles auswählen
If ReadFile(0,"/dev/sda") And ReadQuad(0)
Debug "sda vorhanden"
CloseFile(0)
EndIf
If ReadFile(0,"/dev/sdb") And ReadQuad(0)
Debug "sdb vorhanden"
CloseFile(0)
EndIf

-
- Beiträge: 713
- Registriert: 22.03.2005 00:29
- Computerausstattung: Computer und Strom vorhanden
- Wohnort: LK Wolfenbüttel
Na dann sollte man es mit diesen Funktionen versuchen.
Ich bastele gerade mit den "Akkufunktionen" rum, die ja grundlegend genau so arbeiten, halt nur eine andere GUID.
Es ist sogar die einzige Möglichkeit, die richtig funktionieren kann. Für einen selbst bei immer selber Konstallation ist vielleicht was anderes möglich, aber auch da nicht sicher. Bei mir z.B. bekommt ein USB-Stick nicht immer den selben Laufwerksbuchstaben und wenn ich man mehrere USB-Laufwerke hat und dann vielleicht noch mit mehreren Partitionen so kann man nicht mehr sicher erkennen, wo nun was angeschlossen ist. Entweder muß man dann wohl alle vorhandenen Laufwerksbuchstaben auslesen oder über die WinApi sein Glück versuchen.
Als Tip mal folgende zwei Link:
http://msdn2.microsoft.com/en-gb/library/aa363250.aspx
http://msdn2.microsoft.com/en-us/library/ms791134.aspx
Ich habe zwar auch noch nicht alles verstanden, komme aber langsam weiter.
Gruß
Toshy
Ich bastele gerade mit den "Akkufunktionen" rum, die ja grundlegend genau so arbeiten, halt nur eine andere GUID.
Es ist sogar die einzige Möglichkeit, die richtig funktionieren kann. Für einen selbst bei immer selber Konstallation ist vielleicht was anderes möglich, aber auch da nicht sicher. Bei mir z.B. bekommt ein USB-Stick nicht immer den selben Laufwerksbuchstaben und wenn ich man mehrere USB-Laufwerke hat und dann vielleicht noch mit mehreren Partitionen so kann man nicht mehr sicher erkennen, wo nun was angeschlossen ist. Entweder muß man dann wohl alle vorhandenen Laufwerksbuchstaben auslesen oder über die WinApi sein Glück versuchen.
Als Tip mal folgende zwei Link:
http://msdn2.microsoft.com/en-gb/library/aa363250.aspx
http://msdn2.microsoft.com/en-us/library/ms791134.aspx
Ich habe zwar auch noch nicht alles verstanden, komme aber langsam weiter.
Gruß
Toshy
1. Win10
PB6.1
PB6.1