- Offizieller Beitrag
Wenn man ein Programm schreibt, in dem man die zur Verfügung stehenden Laufwerke dem Benutzer zur Auswahl anbieten will, dann steht man vor dem Problem (während der Laufzeit des Scripts) eine Änderung der zur Verfügung stehenden Laufwerke mitzubekommen. Das könnte man einerseits so lösen, dass man eine Prüfroutine alle paar Sekunden aufruft oder (was ein besserer Weg ist) Windows anweisen, eine Funktion in unserem Script aufzurufen, wenn sich an der Laufwerksauswahl etwas ändert. Das Ganze kann man mit Hilfe von GUIRegisterMsg und $WM_DEVICECHANGE erreichen.
Hier mal ein Beispiel:
Spoiler anzeigen
#include <ComboConstants.au3>
#include <GUIConstantsEx.au3>
Global Const $WM_DEVICECHANGE = 0x0219 ; Notifies an application of a change to the hardware configuration of a device or the computer.
Global Const $DBT_DEVICEARRIVAL = 0x8000 ; A device or piece of media has been inserted and is now available.
Global Const $DBT_DEVICEREMOVECOMPLETE = 0x8004 ; A device or piece of media has been removed.
$hGui = GUICreate('Automatische Laufwerkserkennung', 380, 200)
GUICtrlCreateLabel('Laufwerke mit Datenträger:', 20, 30, 180, 20)
$idDrivesReady = GUICtrlCreateCombo('', 20, 50, 120, 20, $CBS_DROPDOWNLIST)
GUICtrlCreateLabel('Laufwerke ohne Datenträger:', 220, 30, 180, 20)
$idDrivesNotReady = GUICtrlCreateCombo('', 220, 50, 120, 20, $CBS_DROPDOWNLIST)
_ReadDrives()
GUISetState()
GUIRegisterMsg($WM_DEVICECHANGE, 'MY_WM_DEVICECHANGE')
Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE
Func MY_WM_DEVICECHANGE($hWnd, $Msg, $wParam, $lParam)
#forceref $hWnd, $Msg, $lParam
Switch $wParam
Case $DBT_DEVICEARRIVAL
ConsoleWrite('A device or piece of media has been inserted and is now available.' & @CR)
_ReadDrives()
Case $DBT_DEVICEREMOVECOMPLETE
ConsoleWrite('A device or piece of media has been removed.' & @CR)
_ReadDrives()
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc ;==>MY_WM_DEVICECHANGE
Func _ReadDrives()
Local $aDrives, $sDrivesReady, $sDrivesNotReady, $sTmp
GUICtrlSetData($idDrivesReady, '')
GUICtrlSetData($idDrivesNotReady, '')
$aDrives = DriveGetDrive('ALL')
For $i = 1 To $aDrives[0]
If DriveStatus($aDrives[$i]) = 'READY' Then
$sDrivesReady &= '|' & StringUpper($aDrives[$i])
$sTmp = DriveGetLabel($aDrives[$i])
If $sTmp <> '' Then $sDrivesReady &= ' (' & $sTmp & ') '
Else
$sDrivesNotReady &= '|' & StringUpper($aDrives[$i])
EndIf
Next
GUICtrlSetData($idDrivesReady, StringTrimLeft($sDrivesReady, 1), StringRegExpReplace($sDrivesReady, '\|(.+?)\|.*', '$1'))
GUICtrlSetData($idDrivesNotReady, StringTrimLeft($sDrivesNotReady, 1), StringRegExpReplace($sDrivesNotReady, '\|(.+?)\|.*', '$1'))
EndFunc ;==>_ReadDrives