Probiere mal _WinAPI_SetKeyboardState und sende damit ein leeres 256-Byte Array.
Nee, weder "-1" noch das leere Array verhindern das durchreichen der Zeichen.
Probiere mal _WinAPI_SetKeyboardState und sende damit ein leeres 256-Byte Array.
Nee, weder "-1" noch das leere Array verhindern das durchreichen der Zeichen.
da die Eingabe über eine Inputbox erfolgt ?
Das ist falsch!
Bei meinem Script ist das Input nur zur Verdeutlichung, dass zusätzlich auch noch eine Eingabe per Tastatur möglich ist.
Der Barcode befindet sich komplett in der Variable $sBuffer, nachdem das Postfix gesendet wurde (siehe Kommentare im Script).
Was Du dann damit machst, liegt nur bei Dir.
hat schon mal jemand versucht, die Scannereingaben über _WinAPI_RegisterRawInputDevices() abzugreifen?
Das ließ mir keine Ruhe!
Die Idee ist gut, weil man damit auch ohne Präfix auskommt. Ich habe mal ein Script erstellt:
#include <APISysConstants.au3>
#include <GUIConstantsEx.au3>
#include <WinAPISys.au3>
#include <WindowsConstants.au3>
; hier muss der DeviceName von eurem Scanner drinstehen
; beim auskommentieren von Zeile 47 wird der DeviceName beim scannen angezeigt.
Global $g_sDevName = '\\?\HID#VID_13BA&PID_0018#6&238b7016&0&0000#{884b96c3-56ef-11d1-bc8c-00a0c91405dd}'
Global $g_hForm = GUICreate('BarcodeScanner', 300, 120)
Global $g_idLabel = GUICtrlCreateLabel('', 5, 5, 290, 30) ; fuer die Ausgabe vom Barcode-Scanner
GUICtrlSetFont(-1, 16)
Global $g_idInput = GUICtrlCreateInput('', 5, 40, 290, 30) ; zum testen ein Input, fuer eine Eingabe von der Tastatur
GUICtrlSetFont(-1, 16)
Global $g_idDummy = GUICtrlCreateInput('', 0, 0, 0, 0) ; Dummy-Input, um die Scannereingabe umzulenken
Local $tRID = DllStructCreate($tagRAWINPUTDEVICE)
DllStructSetData($tRID, 'UsagePage', 0x01)
DllStructSetData($tRID, 'Usage', 0x06)
DllStructSetData($tRID, 'Flags', $RIDEV_INPUTSINK)
DllStructSetData($tRID, 'hTarget', $g_hForm)
_WinAPI_RegisterRawInputDevices($tRID)
GUIRegisterMsg($WM_INPUT, 'WM_INPUT')
GUISetState(@SW_SHOW)
GUICtrlSetState($g_idInput, $GUI_FOCUS)
Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE
Func WM_INPUT($hWnd, $iMsg, $wParam, $lParam)
#forceref $iMsg, $wParam
Local Static $sBuffer = ''
Local $devType, $devName, $tRIM, $tText, $hFocus
Switch $hWnd
Case $g_hForm
$tRIM = DllStructCreate($tagRAWINPUTHEADER)
If _WinAPI_GetRawInputData($lParam, $tRIM, DllStructGetSize($tRIM), $RID_HEADER) Then
$devType = $tRIM.Type
Else
ConsoleWrite("Device Header Retrieval Failed" & @CRLF)
Return
EndIf
$tText = DllStructCreate('wchar data[256]')
If _WinAPI_GetRawInputDeviceInfo($tRIM.hDevice, $tText, 256, $RIDI_DEVICENAME) Then
$devName = $tText.data
;~ ConsoleWrite(StringFormat("DevName: '%s'\r\n", $devName))
Else
ConsoleWrite('Device Name Retrieval Failed' & @CRLF)
EndIf
If $devName = $g_sDevName Then ; hier wird getestet, ob die Eingabe vom Barcode-Scanner kommt
If $devType = $RIM_TYPEKEYBOARD Then ; sicherstellen, dass eine Tastatur-Emulation erfolgt
GUICtrlSetState($g_idDummy, $GUI_FOCUS) ; Focus auf das Dummy-Input setzen
$tRIM = DllStructCreate($tagRAWINPUTKEYBOARD)
If _WinAPI_GetRawInputData($lParam, $tRIM, DllStructGetSize($tRIM), $RID_INPUT) Then
If $tRIM.Message = $WM_KEYUP Then ; wenn KEYUP
If $tRIM.VKey = 13 Then ; wenn VKey = 13 (@CR) wird bei meinem Barcode-Scanner als Postfix gesendet (evtl. anpassen)
GUICtrlSetData($g_idLabel, $sBuffer) ; Buffer im Label anzeigen
$sBuffer = '' ; Buffer leeeren, fuer naechsten Code
ConsoleWrite('--- New Code ---' & @CRLF) ; nur zum debuggen
GUICtrlSetState($g_idInput, $GUI_FOCUS) ; Focus wieder auf das Input fuer die Tastatur
Else ; alle anderen Zeichen werden in den Buffer uebernommen
$sBuffer &= Chr($tRIM.VKey)
ConsoleWrite('Char: ' & Chr($tRIM.VKey) & @CRLF) ; nur zum debuggen
EndIf
EndIf
EndIf
EndIf
EndIf
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc ;==>WM_INPUT
Alles anzeigen
Ich habe nur nicht herausbekommen, wie man die Zeichen (die man vom Scanner abfängt) aus dem Tastaturpuffer löschen kann. Sie werden immer an das aktive Input-Control gesendet (auch bei einem "Return 0").
Deswegen habe ich einen Workaround mit einem Dummy-Input eingebaut.
So funktionieren zumindest beide Eingaben "gleichzeitig".
Reden wir nun von so einen Scanner oder über RFID Scanner?
Eigentlich egal, wenn beide eine USB-Tastatur emulieren.
Das Problem, bei gleichzeitiger Benutzung von Scanner und normaler Tastatur ist, dass man erkennen muss, welche Eingabe woher kommt.
Wenn der Scanner ein Prä-/Postfix sendet, kann man alle Eingaben vom Prä- bis zum Postfix abfangen (Tastatur-Hook) und entsprechend verwenden. Andy hat das oben bereits erwähnt.
Du suchst: _StringRepeat()
Schön gemacht!
Gefällt mir, aber warum der Hook?
GUIGetMsg gibt doch $GUI_EVENT_PRIMARYUP und $GUI_EVENT_SECONDARYUP zurück:
;-- TIME_STAMP 2022-07-22 19:00:00
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
Global $aColors[][2] = [ _
["Maroon", 0x800000], _
["DarkRed", 0x8B0000], _
["Brown", 0xA52A2A], _
["FireBrick", 0xB22222], _
["Crimson", 0xDC143C], _
["IndianRed", 0xCD5C5C], _
["Red", 0xFF0000], _
["OrangeRed", 0xFF4500], _
["Tomato", 0xFF6347], _
["Coral", 0xFF7F50], _
["LightCoral", 0xF08080], _
["Salmon", 0xFA8072], _
["DarkSalmon", 0xE9967A], _
["LightSalmon", 0xFFA07A], _
["DarkOrange", 0xFF8C00], _
["Orange", 0xFFA500], _
["DarkGoldenrod", 0xB8860B], _
["Goldenrod", 0xDAA520], _
["Gold", 0xFFD700], _
["Yellow", 0xFFFF00], _
['', 0xF0F0F0], _
['', 0xF0F0F0], _
['', 0xF0F0F0], _
["SaddleBrown", 0x8B4513], _ ; new block
["Sienna", 0xA0522D], _
["Chocolate", 0xD2691E], _
["Peru", 0xCD853F], _
["SandyBrown", 0xF4A460], _
["RosyBrown", 0xBC8F8F], _
["Tan", 0xD2B48C], _
["BurlyWood", 0xDEB887], _
["Wheat", 0xF5DEB3], _
["Moccasin", 0xFFE4B5], _
["PeachPuff", 0xFFDAB9], _
["NavajoWhite", 0xFFDEAD], _
["Bisque", 0xFFE4C4], _
["BlanchedAlmond", 0xFFEBCD], _
["PapayaWhip", 0xFFEFD5], _
['', 0xF0F0F0], _
['', 0xF0F0F0], _
['', 0xF0F0F0], _
['', 0xF0F0F0], _
['', 0xF0F0F0], _
['', 0xF0F0F0], _
['', 0xF0F0F0], _
['', 0xF0F0F0], _
["DarkGreen", 0x006400], _ ; new block
["Green", 0x008000], _
["ForestGreen", 0x228B22], _
["SeaGreen", 0x2E8B57], _
["MediumSeaGreen", 0x3CB371], _
["MediumAquamarine", 0x66CDAA], _
["LimeGreen", 0x32CD32], _
["Lime", 0x00FF00], _
["Chartreuse", 0x7FFF00], _
["LawnGreen", 0x7CFC00], _
["GreenYellow", 0xADFF2F], _
["MediumSpringGreen", 0x00FA9A], _
["SpringGreen", 0x00FF7F], _
["LightGreen", 0x90EE90], _
["PaleGreen", 0x98FB98], _
['', 0xF0F0F0], _
['', 0xF0F0F0], _
['', 0xF0F0F0], _
['', 0xF0F0F0], _
['', 0xF0F0F0], _
['', 0xF0F0F0], _
['', 0xF0F0F0], _
['', 0xF0F0F0], _
["Olive", 0x808000], _
["DarkOliveGreen", 0x556B2F], _ ; new block
["OliveDrab", 0x6B8E23], _
["YellowGreen", 0x9ACD32], _
["DarkSeaGreen", 0x8FBC8F], _
["Teal", 0x008080], _
["DarkCyan", 0x008B8B], _
["LightSeaGreen", 0x20B2AA], _
["DarkTurquoise", 0x00CED1], _
["MediumTurquoise", 0x48D1CC], _
["Turquoise", 0x40E0D0], _
["Aquamarine", 0x7FFFD4], _
["Aqua", 0x00FFFF], _
["Cyan", 0x00FFFF], _
["PaleTurquoise", 0xAFEEEE], _
["LightCyan", 0xE0FFFF], _
["Azure", 0xF0FFFF], _
["AliceBlue", 0xF0F8FF], _
['', 0xF0F0F0], _
['', 0xF0F0F0], _
['', 0xF0F0F0], _
['', 0xF0F0F0], _
['', 0xF0F0F0], _
["DarkKhaki", 0xBDB76B], _ ; new block
["Khaki", 0xF0E68C], _
["PaleGoldenrod", 0xEEE8AA], _
["LemonChiffon", 0xFFFACD], _
["LightGoldenrodYellow", 0xFAFAD2], _
["Cornsilk", 0xFFF8DC], _
["LightYellow", 0xFFFFE0], _
["Beige", 0xF5F5DC], _
["Ivory", 0xFFFFF0], _
["Honeydew", 0xF0FFF0], _
["MintCream", 0xF5FFFA], _
['', 0xF0F0F0], _
['', 0xF0F0F0], _
['', 0xF0F0F0], _
['', 0xF0F0F0], _
['', 0xF0F0F0], _
['', 0xF0F0F0], _
['', 0xF0F0F0], _
['', 0xF0F0F0], _
['', 0xF0F0F0], _
['', 0xF0F0F0], _
['', 0xF0F0F0], _
['', 0xF0F0F0], _
["MidnightBlue", 0x191970], _ ; new block
["Navy", 0x000080], _
["DarkBlue", 0x00008B], _
["MediumBlue", 0x0000CD], _
["Blue", 0x0000FF], _
["RoyalBlue", 0x4169E1], _
["DodgerBlue", 0x1E90FF], _
["DeepSkyBlue", 0x00BFFF], _
["CornflowerBlue", 0x6495ED], _
["SkyBlue", 0x87CEEB], _
["LightSkyBlue", 0x87CEFA], _
["LightSteelBlue", 0xB0C4DE], _
["DarkSlateBlue", 0x483D8B], _
["SlateBlue", 0x6A5ACD], _
["MediumSlateBlue", 0x7B68EE], _
["SteelBlue", 0x4682B4], _
["CadetBlue", 0x5F9EA0], _
["PowderBlue", 0xB0E0E6], _
["LightBlue", 0xADD8E6], _
['', 0xF0F0F0], _
['', 0xF0F0F0], _
['', 0xF0F0F0], _
['', 0xF0F0F0], _
["Indigo", 0x4B0082], _ ; new block
["BlueViolet", 0x8A2BE2], _
["MediumPurple", 0x9370DB], _
["DarkViolet", 0x9400D3], _
["DarkOrchid", 0x9932CC], _
["MediumOrchid", 0xBA55D3], _
["Orchid", 0xDA70D6], _
["Purple", 0x800080], _
["DarkMagenta", 0x8B008B], _
["MediumVioletRed", 0xC71585], _
["PaleVioletRed", 0xDB7093], _
["DeepPink", 0xFF1493], _
["HotPink", 0xFF69B4], _
["Fuchsia", 0xFF00FF], _
["Magenta", 0xFF00FF], _
["Violet", 0xEE82EE], _
["Plum", 0xDDA0DD], _
["Thistle", 0xD8BFD8], _
["Lavender", 0xE6E6FA], _
["Pink", 0xFFC0CB], _
["LightPink", 0xFFB6C1], _
["MistyRose", 0xFFE4E1], _
["LavenderBlush", 0xFFF0F5], _
["Black", 0x000000], _ ; new block
["DarkSlateGray", 0x2F4F4F], _
["SlateGray", 0x708090], _
["LightSlateGray", 0x778899], _
["DimGray", 0x696969], _
["Gray", 0x808080], _
["DarkGray", 0xA9A9A9], _
["Silver", 0xC0C0C0], _
["LightGray", 0xD3D3D3], _
["Gainsboro", 0xDCDCDC], _
["AntiqueWhite", 0xFAEBD7], _
["Linen", 0xFAF0E6], _
["OldLace", 0xFDF5E6], _
["FloralWhite", 0xFFFAF0], _
["Snow", 0xFFFAFA], _
["GhostWhite", 0xF8F8FF], _
["WhiteSmoke", 0xF5F5F5], _
["White", 0xFFFFFF] _
]
Global $aLabel[UBound($aColors)], $w = 185, $x = -$w, $y = -30
Global $hGui = GUICreate('', 1489, 715, @DesktopWidth - 1489, 0, 0x80000000)
GUISetFont(12, 400, Default, 'Consolas')
For $i = 0 To UBound($aColors) - 1
$x = Mod($i, 23) = 0 ? ($x + $w + 1) : $x
$y = Mod($i, 23) = 0 ? 1 : ($y + 30 + 1)
$aLabel[$i] = GUICtrlCreateLabel($aColors[$i][0], $x, $y, $w, 30, BitOR($SS_CENTER, $SS_CENTERIMAGE))
_GuiCtrl_SetColorContrast(-1, $aColors[$i][1])
Next
GUISetState()
Global $aInfo, $aColorClick
While True
Switch GUIGetMsg()
Case -3
Exit
Case $GUI_EVENT_PRIMARYUP
$aInfo = GUIGetCursorInfo($hGui)
If Not @error Then
$aColorClick = _GetColor($aInfo[4])
ClipPut('0x' & Hex($aColorClick[1],6))
Exit
EndIf
Case $GUI_EVENT_SECONDARYUP
$aInfo = GUIGetCursorInfo($hGui)
If Not @error Then
$aColorClick = _GetColor($aInfo[4])
ClipPut('$' & $aColorClick[0] & ' = 0x' & Hex($aColorClick[1],6))
Exit
EndIf
EndSwitch
WEnd
Func _GetColor($_ID)
Local $index = $_ID - $aLabel[0]
Local $aRet[] = [$aColors[$index][0], $aColors[$index][1]]
Return $aRet
EndFunc ;==>_GetColor
; #FUNCTION# =======================================================================================
; Name ..........: _GuiCtrl_SetColorContrast
; Description ...: Sets the background color for a control and depending on its brightness the
; ...............: appropriate contrast color for the text.
; Parameter(s)...: $_ID The control ID
; ...............: $_BkCol The background color
; ....[optional].: $_ColOnDark The text color if BG is dark (Default: -1, almost white)
; ....[optional].: $_colOnBright The text color if BG is bright (Default: -1, very deep blue)
; Return values .: Success 1
; ...............: Failure 0
; Author ........: BugFix
; ==================================================================================================
Func _GuiCtrl_SetColorContrast($_ID, $_BkCol, $_ColOnDark = -1, $_colOnBright = -1)
$_ColOnDark = $_ColOnDark = -1 ? 0xFAFAFA : $_ColOnDark
$_colOnBright = $_colOnBright = -1 ? 0x000088 : $_colOnBright
GUICtrlSetBkColor($_ID, $_BkCol)
; get contrast
Local $R = BitAND(BitShift($_BkCol, 16), 0xFF)
Local $G = BitAND(BitShift($_BkCol, 8), 0xFF)
Local $B = BitAND($_BkCol, 0xFF)
Local $Brightness = Sqrt($R ^ 2 * 0.299 + $G ^ 2 * 0.587 + $B ^ 2 * 0.114)
;~ Local $iCol = $Brightness < 128 ? $_ColOnDark : $_colOnBright
Local $iCol = $Brightness < 140 ? $_ColOnDark : $_colOnBright
Return GUICtrlSetColor($_ID, $iCol)
EndFunc ;==>_GuiCtrl_SetColorContrast
Alles anzeigen
soll ich da ein neues Thema aufmachen oder kann ich hier weiter schreiben was ist besser?
Wenn es nichts zu diesem Thema ist, dann ein neues aufmachen.
Sorry, aber Uralt-Versionen von AutoIt werde ich nicht supporten.
Man könnte beim "normalen" beenden auch noch eine Abfrage einbauen:
#include <GUIConstantsEx.au3>
#include <MsgBoxConstants.au3>
Global $hGui = GUICreate('Test')
Global $DummyEscExit = GUICtrlCreateDummy()
Global $aAccelerators[][] = [['+{ESC}', $DummyEscExit]] ; "SHIFT+ESCAPE" zum Beenden ohne Nachfrage
GUISetAccelerators($aAccelerators)
GUISetState()
While True
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
If MsgBox($MB_YESNO + $MB_DEFBUTTON2, 'Test', 'Programm wirklich beenden?', 0, $hGui) = $IDYES Then Exit
Case $DummyEscExit
Exit
EndSwitch
WEnd
Alles anzeigen
aber bei einigen Steckern ist alles okay, bei anderen nicht.
Es muss nicht zwangsläufig ein Defekt vorliegen.
Schau dir mal die funktionierenden Stecker genauer an. Es gibt 3 ud 4polige Versionen von den 3,5mm Klinkenstecker/-buchsen.
Wenn Du einen 4poligen Stecker in eine 3polige Buchse (oder umgekehrt) steckst, wird die Soundkarte Probleme machen.
Hast Du es mal so probiert:
#include <StringConstants.au3>
Local $sPwd2 = "IchBinEinPasswort" ; <- hier das Passwort (UTF-8)
;~ $sPwd2 = StringToBinary($sPwd2, $SB_UTF16LE) ; <- nach UTF-16 entweder so
$sPwd2 = StringToBinary($sPwd2, $SB_UTF16BE) ; <- nach UTF-16 oder so
Local $wbemFlagReturnImmediately = 0x10
Local $wbemFlagForwardOnly = 0x20
Local $strComputer = "localhost"
Local $strReturn
Local $hblupp = "x"
$objWMIService = ObjGet("winmgmts:{impersonationlevel=impersonate}//" & $strComputer & "\root\HP\InstrumentedBios")
$colItems = $objWMIService.ExecQuery("SELECT * FROM HP_BiosSettingInterface", "WQL", _
$wbemFlagReturnImmediately + $wbemFlagForwardOnly)
If IsObj($colItems) Then
For $objItem In $colItems
$objItem.SetBiosSetting($strReturn, "TPM Activation Policy", "No prompts", "<utf-16/>" & $sPwd2)
Next
Switch $strReturn
Case 0
$hblupp = "Success"
Case 1
$hblupp = "Not Supported"
Case 2
$hblupp = "Unspecified Error"
Case 3
$hblupp = "Timeout"
Case 4
$hblupp = "Failed"
Case 5
$hblupp = "Invalid Parameter"
Case 6
$hblupp = "Access Denied"
Case Else
$hblupp = "..."
EndSwitch
ToolTip("SetBiosSetting() returned: " & $strReturn & " = " & $hblupp, Default, Default, "ausgabeReturnwert", 1, 6)
Sleep(10000)
EndIf
Alles anzeigen
Ja, es soll nach "hex" aussehen, aber es ist wirklich nur dafür da, etwas noch mehr zu "verstecken".
Entschuldige, aber eine Verschlüsselung, die auf verstecken basiert, übersteht keinen ernsthaften Angriff.
Schon gar nicht, wenn sie in AutoIt geschrieben ist.
Du solltest in Erwägung ziehen, eine vorhandene sichere Verschlüsselung zu verwenden.
@@ Vorher =
9026230723930410930234332531610232133013323321070341302343325109326340321434130819113315514910921321021219570240259341325124340341307322126194174258174
@@ Nachher =90262307239304A9302343325316A232D30D32332A7034D02343325A932634032E34D0819B33F5E9A92D2A2C1957024025934D25C434034D07322C6194174258174
Kleiner Nebeneffekt, der String wird kürzer.
Da stellt sich mir die Frage: Was soll das sein/werden?
Wenn da jeweils zwei Chars eine Zahl darstellen, warum dann als String speichern?
Als Byte-Array würde das Ganze nur die Hälfte an Speicher brauchen.
Achtung! Hier lauert ein anderer Fehlerteufel!
Was passiert, wenn die Zeichenkette folgendermaßen lautet: "0201150114"?
Dann werden die "11" durch "B" ersetzt, obwohl es eigentlich "15" = "F" und "14" = "E" wären.
Wenn hier eine Wandlung nach Hex erfolgen soll, dann erstmal ein Array mit jeweils 2 Stellen erstellen und erst danach umwandeln.
Also:
Das ständige einlesen eines Verzeichnisses ist gar nicht notwendig, um Veränderungen mitzubekommen. Windows bietet dafür eine eventbasierte Möglichkeit. So wird das Verzeichnis nur bei Veränderungen neu eingelesen.
Hier mal ein (sehr ausführliches) Beispiel:
#include <APIShellExConstants.au3>
#include <Date.au3>
#include <FileConstants.au3>
#include <GUIConstantsEx.au3>
#include <GuiImageList.au3>
#include <GuiListView.au3>
#include <GuiStatusBar.au3>
#include <ListViewConstants.au3>
#include <StructureConstants.au3>
#include <WinAPIConv.au3>
#include <WinAPIFiles.au3>
#include <WinAPILocale.au3>
#include <WinAPIRes.au3>
#include <WinAPIShellEx.au3>
#include <WinAPIShPath.au3>
#include <WinAPISysWin.au3>
Global $g_sPath = @ScriptDir ; <- hier das zu ueberwachende Verzeichnis eintragen
If StringRight($g_sPath, 1) <> '\' Then $g_sPath &= '\'
Global $g_iID = 0, $g_bStart = False
Global $g_hBusyCur = _WinAPI_LoadCursorFromFile(@WindowsDir & '\Cursors\aero_busy_xl.ani') ; Busy-Animation-Cursor laden
OnAutoItExitRegister('_OnAutoItExit')
_WinAPI_FileIconInit()
Global $g_bLargeIcons = True ; ob grosse oder kleine Icons benutzt werden sollen
Global $g_hSystemImgList = _WinAPI_ShellGetImageList(Not $g_bLargeIcons) ; System-Imagelist holen
Global $g_hGui = GUICreate('Verzeichnisüberwachung "' & $g_sPath & '"', 800, 600)
Global $g_idFilelist = GUICtrlCreateListView('Name|Größe (Bytes)|Datum|Attr', 5, 5, 790, 565)
GUICtrlSetFont(-1, 9 + $g_bLargeIcons * 3, 400, 0, 'Arial')
GUICtrlSetBkColor(-1, 0xF8F8F8)
_GUICtrlListView_SetColumnWidth($g_idFilelist, 0, 360)
_GUICtrlListView_SetColumnWidth($g_idFilelist, 1, 150)
_GUICtrlListView_SetColumnWidth($g_idFilelist, 2, 170)
_GUICtrlListView_SetColumnWidth($g_idFilelist, 3, 70)
_GUICtrlListView_JustifyColumn($g_idFilelist, 1, 1)
_GUICtrlListView_SetImageList($g_idFilelist, $g_hSystemImgList, 1)
Global $g_hStatus = _GUICtrlStatusBar_Create($g_hGui)
Local $g_iMsg = _WinAPI_RegisterWindowMessage('SHELLCHANGENOTIFY')
GUIRegisterMsg($g_iMsg, '_WM_SHELLCHANGENOTIFY')
$g_iID = _WinAPI_ShellChangeNotifyRegister($g_hGui, $g_iMsg, $SHCNE_ALLEVENTS, _
BitOR($SHCNRF_INTERRUPTLEVEL, $SHCNRF_SHELLLEVEL, $SHCNRF_RECURSIVEINTERRUPT), $g_sPath, False)
GUISetState(@SW_SHOW, $g_hGui)
_GetFilesFolder($g_idFilelist, $g_sPath) ; Bei Programmstart die Verzeichnisse/Dateien einlesen
While True
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
Exit
EndSwitch
WEnd
Func _OnAutoItExit()
If $g_iID Then _WinAPI_ShellChangeNotifyDeregister($g_iID)
If $g_hBusyCur Then _WinAPI_DestroyCursor($g_hBusyCur)
_GUIImageList_Destroy($g_hSystemImgList)
EndFunc ;==>_OnAutoItExit
Func _WM_SHELLCHANGENOTIFY($hWnd, $iMsg, $wParam, $lParam)
#forceref $hWnd, $iMsg, $wParam, $lParam
If Not $g_bStart Then ; es koennen mehrere Events "gleichzeitig" erfolgen
$g_bStart = True ; um dabei ein mehrfaches Einlesen zu verhindern
AdlibRegister('_StartReading', 100) ; wird das Einlesen erst nach 100 ms aufgerufen
EndIf
EndFunc ;==>_WM_SHELLCHANGENOTIFY
Func _StartReading()
AdlibUnRegister('_StartReading')
_GetFilesFolder($g_idFilelist, $g_sPath)
$g_bStart = False
EndFunc ;==>_StartReading
Func _GetFilesFolder($idLV, $sPath)
Local $tNUMBERFMT, $hOldCur, $aFolder, $aFiles, $iIndex
$tNUMBERFMT = _WinAPI_CreateNumberFormatInfo(0, 1, 3, '', '.', 1)
_GUICtrlListView_BeginUpdate($idLV)
_GUICtrlListView_DeleteAllItems($idLV)
$hOldCur = _WinAPI_SetCursor($g_hBusyCur)
$aFolder = _WinAPI_EnumFiles($sPath, 2) ; Erst alle Verzeichnisse einlesen
If Not @error Then
Local $aNewItems[$aFolder[0][0]][5] ; 'Name|Groesse|Attr'
For $i = 1 To $aFolder[0][0]
$iIndex = _GUIImageList_GetFileIconIndex($sPath & $aFolder[$i][0], $g_bLargeIcons, True)
$aNewItems[$i - 1][0] = $iIndex
$aNewItems[$i - 1][1] = $aFolder[$i][0]
$aNewItems[$i - 1][2] = '<DIR>'
$aNewItems[$i - 1][3] = _DateTimeFormat(_GetDateTime($aFolder[$i][3]), 0)
$aNewItems[$i - 1][4] = _GetAttrChars($aFolder[$i][6])
Next
_GUICtrlListView_AddArrayEx($idLV, $aNewItems)
EndIf
$aFiles = _WinAPI_EnumFiles($sPath, 1) ; danach alle Dateien einlesen
If Not @error Then
Local $aNewItems[$aFiles[0][0]][5] ; 'Name|Groesse|Attr'
For $i = 1 To $aFiles[0][0]
$iIndex = _GUIImageList_GetFileIconIndex($sPath & $aFiles[$i][0], $g_bLargeIcons, False)
$aNewItems[$i - 1][0] = $iIndex
$aNewItems[$i - 1][1] = $aFiles[$i][0]
$aNewItems[$i - 1][2] = _WinAPI_GetNumberFormat(0, $aFiles[$i][4], $tNUMBERFMT)
$aNewItems[$i - 1][3] = _DateTimeFormat(_GetDateTime($aFiles[$i][3]), 0)
$aNewItems[$i - 1][4] = _GetAttrChars($aFiles[$i][6])
Next
_GUICtrlListView_AddArrayEx($idLV, $aNewItems)
EndIf
_WinAPI_SetCursor($hOldCur)
_GUICtrlListView_EndUpdate($idLV)
_GUICtrlStatusBar_SetText($g_hStatus, StringFormat('Letzte Änderung: %02i.%02i.%04i %02i:%02i:%02i\r\n', @MDAY, @MON, @YEAR, @HOUR, @MIN, @SEC))
EndFunc ;==>_GetFilesFolder
Func _GetAttrChars($iAttr)
Local Const $aFA[][2] = [[$FILE_ATTRIBUTE_READONLY, 'R'], [$FILE_ATTRIBUTE_ARCHIVE, 'A'], _
[$FILE_ATTRIBUTE_SYSTEM, 'S'], [$FILE_ATTRIBUTE_HIDDEN, 'H']]
Local $sAttr = ''
For $i = 0 To UBound($aFA) - 1
$sAttr &= BitAND($iAttr, $aFA[$i][0]) ? $aFA[$i][1] : '-'
Next
Return $sAttr
EndFunc ;==>_GetAttrChars
Func _GetDateTime($iDWord)
Local $tFILETIME = DllStructCreate($tagFILETIME), $tLOCAL
DllStructSetData($tFILETIME, 1, _WinAPI_LoDWord($iDWord))
DllStructSetData($tFILETIME, 2, _WinAPI_HiDWord($iDWord))
$tLOCAL = _Date_Time_FileTimeToLocalFileTime($tFILETIME)
Return _Date_Time_FileTimeToStr($tLOCAL, 1)
EndFunc ;==>_GetDateTime
Func _GUIImageList_GetFileIconIndex($sFilePath, $bLargeIcons = False, $bForceLoadFromDisk = False)
Local $tFileInfo = DllStructCreate($tagSHFILEINFO)
Local $iFlags = BitOR($SHGFI_SYSICONINDEX, _
$bLargeIcons ? $SHGFI_LARGEICON : $SHGFI_SMALLICON, _
$bForceLoadFromDisk ? 0 : $SHGFI_USEFILEATTRIBUTES)
Local $ret = _WinAPI_ShellGetFileInfo($sFilePath, $iFlags, $FILE_ATTRIBUTE_NORMAL, $tFileInfo)
If $ret Then Return DllStructGetData($tFileInfo, 'iIcon')
Return SetError(1, 0, -1)
EndFunc ;==>_GUIImageList_GetFileIconIndex
; Bei dieser Version von _GUICtrlListView_AddArray kann man auch den Image-Index angeben
Func _GUICtrlListView_AddArrayEx($hWnd, ByRef $aItems)
Local $fUnicode, $tItem, $pItem, $tBuffer, $pBuffer, $iLastItem
$fUnicode = _GUICtrlListView_GetUnicodeFormat($hWnd)
$tItem = DllStructCreate($tagLVITEM)
$pItem = DllStructGetPtr($tItem)
If $fUnicode Then
$tBuffer = DllStructCreate('wchar Text[4096]')
Else
$tBuffer = DllStructCreate('char Text[4096]')
EndIf
$pBuffer = DllStructGetPtr($tBuffer)
DllStructSetData($tItem, 'Mask', BitOR($LVIF_TEXT, $LVIF_IMAGE)) ; <- $LVIF_IMAGE hinzugefügt
DllStructSetData($tItem, 'Text', $pBuffer)
DllStructSetData($tItem, 'TextMax', 4096)
$iLastItem = _GUICtrlListView_GetItemCount($hWnd)
For $i = 0 To UBound($aItems) - 1
DllStructSetData($tItem, 'Item', $i + $iLastItem)
DllStructSetData($tItem, 'SubItem', 0)
DllStructSetData($tItem, 'Image', $aItems[$i][0]) ; <- Den Image-Index als Element 0 im Array
DllStructSetData($tBuffer, 'Text', $aItems[$i][1])
If $fUnicode Then
GUICtrlSendMsg($hWnd, $LVM_INSERTITEMW, 0, $pItem)
Else
GUICtrlSendMsg($hWnd, $LVM_INSERTITEMA, 0, $pItem)
EndIf
For $j = 2 To UBound($aItems, 2) - 1
DllStructSetData($tItem, 'SubItem', $j - 1)
DllStructSetData($tBuffer, 'Text', $aItems[$i][$j])
If $fUnicode Then
GUICtrlSendMsg($hWnd, $LVM_SETITEMW, 0, $pItem)
Else
GUICtrlSendMsg($hWnd, $LVM_SETITEMA, 0, $pItem)
EndIf
Next
Next
$tItem = 0
$tBuffer = 0
EndFunc ;==>_GUICtrlListView_AddArrayEx
Alles anzeigen
Sorry, der Thread sollte gar nicht gelöscht werden. Es ging um den Thread von Johannes in "Übersetzung der Hilfe-Datei ins Deutsche".
Irgendwie ist dabei (versehentlich) dieser Thread mit gelöscht worden. Große Entschuldigung an alle Teilnehmer!
$IPLABEL wird nach Return deklariert (Lokal) und ist ganz sicher kein Label. Drei Fehler auf einmal.
Statt dieses RBoxCreate zu benutzen, erstelle die GUI am Anfang mit globalen Variablen, dann sind sie überall verfügbar.
Also diese Zeile GUICtrlSetData(_ActiveIP()) ist ja schon mal totaler Unsinn!
Zum Einen muss die Ctrl-ID angegeben werden und zum Zweiten fabrizierst Du damit eine rekursive Endlosschleife (Abbruch mit Error, wegen Rekursionstiefe).
Also überlege Dir welches Control-Element (Ctrl-ID) Du ansprechen willst und welchen Wert dieses bekommen soll.
Der isolierte Code sieht folgendermaßen aus:
Echt jetzt?
Da fehlt doch das ganze Script! Mit diesem Schnipsel kann man gar nichts anfangen.
Wenn Du irgendwelche Fremd-UDFs einbindest, musst Du auch Diese mitposten.
Und die vollständige Fehlermeldung (die bei Dir auftritt) fehlt auch, wie Moombas schon bemerkte.