1. Dashboard
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forenregeln
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. AutoIt.de - Das deutschsprachige Forum.
  2. Mitglieder
  3. Oscar

Beiträge von Oscar

  • _GUICtrlGifAnim

    • Oscar
    • 31. August 2022 um 17:54

    Diese UDF zeigt GIF-Animationen mit Hilfe der "neuen" Funktionen an (_GDIPlus_ImageSelectActiveFrame und _GDIPlus_ImageGetPropertyItem, AFAIR ab AutoIt v3.3.14.3).

    Der eigentliche Vorteil dieser UDF ist aber das speichern aller Frames der Gif-Animation nebeneinander in einer HBitmap. So kann man mit _WinAPI_BitBlt die Einzelbilder auf das jeweilige Fenster "blitten", was kaum Rechenzeit kostet.

    Das abspielen der Animationen kann also nebenbei passieren, was ich im Beispielscript mit einer _Timer-Funktion erledige (vier Gif-Animationen gleichzeitig).

    Ich habe das Beispiel ausführlich kommentiert, um evtl. Fragen schon im Voraus zu beantworten. Falls aber trotzdem Fragen auftauchen oder ihr noch Anregungen habt, nur zu...

    Dateien

    _GUICtrlGifAnim_v1_0.zip 97,04 kB – 281 Downloads
  • AutoIT Script welches läuft neu starten

    • Oscar
    • 27. August 2022 um 08:49
    Zitat von gert_nrw_71

    ein laufendes Script per Tastendruck, evtl. eine Funktionstaste, neu zu starten ?

    Wozu soll das gut sein?

    Man kann Schleifen programmieren, wenn Codeteile mehrfach ausgeführt werden sollen.

  • Barcode in Variable scannen ohne den Inhalt irgendwo anzuzeigen

    • Oscar
    • 27. August 2022 um 08:45
    Zitat von gert_nrw_71

    aber bisher funktioniert es sehr gut

    Hast Du es in etwa so gelöst?

    AutoIt
    #include <GUIConstantsEx.au3>
    #include <StructureConstants.au3>
    #include <WinAPIConstants.au3>
    #include <WinAPIInternals.au3>
    #include <WinAPISys.au3>
    #include <WinAPISysInternals.au3>
    #include <WindowsConstants.au3>
    #include <FileConstants.au3>
    #include <File.au3>
    #include <WinAPI.au3>
    
    Global $Gewerk = "Polsterei"
    Global $Titel = "Polsterei.htm"
    Global $Titelmin = "Polsterei_min.htm"
    
    Global $Freigabe = "\\ste01\planung\"
    Global $hmod, $hHook, $hStub_KeyProc, $buffer = '', $scannerbufferflag = 0
    Global $LogText =""
    Global $Eingabe
    Global $File[5]
    
    ; Hier den Postfix-Code von eurem Scanner eintragen.
    Global $g_iPostfix = 0x0D ;Enter
    ; Hier den Prefix-Code von eurem Scanner eintragen.
    Global $g_iPrefix = 0x71 ;F2
    
    HotKeySet('{ESC}', '_Exit')
    OnAutoItExitRegister('OnAutoItExit')
    Global $hKeyProc = DllCallbackRegister('_KeyProc', 'long', 'int;wparam;lparam')
    Global $hmod = _WinAPI_GetModuleHandle(0)
    Global $hKeyHook = _WinAPI_SetWindowsHookEx($WH_KEYBOARD_LL, DllCallbackGetPtr($hKeyProc), $hmod)
    
    Global $hGui = GUICreate('Barcodescanner', 300, 140)
    Global $idBarcode = GUICtrlCreateLabel('', 10, 10, 280, 30)
    GUICtrlSetFont(-1, 16, 400, 0, 'Courier New')
    Global $idInput = GUICtrlCreateInput('', 10, 50, 280, 30)
    GUICtrlSetFont(-1, 16, 400, 0, 'Courier New')
    GUISetState(@SW_HIDE)
    Global $g_bBufferOk = False, $g_sBuffer = ''
    Do
        If $g_bBufferOk Then
            _StatusSave($g_sBuffer)
            $g_sBuffer = ''
            $g_bBufferOk = False
        EndIf
    Until GUIGetMsg() = $GUI_EVENT_CLOSE
    consolewrite("ende")
    Exit
    
    Func _Exit()
        Exit
    EndFunc
    
    ; ACHTUNG! Callback-Funktion!
    ; In dieser Funktion darf es keinen blockierenden Code (z.B. MsgBox, Sleep, etc.) geben!
    ; Hier werden direkt die virtuellen Keycodes der Tastatur ausgewertet:
    ; https://docs.microsoft.com/en-us/windows/win32/inputdev/virtual-key-codes
    Func _KeyProc($nCode, $wParam, $lParam)
        Local $tKBDLLHOOK = DllStructCreate($tagKBDLLHOOKSTRUCT, $lParam)
        Local $iKeyCode = $tKBDLLHOOK.vkCode, $iPressTime
        Local Static $sBuffer = '', $bBarcodeActive = False
        If $nCode >= 0 Then
            If $iKeyCode = $g_iPrefix And $wParam = $WM_KEYUP Then
                $bBarcodeActive = Not $bBarcodeActive
                ConsoleWrite('$bBarcodeActive = ' & $bBarcodeActive & @CRLF)
                $sBuffer = ''
            EndIf
            If $bBarcodeActive Then
                Switch $wParam
                    Case $WM_KEYDOWN
                        Return 1
                    Case $WM_KEYUP
                        Switch $iKeyCode ; Keycode auswerten
                            Case $g_iPostfix
                                ConsoleWrite(StringFormat('Barcode = "%s"\r\n', $sBuffer))
                                $g_sBuffer = $sBuffer
                                $g_bBufferOk = True
                                $sBuffer = ''
                                $bBarcodeActive = False
                                ConsoleWrite('$bBarcodeActive = ' & $bBarcodeActive & @CRLF)
                                Return 1
                            Case 0x30 To 0x39, 0x41 To 0x5A ; 0 - 9, A - Z
                                $sBuffer &= Chr($iKeyCode)
                                Return 1
                        EndSwitch
                EndSwitch
            EndIf
        EndIf
        Return _WinAPI_CallNextHookEx($hKeyHook, $nCode, $wParam, $lParam)
    EndFunc   ;==>_KeyProc
    
    ; Wichtig! Beim Programmende den Hook wieder entfernen.
    Func OnAutoItExit()
        _WinAPI_UnhookWindowsHookEx($hKeyHook)
        DllCallbackFree($hKeyProc)
    EndFunc   ;==>OnAutoItExit
    
    Func _StatusSave($sBuffer)
        Local $hFile
        If FileExists($Freigabe & "\Prod-Status\" & $Gewerk & "\" & $sBuffer & "_Start.log") Then
            $hFile = FileOpen($Freigabe & "\Prod-Status\" & $Gewerk & "\" & $sBuffer & "_Ende.log", 1)
            beep(500,200)
            beep(500,200)
        Else
            $hFile = FileOpen($Freigabe & "\Prod-Status\" & $Gewerk & "\" & $sBuffer & "_Start.log", 1)
            beep(500,200)
        EndIf
        _FileWriteLog($hFile, $sBuffer & @CRLF)
        FileClose($hFile)
    EndFunc   ;==>StatusSave
    Alles anzeigen

    So, würden auch die Beeps nichts ausmachen, weil die Funktion erst in der Hauptschleife aufgerufen wird.

  • Barcode in Variable scannen ohne den Inhalt irgendwo anzuzeigen

    • Oscar
    • 26. August 2022 um 18:47
    Zitat von gert_nrw_71

    da ist es:

    Die Beeps müssen raus!

    Das ist blockierender Code. Siehe Kommentar in der Callback-Funktion!

    Die Callback-Funktion darf nur wenige Millisekunden betragen.

  • Barcode in Variable scannen ohne den Inhalt irgendwo anzuzeigen

    • Oscar
    • 26. August 2022 um 18:35
    Zitat von gert_nrw_71

    Vielleicht noch eine Idee was das sein könnte ?

    Hast Du da noch etwas anderes eingebaut?

    Bitte poste Dein ganzes Script!

  • GUICtrlCreateIcon mit png-Datei

    • Oscar
    • 26. August 2022 um 17:31
    Zitat von DOheim

    Nun muss ich mir noch überlegen, wie ich die Datei dann passend wieder schreibe.

    Was willst Du denn wirklich machen?

    Weil: das ändern von ein paar Pixel geht mit GDI+ viel einfacher.

    Das funktioniert dann auch mit allen Bildformaten (nicht nur 24-Bit BMP).

  • GUICtrlCreateIcon mit png-Datei

    • Oscar
    • 26. August 2022 um 13:40
    Zitat von BugFix

    Wobei ich ein Arbeiten mit FileSetPos / Read / Write / Flush bevorzugen würde, da dann in einem Aufwasch gelesen und geschrieben werden kann.

    Das einlesen in eine Pixel-Struktur hat vor allem auch den Vorteil, dass man gleich einen adressierbaren Speicher (Pointer auf die Struktur) für eine Assembler-Routine hat.

  • Barcode in Variable scannen ohne den Inhalt irgendwo anzuzeigen

    • Oscar
    • 26. August 2022 um 13:31
    Zitat von gert_nrw_71

    Kann ich das in der Funktion KeyProc hinzufügen ?

    Ja, mit Übergabeparameter geht's ohne Zuweisung an eine globale Variable:

    AutoIt
    #include <GUIConstantsEx.au3>
    #include <StructureConstants.au3>
    #include <WinAPIConstants.au3>
    #include <WinAPIInternals.au3>
    #include <WinAPISys.au3>
    #include <WinAPISysInternals.au3>
    #include <WindowsConstants.au3>
    
    ; Hier den Postfix-Code von eurem Scanner eintragen.
    Global $g_iPostfix = 0x0D
    ; Hier den Prefix-Code von eurem Scanner eintragen.
    Global $g_iPrefix = 0x03
    
    HotKeySet('{ESC}', '_Exit')
    OnAutoItExitRegister('OnAutoItExit')
    Global $hKeyProc = DllCallbackRegister('_KeyProc', 'long', 'int;wparam;lparam')
    Global $hmod = _WinAPI_GetModuleHandle(0)
    Global $hKeyHook = _WinAPI_SetWindowsHookEx($WH_KEYBOARD_LL, DllCallbackGetPtr($hKeyProc), $hmod)
    
    Global $hGui = GUICreate('Barcodescanner', 300, 140)
    Global $idBarcode = GUICtrlCreateLabel('', 10, 10, 280, 30)
    GUICtrlSetFont(-1, 16, 400, 0, 'Courier New')
    Global $idInput = GUICtrlCreateInput('', 10, 50, 280, 30)
    GUICtrlSetFont(-1, 16, 400, 0, 'Courier New')
    GUISetState(@SW_HIDE)
    Do
    Until GUIGetMsg() = $GUI_EVENT_CLOSE
    Exit
    
    Func _Exit()
        Exit
    EndFunc
    
    ; ACHTUNG! Callback-Funktion!
    ; In dieser Funktion darf es keinen blockierenden Code (z.B. MsgBox, Sleep, etc.) geben!
    ; Hier werden direkt die virtuellen Keycodes der Tastatur ausgewertet:
    ; https://docs.microsoft.com/en-us/windows/win32/inputdev/virtual-key-codes
    Func _KeyProc($nCode, $wParam, $lParam)
        Local $tKBDLLHOOK = DllStructCreate($tagKBDLLHOOKSTRUCT, $lParam)
        Local $iKeyCode = $tKBDLLHOOK.vkCode, $iPressTime
        Local Static $sBuffer = '', $bBarcodeActive = False
        If $nCode >= 0 Then
            If $iKeyCode = $g_iPrefix And $wParam = $WM_KEYUP Then
                $bBarcodeActive = Not $bBarcodeActive
                ConsoleWrite('$bBarcodeActive = ' & $bBarcodeActive & @CRLF)
                $sBuffer = ''
            EndIf
            If $bBarcodeActive Then
                Switch $wParam
                    Case $WM_KEYDOWN
                        Return 1
                    Case $WM_KEYUP
                        Switch $iKeyCode ; Keycode auswerten
                            Case $g_iPostfix
                                ConsoleWrite(StringFormat('Barcode = "%s"\r\n', $sBuffer))
                                _StatusSave($sBuffer)
                                $sBuffer = ''
                                $bBarcodeActive = False
                                ConsoleWrite('$bBarcodeActive = ' & $bBarcodeActive & @CRLF)
                                Return 1
                            Case 0x30 To 0x39, 0x41 To 0x5A ; 0 - 9, A - Z
                                $sBuffer &= Chr($iKeyCode)
                                Return 1
                        EndSwitch
                EndSwitch
            EndIf
        EndIf
        Return _WinAPI_CallNextHookEx($hKeyHook, $nCode, $wParam, $lParam)
    EndFunc   ;==>_KeyProc
    
    ; Wichtig! Beim Programmende den Hook wieder entfernen.
    Func OnAutoItExit()
        _WinAPI_UnhookWindowsHookEx($hKeyHook)
        DllCallbackFree($hKeyProc)
    EndFunc   ;==>OnAutoItExit
    
    Func _StatusSave($sBuffer)
        Local $hFile
        If FileExists($Freigabe & "\Prod-Status\" & $Gewerk & "\" & $sBuffer & "_Start.log") Then
            $hFile = FileOpen($Freigabe & "\Prod-Status\" & $Gewerk & "\" & $sBuffer & "_Ende.log", 1)
        Else
            $hFile = FileOpen($Freigabe & "\Prod-Status\" & $Gewerk & "\" & $sBuffer & "_Start.log", 1)
        EndIf
        _FileWriteLog($hFile, $sBuffer & @CRLF)
        FileClose($hFile)
    EndFunc   ;==>StatusSave
    Alles anzeigen
  • GUICtrlCreateIcon mit png-Datei

    • Oscar
    • 24. August 2022 um 18:09

    Ich habe Dir mal ein Script geschrieben, wie ich das angehen würde:

    AutoIt
    #include <Array.au3>
    #include <WinAPIFiles.au3>
    #include <WinAPIHObj.au3>
    #include <WinAPIInternals.au3>
    
    
    Global $sFilename = @ScriptDir & '\rot1.bmp'
    Global $aPixel = _ReadPixel($sFilename)
    _ArrayDisplay($aPixel)
    
    Func _ReadPixel($sFilename)
        Local $tOffset = DllStructCreate('ulong offset')
        Local $tDim = DllStructCreate('ulong width; ulong height')
        Local $tBPP = DllStructCreate('ushort bpp')
        Local $nBytes, $iPad, $iPixelCount, $iBGR, $iOffset = 1
        Local $hFile = _WinAPI_CreateFile($sFilename, 2, 2) ; Datei zum lesen oeffnen
        If Not $hFile Then Return SetError(1)
        _WinAPI_SetFilePointer($hFile, 0x0A) ; 0x0A = Offset auf die Pixeldaten
        _WinAPI_ReadFile($hFile, $tOffset, 4, $nBytes) ; 4 Bytes aus der Datei lesen
        ConsoleWrite('Offset = ' & $tOffset.offset & @CRLF) ; nur zum debuggen
        _WinAPI_SetFilePointer($hFile, 0x12) ; 0x12 = Anfang von Width und Height
        _WinAPI_ReadFile($hFile, $tDim, 8, $nBytes) ; 8 Bytes aus der Datei lesen
        ConsoleWrite('Width = ' & $tDim.width & @CRLF) ; nur zum debuggen
        ConsoleWrite('Height = ' & $tDim.height & @CRLF) ; nur zum debuggen
        _WinAPI_SetFilePointer($hFile, 0x1C) ; 0x1C = Bits per Pixel
        _WinAPI_ReadFile($hFile, $tBPP, 2, $nBytes) ; 2 Bytes aus der Datei lesen
        ConsoleWrite('BPP = ' & $tBPP.bpp & @CRLF) ; nur zum debuggen
        $iPad = Ceiling($tDim.width * 3 / 4) * 4 - $tDim.width * 3 ; das Padding pro Scanzeile ausrechnen
        $iPixelCount = ($tBPP.bpp / 8) * $tDim.width * $tDim.height + $iPad * $tDim.height ; wie viele Pixel
        Local $tPixel = DllStructCreate('byte[' & $iPixelCount & ']') ; Struktur mit den Bytes erstellen
        _WinAPI_SetFilePointer($hFile, $tOffset.offset) ; Filepointer auf den Offset der Pixeldaten setzen
        _WinAPI_ReadFile($hFile, $tPixel, $iPixelCount, $nBytes) ; alle Pixeldaten einlesen
        _WinAPI_CloseHandle($hFile) ; Datei schliessen
        Local $aOut[$tDim.width * $tDim.height], $iCount = 0 ; Ausgabe-Array
        For $iY = 0 To $tDim.height - 1 ; Zeilen-Schleife
            For $iX = 0 To $tDim.width - 1 ; Spalten-Schleife
                $iBGR = 0
                For $i = 0 To 2 ; Schleife fuer B, G, R
                    $iBGR = BitOR($iBGR, BitShift(DllStructGetData($tPixel, 1, $iOffset), -(16 - $i * 8)))
                    $iOffset += 1
                Next
                ConsoleWrite('0x' & Hex($iBGR, 6) & ', ') ; nur zum debuggen
                $aOut[$iCount] = '0x' & Hex($iBGR, 6)
                $iCount += 1
            Next
            $iOffset += $iPad ; nach jeder Scanzeile werden Padding-Bytes eingefuegt (0-3)
            ConsoleWrite(@CRLF) ; nur zum debuggen
        Next
        Return $aOut
    EndFunc
    Alles anzeigen
  • Barcode in Variable scannen ohne den Inhalt irgendwo anzuzeigen

    • Oscar
    • 21. August 2022 um 14:06
    Zitat von BugFix

    dass ein systemweiter Keyboard-Hook auch ohne ein Fenster auskommt und somit die Daten einfängt.

    Ja, wenn ein Prefix gesendet wird, kann man das hier benutzen:

    AutoIt
    #include <GUIConstantsEx.au3>
    #include <StructureConstants.au3>
    #include <WinAPIConstants.au3>
    #include <WinAPIInternals.au3>
    #include <WinAPISys.au3>
    #include <WinAPISysInternals.au3>
    #include <WindowsConstants.au3>
    
    ; Hier den Postfix-Code von eurem Scanner eintragen.
    Global $g_iPostfix = 0x0D
    ; Hier den Prefix-Code von eurem Scanner eintragen.
    Global $g_iPrefix = 0x03
    
    HotKeySet('{ESC}', '_Exit')
    OnAutoItExitRegister('OnAutoItExit')
    Global $hKeyProc = DllCallbackRegister('_KeyProc', 'long', 'int;wparam;lparam')
    Global $hmod = _WinAPI_GetModuleHandle(0)
    Global $hKeyHook = _WinAPI_SetWindowsHookEx($WH_KEYBOARD_LL, DllCallbackGetPtr($hKeyProc), $hmod)
    
    Global $hGui = GUICreate('Barcodescanner', 300, 140)
    Global $idBarcode = GUICtrlCreateLabel('', 10, 10, 280, 30)
    GUICtrlSetFont(-1, 16, 400, 0, 'Courier New')
    Global $idInput = GUICtrlCreateInput('', 10, 50, 280, 30)
    GUICtrlSetFont(-1, 16, 400, 0, 'Courier New')
    GUISetState(@SW_HIDE)
    Do
    Until GUIGetMsg() = $GUI_EVENT_CLOSE
    Exit
    
    Func _Exit()
        Exit
    EndFunc
    
    ; ACHTUNG! Callback-Funktion!
    ; In dieser Funktion darf es keinen blockierenden Code (z.B. MsgBox, Sleep, etc.) geben!
    ; Hier werden direkt die virtuellen Keycodes der Tastatur ausgewertet:
    ; https://docs.microsoft.com/en-us/windows/win32/inputdev/virtual-key-codes
    Func _KeyProc($nCode, $wParam, $lParam)
        Local $tKBDLLHOOK = DllStructCreate($tagKBDLLHOOKSTRUCT, $lParam)
        Local $iKeyCode = $tKBDLLHOOK.vkCode, $iPressTime
        Local Static $sBuffer = '', $bBarcodeActive = False
        If $nCode >= 0 Then
            If $iKeyCode = $g_iPrefix And $wParam = $WM_KEYUP Then
                $bBarcodeActive = Not $bBarcodeActive
                ConsoleWrite('$bBarcodeActive = ' & $bBarcodeActive & @CRLF)
                $sBuffer = ''
            EndIf
            If $bBarcodeActive Then
                Switch $wParam
                    Case $WM_KEYDOWN
                        Return 1
                    Case $WM_KEYUP
                        Switch $iKeyCode ; Keycode auswerten
                            Case $g_iPostfix
                                ConsoleWrite(StringFormat('Barcode = "%s"\r\n', $sBuffer))
                                GUICtrlSetData($idBarcode, $sBuffer)
                                $sBuffer = ''
                                $bBarcodeActive = False
                                ConsoleWrite('$bBarcodeActive = ' & $bBarcodeActive & @CRLF)
                                Return 1
                            Case 0x30 To 0x39, 0x41 To 0x5A ; 0 - 9, A - Z
                                $sBuffer &= Chr($iKeyCode)
                                Return 1
                        EndSwitch
                EndSwitch
            EndIf
        EndIf
        Return _WinAPI_CallNextHookEx($hKeyHook, $nCode, $wParam, $lParam)
    EndFunc   ;==>_KeyProc
    
    ; Wichtig! Beim Programmende den Hook wieder entfernen.
    Func OnAutoItExit()
        _WinAPI_UnhookWindowsHookEx($hKeyHook)
        DllCallbackFree($hKeyProc)
    EndFunc   ;==>OnAutoItExit
    Alles anzeigen
  • Barcode in Variable scannen ohne den Inhalt irgendwo anzuzeigen

    • Oscar
    • 21. August 2022 um 08:24
    Zitat von gert_nrw_71

    aber da gibt es bestimmt noch eine sauberer Lösung, oder ?

    Hmm...das Problem ist, dass da die Tastatureingaben der Gui abgefangen werden.

    Ob und wie man das systemweit machen kann, weiß ich nicht.

    Es ist sogar so, dass die Scandaten an ein anderes Fenster gesendet werden, wenn das gerade aktiv ist. Insofern nützt es wenig, die eigene Gui zu verstecken.

    Was willst Du denn mit den Scandaten machen? Benutzt Du denn gar keine Gui? Es muss ja nicht die Gui aus dem Beispiel sein.

  • Barcode in Variable scannen ohne den Inhalt irgendwo anzuzeigen

    • Oscar
    • 20. August 2022 um 19:24
    Zitat von gert_nrw_71

    Gibt es denn eine Möglichkeit das GUI auszublenden ?

    Ganz ohne Gui geht es nicht, weil die Events Windowbasiert sind. Man kann das Fenster aber verstecken und den Buffer an eine globale Variable übergeben:

    AutoIt
    #include <APISysConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WinAPISys.au3>
    #include <WindowsConstants.au3>
    
    
    ; hier muss der DeviceName von eurem Scanner drinstehen
    ; beim auskommentieren von Zeile 41 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_sBarcode = '' ; die globale Variable, an die die Eingabe uebergeben wird
    
    Global $g_hGui = GUICreate('BarcodeScanner', 300, 120)
    Global $g_idLabel = GUICtrlCreateLabel('', 5, 5, 290, 30, $SS_CENTER) ; fuer die Ausgabe vom Barcode-Scanner
    GUICtrlSetFont(-1, 16)
    
    Local $tRID = DllStructCreate($tagRAWINPUTDEVICE)
    $tRID.UsagePage = 0x01
    $tRID.Usage = 0x06
    $tRID.Flags = $RIDEV_INPUTSINK
    $tRID.hTarget = $g_hGui
    _WinAPI_RegisterRawInputDevices($tRID)
    
    GUIRegisterMsg($WM_INPUT, 'WM_INPUT')
    GUISetState(@SW_HIDE)
    
    Do
    Until GUIGetMsg() = $GUI_EVENT_CLOSE
    Exit
    
    Func WM_INPUT($hWnd, $iMsg, $wParam, $lParam)
        #forceref $hWnd, $iMsg, $wParam
        Local Static $sBuffer = ''
        Local $devType, $devName, $tRIM, $tText
        $tRIM = DllStructCreate($tagRAWINPUTHEADER)
        If Not _WinAPI_GetRawInputData($lParam, $tRIM, DllStructGetSize($tRIM), $RID_HEADER) Then Return
        $devType = $tRIM.Type
        $tText = DllStructCreate('wchar data[256]')
        If Not _WinAPI_GetRawInputDeviceInfo($tRIM.hDevice, $tText, 256, $RIDI_DEVICENAME) Then Return
        $devName = $tText.data
    ;~     ConsoleWrite(StringFormat("DevName: '%s'\r\n", $devName))
        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
                $tRIM = DllStructCreate($tagRAWINPUTKEYBOARD)
                If _WinAPI_GetRawInputData($lParam, $tRIM, DllStructGetSize($tRIM), $RID_INPUT) Then
                    Switch $tRIM.Message
                        Case $WM_KEYDOWN
                            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
                                $g_sBarcode = $sBuffer ; Buffer an die globale Variable uebergeben
                                ConsoleWrite('Global: ' & $g_sBarcode & @CRLF) ; nur zum debuggen
                                $sBuffer = '' ; Buffer leeeren, fuer naechsten Code
                                ConsoleWrite('--- New Code ---' & @CRLF) ; nur zum debuggen
                            Else ; alle anderen Zeichen werden in den Buffer uebernommen
                                $sBuffer &= Chr($tRIM.VKey)
                                ConsoleWrite('Char: ' & Chr($tRIM.VKey) & @CRLF) ; nur zum debuggen
                            EndIf
                    EndSwitch
                    _ClearKeyBuffer() ; die Eingabe vom Barcode-Scanner aus dem Msg-Queue loeschen
                EndIf
            EndIf
        EndIf
        Return $GUI_RUNDEFMSG
    EndFunc   ;==>WM_INPUT
    
    Func _ClearKeyBuffer()
        Local Const $tagMSG = 'hwnd hwnd;uint message;wparam wParam;lparam lParam;dword time;long X;long Y;dword lPrivate'
        Local Const $PM_REMOVE = 0x0001
        Local $tMsg = DllStructCreate($tagMSG), $ret
        Do
            $ret = DllCall('user32.dll', 'bool', 'PeekMessage', 'struct*', $tMsg, 'hwnd', $g_hGui, 'uint', $WM_KEYFIRST, 'uint', $WM_KEYLAST, 'uint', $PM_REMOVE)[0]
        Until $tMsg.message = 0x0101 Or $tMsg.message = 0
    EndFunc
    Alles anzeigen
  • Barcode in Variable scannen ohne den Inhalt irgendwo anzuzeigen

    • Oscar
    • 20. August 2022 um 15:54
    Zitat von gert_nrw_71

    aber ich bekomme einfach die InputBox da nicht raus, kannst du mir da noch einen Tipp geben ?

    Was ist denn so schwer daran, etwas aus dem Script zu löschen?

    AutoIt
    #include <APISysConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WinAPISys.au3>
    #include <WindowsConstants.au3>
    
    
    ; hier muss der DeviceName von eurem Scanner drinstehen
    ; beim auskommentieren von Zeile 41 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_hGui = GUICreate('BarcodeScanner', 300, 120)
    Global $g_idLabel = GUICtrlCreateLabel('', 5, 5, 290, 30, $SS_CENTER) ; fuer die Ausgabe vom Barcode-Scanner
    GUICtrlSetFont(-1, 16)
    
    Local $tRID = DllStructCreate($tagRAWINPUTDEVICE)
    $tRID.UsagePage = 0x01
    $tRID.Usage = 0x06
    $tRID.Flags = $RIDEV_INPUTSINK
    $tRID.hTarget = $g_hGui
    _WinAPI_RegisterRawInputDevices($tRID)
    
    GUIRegisterMsg($WM_INPUT, 'WM_INPUT')
    GUISetState(@SW_SHOW)
    
    Do
    Until GUIGetMsg() = $GUI_EVENT_CLOSE
    Exit
    
    Func WM_INPUT($hWnd, $iMsg, $wParam, $lParam)
        #forceref $hWnd, $iMsg, $wParam
        Local Static $sBuffer = ''
        Local $devType, $devName, $tRIM, $tText
        $tRIM = DllStructCreate($tagRAWINPUTHEADER)
        If Not _WinAPI_GetRawInputData($lParam, $tRIM, DllStructGetSize($tRIM), $RID_HEADER) Then Return
        $devType = $tRIM.Type
        $tText = DllStructCreate('wchar data[256]')
        If Not _WinAPI_GetRawInputDeviceInfo($tRIM.hDevice, $tText, 256, $RIDI_DEVICENAME) Then Return
        $devName = $tText.data
    ;~     ConsoleWrite(StringFormat("DevName: '%s'\r\n", $devName))
        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
                $tRIM = DllStructCreate($tagRAWINPUTKEYBOARD)
                If _WinAPI_GetRawInputData($lParam, $tRIM, DllStructGetSize($tRIM), $RID_INPUT) Then
                    Switch $tRIM.Message
                        Case $WM_KEYDOWN
                            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
                            Else ; alle anderen Zeichen werden in den Buffer uebernommen
                                $sBuffer &= Chr($tRIM.VKey)
                                ConsoleWrite('Char: ' & Chr($tRIM.VKey) & @CRLF) ; nur zum debuggen
                            EndIf
                    EndSwitch
                    _ClearKeyBuffer() ; die Eingabe vom Barcode-Scanner aus dem Msg-Queue loeschen
                EndIf
            EndIf
        EndIf
        Return $GUI_RUNDEFMSG
    EndFunc   ;==>WM_INPUT
    
    Func _ClearKeyBuffer()
        Local Const $tagMSG = 'hwnd hwnd;uint message;wparam wParam;lparam lParam;dword time;long X;long Y;dword lPrivate'
        Local Const $PM_REMOVE = 0x0001
        Local $tMsg = DllStructCreate($tagMSG), $ret
        Do
            $ret = DllCall('user32.dll', 'bool', 'PeekMessage', 'struct*', $tMsg, 'hwnd', $g_hGui, 'uint', $WM_KEYFIRST, 'uint', $WM_KEYLAST, 'uint', $PM_REMOVE)[0]
        Until $tMsg.message = 0x0101 Or $tMsg.message = 0
    EndFunc
    Alles anzeigen
  • Aufrunden Floor etc.

    • Oscar
    • 19. August 2022 um 13:53
    Zitat von wuff100

    Könnt ihr mir helfen?

    Umgekehrt würde ich sagen:

    AutoIt
    $sum = 126
    $res = Ceiling($sum / 10) * 10
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $res = ' & $res & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
  • GUICtrlCreateIcon mit png-Datei

    • Oscar
    • 19. August 2022 um 06:50
    Zitat von DOheim

    ich habe die Funktion BinaryToString gefunden, die meine Wünsche erfüllt .

    Was genau willst Du damit erreichen?

    Was macht es für einen Sinn, die Binärdaten von einem Bild in ein String umzuwandeln?

  • Autostart in TrayTool

    • Oscar
    • 10. August 2022 um 13:46

    Wie kommst Du eigentlich auf $BN_CLICKED?

    So wird schon eher ein Schuh draus:

    AutoIt
    #include <Constants.au3>
    #include <ScreenCapture.au3>
    #include <File.au3>
    #include <GuiButton.au3>
    
    Opt("TrayMenuMode", 1) ; Hide default tray menu items
    Opt("TrayAutoPause", 0) ; This will allow you to click on the TrayIcon without pause the script
    TraySetIcon("Shell32.dll", -325)
    TraySetClick(8) ;only show the menu when right clicking
    #Tray Tip
    TraySetToolTip("Andis ClippingTool -  Bitte klicken für Screenshot")
    
    ;Variablen--------------------------------------------------------------------------------------------------
    $Folderitem = TrayCreateItem("Clip Ordner")
    $delitem = TrayCreateItem("Clip Ordner leeren")
    TrayCreateItem("") ; Create a separator line.
    $Spezitem = TrayCreateItem("Mess Bildschirm")
    TrayItemSetState($Spezitem, $TRAY_UNCHECKED)
    $Holeitem = TrayCreateItem("Ganzer Bildschirm")
    ;$Intervalitem = TrayCreateItem("Intervall-Shot")
    TrayCreateItem("") ; Create a separator line.
    $aboutitem = TrayCreateItem("Über")
    $infoitem = TrayCreateItem("Info")
    $Supportitem = TrayCreateItem("Support-Mail")
    TrayCreateItem("") ; Create a separator line.
    $Mailforwarditem = TrayCreateItem("weiterleiten per Mail (Newest)")
    ;TrayItemSetState($Mailforwarditem,$TRAY_CHECKED)
    $autostartitem = TrayCreateItem("mit Windows starten")
    ;TrayItemSetState($autostartitem,$TRAY_CHECKED)
    $exititem = TrayCreateItem("Exit")
    TraySetState()
    ;MAIN LOOP---------------------------------------------------------------------------------------------------
    While 1
        Switch TrayGetMsg() ;switch seems nicer in this case
            Case $exititem
                Exit
            Case $autostartitem
                If BitAND(TrayItemGetState($autostartitem), $TRAY_CHECKED) Then
                    ConsoleWrite('Autostart-Item Checked' & @CR)
                Else
                    ConsoleWrite('Autostart-Item Unchecked' & @CR)
                EndIf
        EndSwitch
    WEnd
    Alles anzeigen
  • GUICtrlCreateIcon mit png-Datei

    • Oscar
    • 4. August 2022 um 16:29

    Es macht auch gar keinen Sinn, eine Datei mit binären Daten in einem Texteditor anzeigen zu lassen.

    Im besten Fall versucht der Editor die Daten irgendwie als Zeichen darzustellen. Im schlechtesten Fall bricht er die Darstellung beim Nullbyte ab.

    Also wenn eine Darstellung, dann in einem Programm, dass die Daten als Bytefolge darstellen kann, meist im Hexadezimalformat (z.B. HxD "https://mh-nexus.de/de/"). Man kann aber auch AutoIt dafür verwenden:

    AutoIt
    #include <EditConstants.au3>
    #include <FileConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    
    $sSource = "rot.bmp"
    $iSize = FileGetSize($sSource)
    $hFile = FileOpen($sSource, $FO_BINARY)
    $dData = FileRead($hFile)
    FileClose($hFile)
    $iLen = BinaryLen($dData)
    MsgBox(0, "", "Datenlänge: " & $iLen & @CRLF & "Dateilänge: " & $iSize)
    _HexView($dData)
    
    ;~ $sDest = "anzeige.bmp"
    ;~ $hFile = FileOpen($sDest, $FO_OVERWRITE + $FO_BINARY)
    ;~ FileWrite($hFile, $dData)
    ;~ FileClose($hFile)
    
    Func _HexView(ByRef $dData)
        Local Const $CRYPT_STRING_HEXASCIIADDR = 0x0000000B
        Local $hGui = GUICreate('HexView', 800, 600, -1, -1, BitOR($WS_POPUPWINDOW, $WS_CAPTION))
        GUISetBkColor(0xCCCCCC)
        GUICtrlCreateLabel('Offset', 10, 10, 100, 20)
        GUICtrlSetFont(-1, 12, 400, 0, 'Courier New', 5)
        For $i = 0 To 15
            GUICtrlCreateLabel(Hex($i, 2), 90 + $i * 30 + (($i > 7) * 10), 10, 20, 20)
            GUICtrlSetFont(-1, 12, 400, 0, 'Courier New', 5)
        Next
        GUICtrlCreateLabel('ASCII Chars', 600, 10, 190, 20)
        GUICtrlSetFont(-1, 12, 400, 0, 'Courier New', 5)
        Local $idHexView = GUICtrlCreateEdit('', 5, 30, 790, 560, BitOr($WS_VSCROLL, $ES_AUTOVSCROLL, $ES_READONLY))
        GUICtrlSetFont(-1, 12, 400, 0, 'Courier New', 5)
        GUICtrlSetBkColor(-1, 0xFFFFFF)
        GUICtrlSetLimit(-1, 2 ^ 32)
        GUISetState()
        GUICtrlSetData($idHexView, _WinAPI_CryptBinaryToString($dData, $CRYPT_STRING_HEXASCIIADDR))
        Do
        Until GUIGetMsg() = $GUI_EVENT_CLOSE
        GUIDelete($hGui)
    EndFunc
    
    ; Author: Kleiner (www.autoit.de)
    Func _WinAPI_CryptBinaryToString($vString, $Flag)
        Local $Struc = DllStructCreate('byte[' & BinaryLen($vString) & ']')
        DllStructSetData($Struc, 1, $vString)
        Local $Call = DllCall('crypt32.dll', 'int', 'CryptBinaryToString', _
                'ptr', DllStructGetPtr($Struc), _
                'dword', DllStructGetSize($Struc), _
                'dword', $Flag, _
                'ptr', 0, _
                'dword*', 0)
    
        If @error Or Not $Call[0] Then Return SetError(1, 0, '')
    
        Local $iSize = $Call[5]
        Local $Struc_1 = DllStructCreate('char[' & $iSize & ']')
    
        $Call = DllCall('crypt32.dll', 'int', 'CryptBinaryToString', _
                'ptr', DllStructGetPtr($Struc), _
                'dword', DllStructGetSize($Struc), _
                'dword', $Flag, _
                'ptr', DllStructGetPtr($Struc_1), _
                'dword*', $iSize)
    
        If @error Or Not $Call[0] Then Return SetError(2, 0, '')
    
        Return SetError(0, 0, DllStructGetData($Struc_1, 1))
    EndFunc   ;==>_WinAPI_CryptBinaryToString
    Alles anzeigen
  • GUICtrlCreateIcon mit png-Datei

    • Oscar
    • 3. August 2022 um 19:00

    FileOpen im BinaryMode. Sowohl beim lesen als auch beim speichern.

    Alles andere ist sowieso unsinnig.

  • Splash Font automatisch anpassbar

    • Oscar
    • 3. August 2022 um 06:47
    Zitat von casi4712

    jetz ist es egal wie lang der Pfad ist, und er passt Text und Fenster an.

    Naja, der max. Pfad kann 255 Zeichen lang sein.

    Ob es dann noch sinnvoll ist, das Fenster derart anzupassen, kannst nur Du wissen.

    Man könnte den Pfad ja auch in der Mitte kürzen (vorn und hinten der Pfad und in der Mitte nur "..." anzeigen), aber das kommt natürlich darauf an, was Du dem Anwender mit der Pfadanzeige sagen willst.

    Ohne weitere Infos deinerseits, lässt sich das nicht sagen.

  • Splash Font automatisch anpassbar

    • Oscar
    • 2. August 2022 um 16:16
    Zitat von Moombas

    Aber auch dort ist spätestens dann ein Problem, wenn wegen der Länge des Textes eine Zweite/dritte Zeile genutzt wird.

    Nö, ist kein großes Problem:

    AutoIt
    #include <FontConstants.au3>
    #include <GDIPlus.au3>
    #include <WinAPIGdiDC.au3>
    #include <WinAPIGdiInternals.au3>
    #include <WinAPIHObj.au3>
    #include <WinAPISysInternals.au3>
    
    
    Global $sFile = "C:\Users\Administrator\Downloads\Aufgaben\Datei"
    Global $sFontname = 'Arial', $sFontSize = 16
    Global $sText = StringFormat('Die Datei:\r\n"%s"\r\nwurde geschrieben.', $sFile)
    Global $tRect = _CalcTextSize($sText, $sFontname, $sFontSize)
    
    SplashTextOn('Bitte warten', $sText, Ceiling($tRect.Width), Ceiling($tRect.Height) + 24, -1, -1, 20, $sFontname, $sFontSize)
    Sleep(5000)
    
    Func _CalcTextSize(ByRef $sText, ByRef $sFontname, $iFontSize)
        Local $hDC, $hGraphic, $hFormat, $hFamily, $tLayout, $hFont, $aInfo
        _GDIPlus_Startup()
        $hDC = _WinAPI_GetWindowDC(0)
        $hGraphic = _GDIPlus_GraphicsCreateFromHDC($hDC)
        $hFormat = _GDIPlus_StringFormatCreate() ; 0x1000 = wrapping to the next line is disabled
        $hFamily = _GDIPlus_FontFamilyCreate($sFontname)
        $tLayout = _GDIPlus_RectFCreate(0, 0, @DesktopWidth, @DesktopHeight)
        $hFont = _GDIPlus_FontCreate($hFamily, $iFontSize)
        $aInfo = _GDIPlus_GraphicsMeasureString($hGraphic, $sText, $hFont, $tLayout, $hFormat)
        _GDIPlus_FontDispose($hFont)
        _GDIPlus_FontFamilyDispose($hFamily)
        _GDIPlus_StringFormatDispose($hFormat)
        _GDIPlus_GraphicsDispose($hGraphic)
        _WinAPI_ReleaseDC(0, $hDC)
        _GDIPlus_Shutdown()
        Return $aInfo[0]
    EndFunc   ;==>_CalcTextSize
    Alles anzeigen

Spenden

Jeder Euro hilft uns, Euch zu helfen.

Download

AutoIt Tutorial
AutoIt Buch
Onlinehilfe
AutoIt Entwickler
  1. Datenschutzerklärung
  2. Impressum
  3. Shoutbox-Archiv
Community-Software: WoltLab Suite™