Code: Alles auswählen
;- Ein- und Aus-Schalten von angeschlossenen USB-Geräten
;- "Helle" Klaus Helbing, 04.09.2008, PB v.4.20
;- Die Datei "devcon.exe" kann in einem beliebigen Ordner liegen, hier selber Ordner wie das Programm
;- Bitte die Zwangspausen (Delay(2000)) beachten! Kann auf schnellen Rechnern runtergesetzt werden
;- Also etwas Geduld zwischen den einzelnen Aktionen!
;- Benutzung auf eigene Gefahr! Ist aber harmlos; wer seine USB-Maus oder -Tastatur beendet, braucht
;- schlimmstenfalls ein Zweit-Gerät an einem anderen Anschluß und kann das beendete Gerät wieder
;- starten. Trotzdem aufpassen! Oder im Programm als Gerät ausblenden.
;- Getestet mit W2k und XP. Auf eine Auswertung von Rückgabewerten (Fehler) wurde hier verzichtet.
USBR$ = "USB\ROOT"
Activ$ = "running"
Dis$ = "disabled"
Structure USB
Name$
VID$
PID$
Status$
EndStructure
If OpenWindow(0, 0, 0, 400, 200, "USB-Geräte verwalten, linker Maus-Doppelklick ändert Status", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) And CreateGadgetList(WindowID(0))
ListIconGadget(0, 10, 10, 380, 180, "Geräte-Name", 180, #PB_ListIcon_GridLines | #PB_ListIcon_FullRowSelect)
AddGadgetColumn(0, 1, "VID", 65)
AddGadgetColumn(0, 2, "PID", 65)
AddGadgetColumn(0, 3, "Status", 60)
;Pfad von devcon evtl.anpassen
ProgID = RunProgram("devcon", "find usb\*", "", #PB_Program_Open | #PB_Program_Read | #PB_Program_Hide)
Delay(2000) ;muss sein! Bei Bedarf höher!
Laenge = AvailableProgramOutput(ProgID)
Buffer = AllocateMemory(Laenge)
ReadProgramData(ProgID, Buffer, Laenge)
Dim Geraet.USB(Laenge) ;gaaaanz sicher! Kann man natürlich verkleinern
For i = 0 To Laenge - 1
If PeekB(Buffer + i) = 13
USB$ = PeekS(Buffer + j, i-j, #PB_Ascii)
j = i
If FindString(USB$, USBR$, 1) = 0
AddGadgetItem(0, -1, "")
If FindString(USB$, "VID", 1) > 0 ;sonst Käse bei kein Gerät
USB$ = RTrim(USB$) ;zeigt hier auch ausgeschaltete Geräte an!
Geraet(z)\VID$ = Mid(USB$, 7, 8) ;8 Zeichen lang, Position ermittelt
SetGadgetItemText(0, z, Geraet(z)\VID$, 1)
Geraet(z)\PID$ = Mid(USB$, 16, 8)
SetGadgetItemText(0, z, Geraet(z)\PID$, 2)
k = FindString(USB$, ":", 20) ;oder mehr als 20
Geraet(z)\Name$ = Mid(USB$, k+2, i-k) ;oder bei bekannter VID/PID eigenen Namen setzen
SetGadgetItemText(0, z, Geraet(z)\Name$, 0)
ProgID2 = RunProgram("devcon", "status usb\"+Geraet(z)\VID$+Chr(38)+Geraet(z)\PID$, "", #PB_Program_Open | #PB_Program_Read | #PB_Program_Hide)
Delay(2000)
Laenge2 = AvailableProgramOutput(ProgID2)
Buffer2 = AllocateMemory(Laenge2)
ReadProgramData(ProgID2, Buffer2, Laenge2)
Act$ = PeekS(Buffer2, Laenge2, #PB_Ascii)
KillProgram(ProgID2)
CloseProgram(ProgID2)
FreeMemory(Buffer2)
If FindString(Act$, Activ$, 1) <> 0
Geraet(z)\Status$ = Activ$
Else
Geraet(z)\Status$ = Dis$
EndIf
SetGadgetItemText(0, z, Geraet(z)\Status$, 3)
z + 1
If i > Laenge - 50 ;50 oder so in etwa
Break
EndIf
EndIf
EndIf
EndIf
Next
KillProgram(ProgID) ;sicher ist sicher
CloseProgram(ProgID)
Repeat
Repeat
Event = WaitWindowEvent()
If Event = #PB_Event_CloseWindow
End
EndIf
Until EventType() = #PB_EventType_LeftDoubleClick
z = GetGadgetState(0)
If z >= 0
;Status switchen
If Geraet(z)\Status$ = Activ$
ProgID2 = RunProgram("devcon", "disable usb\" + Geraet(z)\VID$ + Chr(38) + Geraet(z)\PID$, "", #PB_Program_Open | #PB_Program_Hide)
Else
ProgID2 = RunProgram("devcon", "enable usb\" + Geraet(z)\VID$ + Chr(38) + Geraet(z)\PID$, "", #PB_Program_Open | #PB_Program_Hide)
EndIf
;aktuellen Status des geswitchten Gerätes abfragen
Delay(2000) ;evtl. anpassen
ProgID3 = RunProgram("devcon", "status usb\"+Geraet(z)\VID$+Chr(38)+Geraet(z)\PID$, "", #PB_Program_Open | #PB_Program_Read | #PB_Program_Hide)
Delay(2000)
Laenge3 = AvailableProgramOutput(ProgID3)
Buffer3 = AllocateMemory(Laenge3)
ReadProgramData(ProgID3, Buffer3, Laenge3)
Act$ = PeekS(Buffer3, Laenge3, #PB_Ascii)
KillProgram(ProgID3)
CloseProgram(ProgID3)
FreeMemory(Buffer3)
If FindString(Act$, Activ$, 1) <> 0
Geraet(z)\Status$ = Activ$
Else
Geraet(z)\Status$ = Dis$
EndIf
SetGadgetItemText(0, z, Geraet(z)\Status$, 3)
EndIf
Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
Helle
Edit: 5.9.2008 Kosmetik, wenn kein USB-Gerät angeschlossen ist