PureBoard
http://forums.purebasic.com/german/

USB-Geräte ab- und -zuschalten
http://forums.purebasic.com/german/viewtopic.php?f=17&t=17183
Seite 1 von 1

Autor:  Helle [ 16.07.2008 17:13 ]
Betreff des Beitrags:  USB-Geräte ab- und -zuschalten

Mitunter vertragen sich gleichzeitig angeschlossene USB-Geräte nicht. Bei mir "stänkerte" ein TV-Stick, der z.B. Kopier-Operationen eines normalen Sticks verhinderte. Den TV-Stick abzuschalten geht ja, aber wie wieder aktivieren ohne PC-Neustart, Aktionen über den Geräte-Manager oder erneutes Einstecken (hinten am PC, und das bei meinem Bierbauch)? Die Lösung liefert MS mit dem wirklich guten Tool Devcon. Diese Exe (knapp 60KB) gibts incl. Source-Code bei MS zum freien Download. Mit Devcon kann man hardware-mässig eine ganze Menge machen, hier mein Beispiel zum Schalten von USB-Geräten:
Code:
;- 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

Gruß
Helle

Edit: 5.9.2008 Kosmetik, wenn kein USB-Gerät angeschlossen ist

Autor:  7x7 [ 21.07.2008 12:04 ]
Betreff des Beitrags: 

Ich habe so das Gefühl, als ob dein Programm mein Problem lösen könnte. Habe einen Serial-USB-Konverter
der vermutlich Treiberprobleme hat und sich gelegentlich einfach mal so verabschiedet. Gezieltes ab- und
anmelden könnte vielleicht helfen.

Hast du mal einen direkten Link zu "devcon.exe"? Finde nichts bei MS.

Autor:  Kaeru Gaman [ 21.07.2008 12:19 ]
Betreff des Beitrags: 

[offtopic]
"devcon" ist ja auch ein nettes wortspielchen.... Bild
[/offtopic]

Autor:  Rings [ 21.07.2008 12:41 ]
Betreff des Beitrags: 

7x7 hat geschrieben:
Hast du mal einen direkten Link zu "devcon.exe"? Finde nichts bei MS.

http://support.microsoft.com/kb/311272

Autor:  7x7 [ 21.07.2008 15:51 ]
Betreff des Beitrags: 

Kaeru Gaman hat geschrieben:
[offtopic]
"devcon" ist ja auch ein nettes wortspielchen.... Bild
[/offtopic]

In der Tat ('Defense Condition')
Oh nein, das Pentagon wird doch wohl nicht Windows benutzen...?! :wink:


Danke Rings für den Link!

Autor:  marco2007 [ 21.07.2008 19:25 ]
Betreff des Beitrags: 

@Helle: Super! (und das ohne Assembler :D )
Ich hab` natürlich nichts gegen Assembler - Ich versteh`s nur überhaupt nicht.

Autor:  Kaeru Gaman [ 21.07.2008 19:56 ]
Betreff des Beitrags: 

7x7 hat geschrieben:
In der Tat ('Defense Condition')

yo, der Bezug zur Abkürzung DEFCON ist das wortspielchen.
die Abkürzung devcon heißt device control.

Autor:  hardfalcon [ 21.07.2008 23:27 ]
Betreff des Beitrags: 

Zitat:
MORE INFORMATION
DevCon is not redistributable. It is provided for use as a debugging and development tool. You can freely modify DevCon for private use. The sample demonstrates how to use the SetupAPI and CfgMgr32 functions together effectively to enumerate devices and perform device operations. The following file is available for download from the Microsoft Download Center:

Das ist ja mal doof... :|

Autor:  bobobo [ 22.07.2008 14:25 ]
Betreff des Beitrags: 



eher schlau

hier gehts zum quellcode (u.a.)
http://www.microsoft.com/whdc/devtools/ddk/default.mspx

viel Spass beim Lernen

Seite 1 von 1 Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/