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. Bitnugger

Beiträge von Bitnugger

  • _IsPressed() Abfrage strukturieren/verbessern

    • Bitnugger
    • 27. Februar 2021 um 00:56
    Zitat von Professor Bernd

    Das SynEdit (= Editor-Control von PSPad) erlaubt manchmal das Auslesen von einigen Zeilen Text, aber dann ohne ersichtlichen Grund kommen nur noch chinesische Zeichen.

    So geht es...

    AutoIt
    ;-- TIME_STAMP   2021-02-27 00:49:45   v 0.1
    
    ;~ Opt('MustDeclareVars', 1)
    
    #include <WindowsConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <Array.au3>
    #include <Debug.au3>
    #include <SendMessage.au3>
    ;~ #include <WinAPIConv.au3>
    #include <WinAPISys.au3>
    #include <WinAPISysWin.au3>
    ;~ #include <WinGetControls.au3>
    #include <_ConOut.au3> ; <<-- WinAPIConv.au3
    
    Local $aControls, $tChars, $sTxt, $hKeybLayout, $hActive = WinGetHandle('[ACTIVE]'), $hPSPad = ControlGetHandle('[CLASS:TfPSPad]', '', '[CLASS:TPSSynEdit; INSTANCE:1]')
    ConsoleWrite("@@_Debug_line" & @TAB & @TAB & @ScriptLineNumber & "   var: $hPSPad      --> " & $hPSPad & @LF)
    If Not IsHWnd($hPSPad) Then Exit 1
    
    $hKeybLayout = _WinAPI_GetKeyboardLayout($hPSPad)
    ConsoleWrite("@@_Debug_line" & @TAB & @TAB & @ScriptLineNumber & "   var: $hKeybLayout --> " & $hKeybLayout & @LF)
    
    Local $iLen = _SendMessage($hPSPad, $WM_GETTEXTLENGTH)
    If $iLen < 1 Then Exit 2
    
    $tChars = DllStructCreate('char['&$iLen&']')
    _SendMessage($hPSPad, $WM_GETTEXT, $iLen, DllStructGetPtr($tChars))
    For $i = 1 To $iLen Step 1
        $sTxt &= DllStructGetData($tChars, 1, $i)
    Next
    _ConOut($sTxt & @CRLF)
    
    ; Funktioniert, aber nicht wie erwartet!
    ControlFocus('', '', $hPSPad)
    Local $iPID, $aInfo = _WinAPI_GetGUIThreadInfo(_WinAPI_GetWindowThreadProcessId($hPSPad, $iPID))
    ConsoleWrite('- CaretX: ' & $aInfo[7] & ' CaretY: ' & $aInfo[8] & @CRLF)
    
    ;~ $aControls = _WinGetControls(WinGetHandle('[CLASS:TfPSPad]'))
    ;~ _ArrayDisplay($aControls, '$aControls')
    
    WinActivate($hActive)
    Alles anzeigen

    Dateien

    _ConOut.au3 974 Byte – 374 Downloads
  • _MouseGetPosEx

    • Bitnugger
    • 26. Februar 2021 um 15:29

    Finde ich auch gut... so kann man auch ein beliebiges Window angeben:

    AutoIt
    ;-- TIME_STAMP   2021-02-26 15:21:25
    
    #include-once
    #include <WinAPIMisc.au3>
    
    ; Standard: absolute Screenposition
    $tMPos = _WinAPI_GetMousePosEx()
    ConsoleWrite(StringFormat('- Screen absolut                                       >> X:%6s,Y:%6s', $tMPos.X, $tMPos.Y) & @CRLF)
    
    ; MouseCoordMode(0): relativ zum aktiven Fenster
    $tMPos = _WinAPI_GetMousePosEx(1, WinGetHandle('[ACTIVE]'))
    ConsoleWrite(StringFormat('- Akt. Fenster relativ                                 >> X:%6s,Y:%6s', $tMPos.X, $tMPos.Y) & @CRLF)
    
    ; MouseCoordMode(2): relativ zum Clientbereich des aktiven Fensters
    $tMPos = _WinAPI_GetMousePosEx(2, WinGetHandle('[ACTIVE]'))
    ConsoleWrite(StringFormat('- Clientbereich akt. Fenster relativ                   >> X:%6s,Y:%6s', $tMPos.X, $tMPos.Y) & @CRLF)
    
    ; Einzelparameterabfrage
    ConsoleWrite(StringFormat('- Screen absolut, Einzelparamter                       >> X:%6s', _WinAPI_GetMousePosEx().X) & @CRLF)
    
    ; MouseCoordMode(2): relativ zum Clientbereich des angegebenen Fensters
    Run('Notepad.exe')
    $tMPos = _WinAPI_GetMousePosEx(2, WinWait('[CLASS:Notepad]', '', 3))
    ConsoleWrite(StringFormat('! Clientbereich ang. Fenster (Notepad) relativ         >> X:%6s,Y:%6s', $tMPos.X, $tMPos.Y) & @CRLF)
    
    Func _WinAPI_GetMousePosEx($iRel = 0, $hWnd = 0) ; $iRel: 0=rel. aktive/angegeben Wnd., 1=abs. Screen(default), 2=rel. client area aktive/angegeben Wnd.
        If Not IsHWnd($hWnd) Then $hWnd = WinGetHandle('[ACTIVE]')
        Local $tMPos = _WinAPI_GetMousePos($iRel = 2 ? True : False, $hWnd)
        If $iRel = 1 Then
            Local $aPos = WinGetPos($hWnd)
            $tMPos.X -= $aPos[0]
            $tMPos.Y -= $aPos[1]
        EndIf
        Return $tMPos
    EndFunc  ;==>_WinAPI_GetMousePosEx
    Alles anzeigen
  • _IsPressed() Abfrage strukturieren/verbessern

    • Bitnugger
    • 18. Februar 2021 um 02:22

    Mit selbst erstellten Fenstern geht es... WM_TIMER & WM_HOTKEY & WM_KEYDOWN & WM_KEYUP & WM_CHAR

    AutoIt
    ;-- TIME_STAMP   2021-02-18 02:19:06
    
    #cs
    https://docs.microsoft.com/en-us/windows/win32/inputdev/wm-char
    https://www.codeproject.com/Articles/50397/System-Wide-Hooking-for-the-WM-CHAR-Message
    https://docs.microsoft.com/en-us/windows/win32/api/winuser/ns-winuser-msg
    
    #ce
    #include <Array.au3>
    #include <WinAPISys.au3>
    #include <WinAPIConstants.au3>
    #include <WinAPIError.au3>
    #include <WinAPIProc.au3>
    #include <WinAPIConv.au3>
    #include <WindowsConstants.au3>
    
    Opt('MustDeclareVars', 1)
    OnAutoItExitRegister("_CharHookOf")
    
    HotKeySet('^!{F7}', '_Exit') ; Strg+Alt+F7 zum Beenden
    
    Global $g_hMsgProc, $g_hMod, $g_hHook
    
    ; Hier geht nur WM_TIMER & WM_HOTKEY.
    Run("notepad.exe")
    WinWait("[CLASS:Notepad]")
    
    ; Hier geht alles... WM_TIMER & WM_HOTKEY & WM_KEYDOWN & WM_KEYUP & WM_CHAR
    Global $g_hGUI = GUICreate('Input', 200, 24, -1, -1, -1, $WS_EX_TOPMOST)
    GUICtrlCreateInput('', 0, 0, 200, 24)
    GUISetState()
    
    _CharHookOn()
    
    ;~ While True
    ;~     Sleep(20)
    ;~ WEnd
    
    Do
    Until GUIGetMsg() = -3 ; $GUI_EVENT_CLOSE
    
    Func _Exit()
        Exit
    EndFunc
    
    Func _CharHookOn()
        $g_hMsgProc = DllCallbackRegister("_MsgProc", "long", "int;wparam;lparam")
        $g_hMod = _WinAPI_GetModuleHandle(0)
        $g_hHook = _WinAPI_SetWindowsHookEx($WH_GETMESSAGE, DllCallbackGetPtr($g_hMsgProc), $g_hMod, _WinAPI_GetCurrentThreadId())
        If $g_hHook = 0 Then Exit ConsoleWrite(_WinAPI_GetLastErrorMessage() & @CRLF)
    EndFunc
    
    Func _CharHookOf()
        _WinAPI_UnhookWindowsHookEx($g_hHook)
        DllCallbackFree($g_hMsgProc)
    EndFunc
    
    Func _MsgProc($_nCode, $_wParam, $_lParam)
        If $_nCode < 0 Then Return _WinAPI_CallNextHookEx($g_hHook, $_nCode, $_wParam, $_lParam)
    
        Local Static $aOldHook[2]
        Local $sHook, $iMsg, $sMsg, $charCode = @CRLF, $tMSG = DllStructCreate('hwnd hwnd;uint message;wparam wParam;lparam lParam;dword time;struct;long x;long y;endstruct;dword lPrivate;', $_lParam)
    
        $sHook = $iMsg & $tMSG.hwnd & $tMSG.wParam & $tMSG.lParam
    
        $iMsg = $tMSG.message
    
        Switch $iMsg
            Case $WM_TIMER
                Return _WinAPI_CallNextHookEx($g_hHook, $_nCode, $_wParam, $_lParam)
                $sMsg = '- WM_TIMER  '
            Case $WM_HOTKEY
                $sMsg = '- WM_HOTKEY '
            Case $WM_KEYDOWN
                If $sHook = $aOldHook[0] Then Return _WinAPI_CallNextHookEx($g_hHook, $_nCode, $_wParam, $_lParam)
                $aOldHook[0] = $sHook
                $sMsg = '> WM_KEYDOWN'
            Case $WM_KEYUP
                $sMsg = '> WM_KEYUP  '
            Case $WM_CHAR
                If $sHook = $aOldHook[1] Then Return _WinAPI_CallNextHookEx($g_hHook, $_nCode, $_wParam, $_lParam)
                $aOldHook[1] = $sHook
                ; only work with message: $WM_CHAR
                ; wParam from MSG struct is the character code of the pressed key
                $sMsg = '! WM_CHAR   '
                $charCode = ', CharCode: ' & $tMSG.wParam & ' "' & ChrW($tMSG.wParam) & '"' & @CRLF
    ;~         Case True
    ;~             $sMsg = 'Other '
            Case Else
                Return _WinAPI_CallNextHookEx($g_hHook, $_nCode, $_wParam, $_lParam)
        EndSwitch
    
        $sMsg &= _
            ' $iMsg: 0x' & Hex($iMsg, 4) & _
            ', hWnd: ' & $tMSG.hwnd & _
            ', wParam: ' & $tMSG.wParam & _
            ', lParam: ' & $tMSG.lParam & _
            ', Time: [' & _WinAPI_StrFromTimeInterval($tMSG.time)  & ']' & _
            ' x: ' & $tMSG.x & ', y: ' & $tMSG.y & _
            ', lPrivate: ' & $tMSG.lPrivate & _
            $charCode
        ConsoleWrite($sMsg)
    
        Return _WinAPI_CallNextHookEx($g_hHook, $_nCode, $_wParam, $_lParam)
    EndFunc
    Alles anzeigen
  • _IsPressed() Abfrage strukturieren/verbessern

    • Bitnugger
    • 18. Februar 2021 um 00:43
    Zitat von BugFix

    M. M. n. ist das vom Code her korrekt, jedoch erhalte ich ausschliesslich die Messages: WM_TIMER und WM_HOTKEY (beim Beenden) .

    Vermute mal, es liegt daran...

    $pProc Pointer to the hook procedure. If the $iThreadId parameter is zero or specifies the identifier of a thread created by a different process, the $pProc parameter must point to a hook procedure in a DLL. Otherwise, $pProc can point to a hook procedure in the code associated with the current process

    Evtl. lässt sich das Problem hiermit lösen: https://www.autoitscript.com/forum/topic/12…twindowshookex/

  • _IsPressed() Abfrage strukturieren/verbessern

    • Bitnugger
    • 17. Februar 2021 um 00:23

    Ja, das Zitat habe ich als Vorgabe genommen... anders macht es doch auch keinen Sinn... denn SHIFT + 8 + 9 ist ja nicht SHIFT + 8, wobei es bei der Auswertung natürlich auf die Reihenfolge ankommt, in der die Tasten gedrückt wurden... hätte wohl besser SHIFT + 9 + 8 schreiben sollen... denn da darf dann kein "Bingo" kommen!

    Switch...Case...EndSwitch ist übrigens um einiges schneller als For...To...Step...Next... damit könnten die nicht relevanten Tasten (Umschalttasten (Toggle-Keys), z.B. CAPS LOCK ($VK_CAPITAL)) dann auch ohne Mehraufwand ausgelassen werden... Switch benötigt allerdings deutlich mehr Code.

    Zitat von Professor Bernd

    Für wie performant hältst du das ständige Abfragen von 255 Tasten?

    Das nennt sich Polling... und das ist nur in sehr seltenen Fällen eine gute Wahl... doch zu unserem Glück bietet uns Windows ja Message-Handler an, die man registrieren kann, um zu erfahren ob eine Taste gedrückt oder losgelassen wurde... das ist performant!

    Davon bräuchtest du dann (mindestens) folgende: WM_KEYDOWN, WM_SYSKEYDOWN, WM_KEYUP und WM_SYSKEYUP

    Bsp.:

    GUIRegisterMsg($WM_KEYDOWN, 'WM_KEYDOWN')

    GUIRegisterMsg($WM_SYSKEYDOWN, 'WM_KEYDOWN') ; *1

    GUIRegisterMsg($WM_KEYUP, 'WM_KEYUP')

    GUIRegisterMsg($WM_SYSKEYUP, 'WM_KEYUP') ; *1

    *1 Kann man natürlich auch in eigene Funktionen umleiten, ist aber nicht nötig.

    In der Funktion WM_KEYDOWN fügst du die gedrückte Taste deinem Array *2 hinzu, in der Funktion WM_KEYUP löscht du die losgelassene Taste (falls vorhanden) wieder aus dem Array.

    *2 Array evtl. sortieren, um die Auswertung zu vereinfachen.

    Die (255) Tasten müssen dann nicht mehr überprüft werden... und falls doch, dann nur bei einem KEYDOWN-Event... was evtl. besser mit _WinAPI_GetKeyboardState in einem Rutsch gemacht werden sollte, als 255 mal _IsPressed (_WinAPI_GetAsyncKeyState) aufzurufen.

    Ich habe dafür bereits ein fast fertiges Script, in dem das zu verwendende Tastaturlayout beliebig umgestellt werden kann... getestet habe ich mit de-DE, en-EN und fr-FR... und es funktioniert!

    Es dauert aber noch etwas, bis ich es fertig habe... bin mom. nicht in Form... starke Kopfschmerzen... schätze mal bis zum WE.

    Was mich allerdings interessieren würde... gibt es auch eine (Dll-)Funktion, mit der ich beim Drücken von z.B. SHIFT + 8 aus den VkCodes ($wParam) das auszugebende Zeichen "(" ermitteln kann?

    Bsp. Send("("):

    "(" -->> 10|38|A0 -->> $VK_SHIFT + $VK_8 + $VK_LSHIFT

    "(" -->> 10|38|A1 -->> $VK_SHIFT + $VK_8 + $VK_RSHIFT

    10|38|A0 -->> $VK_SHIFT + $VK_8 + $VK_LSHIFT -->> "(" ?

    10|38|A1 -->> $VK_SHIFT + $VK_8 + $VK_RSHIFT -->> "(" ?

    Alternativ zu den Message-Handlern ginge es auch mit _WinAPI_SetWindowsHookEx...

  • _IsPressed() Abfrage strukturieren/verbessern

    • Bitnugger
    • 16. Februar 2021 um 09:46
    Zitat von Professor Bernd

    Global Const $User32 = DllOpen("User32.dll")

    Wenn du die Dll schon öffnest, warum benutzt du sie dann nicht?

    Zitat von Professor Bernd

    If _IsPressed($aKeyCodes[0])

    If _IsPressed($aKeyCodes[0], $User32) ...

    Zitat von Professor Bernd

    #include <WinAPISys.au3>

    Wofür?

    Du prüfst übrigens auch nicht, ob noch weitere Tasten gedrückt sind... z.B. SHIFT + 8 + 9 -->> 10|38|39|A1

    Es gibt zudem auch billige Tastaturen, die nicht mehr als 3 Zeichen gleichzeitig verarbeiten können...

    Hier mal meine Version:

    AutoIt: Bingo.au3
    ;-- TIME_STAMP   2021-02-16 09:14:13
    
    Opt('MustDeclareVars', 1)
    
    #include <Array.au3>
    #include <Misc.au3>
    
    Global Const $User32 = DllOpen("User32.dll")
    
    ; =====================================================
    ; "(" -->> 10|38|A0 -->> $VK_SHIFT + $VK_8 + $VK_LSHIFT
    ; "(" -->> 10|38|A1 -->> $VK_SHIFT + $VK_8 + $VK_RSHIFT
    ; =====================================================
    
    _Bingo()
    
    Func _Bingo()
        Local $aPressed[0], $sPressed, $sOldPressed
        ToolTip('Press RSHIFT + 8 or LSHIFT + 8 ...or SHIFT + F1 for Exit', @DesktopWidth / 2 - 150, @DesktopHeight / 2)
        GUICreate('Bingo', 1, 1, -80, -80) ; <<-- GUI muss aktiv sein, damit die Tasteneingaben funktionieren und keinen Unsinn machen!
        GUISetState()
        While 1
            Sleep(10)
            _GetPressedKeys($aPressed)
            If UBound($aPressed) Then
                $sPressed = _ArrayToString($aPressed)
                If StringRegExpReplace($sPressed, '10\|70\|(A0|A1)', '') = '' Then Exit ; SHIFT + F1
                If $sPressed <> $sOldPressed Then
                    $sOldPressed = $sPressed
                    If $sPressed = '10|38|A1' Or $sPressed = '10|38|A0' Then
                        ConsoleWrite('! Bingo!!!             -->> ' & $sPressed & ($sPressed = '10|38|A1' ? ' (RSHIFT + 8)' : ' (LSHIFT + 8)') & @CRLF)
                    ElseIf StringRegExpReplace($sPressed, '10|A0|A1|\|', '') Then
                        ConsoleWrite('> Magst du kein Bingo? -->> ' & $sPressed & @CRLF)
                    EndIf
                EndIf
                ReDim $aPressed[0]
            EndIf
        WEnd
    EndFunc   ;==>_Bingo
    
    Func _GetPressedKeys(ByRef $aPressed)
        For $i = 1 To 255 Step 1
            If _IsPressed(Hex($i, 2), $User32) Then _ArrayAdd($aPressed, Hex($i, 2))
        Next
    EndFunc   ;==>_GetPressedKeys
    Alles anzeigen
  • GuiCtrlInfo.au3

    • Bitnugger
    • 13. Februar 2021 um 15:43

    So was in der Art gibt es bereits... hier meine erweiterte Version davon:

    Controls.png

    Dateien

    WinGetControls.7z 4,28 kB – 431 Downloads
  • Viewlist Checkboxen, Array Container

    • Bitnugger
    • 11. Februar 2021 um 19:59
    Zitat von MojoeB

    <data>TEST GERÄT 8836</data>=<SIM>491755502399</SIM><TYP>testtyp</TYP><BS>STUTTGART/BS>

    Hier fehlt das < vor /BS>

    Schau mal hier:

    AutoIt
    ;-- TIME_STAMP   2021-02-11 20:24:58   v 0.1
    
    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    ;~ #include <Array.au3> ; _ArrayDisplay
    #include <GUIListView.au3>
    
    Global $hForm1, $idListView, $idBtnTest
    
    Global $aFile = FileReadToArray('test.bbdb'), $aDATA[UBound($aFile)][4], $aRx
    
    For $i = 0 To UBound($aFile) - 1 Step 1
        $aRx = StringRegExp($aFile[$i], "<data>(.*?)</data>=<SIM>(.*?)</SIM><TYP>(.*?)</TYP><BS>(.*?)</BS>", 3)
        If @error Then
            ConsoleWrite("! Error parsing line " & $i & ": '" & $aFile[$i] & "'" & @CRLF)
        Else
            For $j = 0 To UBound($aRx) -1 Step 1
                $aDATA[$i][$j] = $aRx[$j]
            Next
        EndIf
    Next
    ;~ _ArrayDisplay($aDATA, '$aDATA', '', 0, Default, 'data|SIM|TYP|BS')
    
    $hForm1 = GUICreate("Form1", 600, 400)
    $idBtnTest = GUICtrlCreateButton("Test", 5, 360, 590, 30, BitOR($BS_NOTIFY, $BS_FLAT))
    ;~ $idListView = GUICtrlCreateListView("data|SIM|TYP|BS", 5, 5, 590, 350,  -1, BitOR($LVS_EX_FULLROWSELECT, $LVS_EX_CHECKBOXES))
    $idListView = GUICtrlCreateListView("data|SIM|TYP|BS", 5, 5, 590, 350, BitOR($GUI_SS_DEFAULT_LISTVIEW, $WS_BORDER), BitOR($LVS_EX_FULLROWSELECT, $LVS_EX_CHECKBOXES))
    _GUICtrlListView_SetColumnWidth($idListView, 0, 150) ; data
    _GUICtrlListView_SetColumnWidth($idListView, 1, 100) ; SIM
    _GUICtrlListView_SetColumnWidth($idListView, 2, 150) ; TYP
    _GUICtrlListView_SetColumnWidth($idListView, 3, 150) ; BS
    _GUICtrlListView_AddArray($idListView, $aDATA)
    
    GUISetState(@SW_SHOW)
    
    While 1
        $nMsg = GUIGetMsg()
        Switch $nMsg
            Case $GUI_EVENT_CLOSE
                Exit
            Case $idBtnTest
                For $i = 0 To UBound($aDATA) - 1 Step 1
                    If _GUICtrlListView_GetItemChecked($idListView, $i) Then
                        ConsoleWrite(StringFormat('> Item %i is checked! \t -->> data: %-26s SIM: %14s TYP: %-26s BS: %s\n', $i, $aDATA[$i][0], $aDATA[$i][1], $aDATA[$i][2], $aDATA[$i][3]))
                    EndIf
                Next
        EndSwitch
    WEnd
    Alles anzeigen
  • Fehler in der ENGLISCHEN Hilfe bitte hier melden

    • Bitnugger
    • 10. Februar 2021 um 23:10

    Ok, nehme alles zurück - Bernd hat recht!

  • Fehler in der ENGLISCHEN Hilfe bitte hier melden

    • Bitnugger
    • 10. Februar 2021 um 23:04
    Zitat von Professor Bernd

    Ganz klar ist mir das mit der Zählweise nicht, aber offensichtlich beginnt die Zählung mit 0 für das niedrigstwertige Bit (LSB) auf der rechten Seite und läuft nach links.

    Nicht Zählung, sondern Nummerierung - oder noch genauer: Durchnummerierung

    Hier noch mal eine Übersicht:

    AutoIt
    ;                                    Bitnummer
    Switch $iFlags ; x = 'reserved'      76543210
        Case $LLKHF_ALTDOWN   ; 0x0020 - 0010xxx0 - bit 5
            ...
        Case $LLKHF_EXTENDED  ; 0x0001 - 0000xxx1 - bit 0
            ...
        Case $LLKHF_INJECTED  ; 0x0010 - 0001xxx0 - bit 4
            ...
        Case $LLKHF_UP        ; 0x0080 - 1000xxx0 - bit 7
            ...
    EndSwitch
    Alles anzeigen

    Nur die Bits 0, 4, 5 und 7 sind zur Auswertung relevant, die Bits 1-3 sind 'reserved' und Bit 6 wird nicht benutzt bzw. ist auch 'reserved'.

  • Fehler in der ENGLISCHEN Hilfe bitte hier melden

    • Bitnugger
    • 10. Februar 2021 um 22:36
    Zitat von water

    Sehe ich das richtig?

    Ahhh... ich denke ja, durch dein Einfügen von "Bit" wird es direkt viel verständlicher!

    The Value ... bezieht sich also auf das flag 0

    AutoIt
    Switch $iFlags ; x = 'reserved'
        Case $LLKHF_ALTDOWN  ; 0x0020 - 0010xxx0
            ...
        Case $LLKHF_EXTENDED ; 0x0001 - 0000xxx1
            ...
        Case $LLKHF_INJECTED ; 0x0010 - 0001xxx0
            ...
        Case $LLKHF_UP       ; 0x0080 - 1000xxx0
            ...
    EndSwitch
  • Fehler in der ENGLISCHEN Hilfe bitte hier melden

    • Bitnugger
    • 10. Februar 2021 um 20:20

    Keyword $tagKBDLLHOOKSTRUCT

    flags...
    0 - Specifies whether the key is an extended key, such as a function key or a key on the numeric keypad
    The value is 1 if the key is an extended key; otherwise, it is 0
    1 to 3 - Reserved
    ...

    Sollte hier nicht 2 to 3 - Reserved stehen?

  • Flags auswerten mit Bitmasken - Verständnisfrage

    • Bitnugger
    • 10. Februar 2021 um 19:06

    Hier noch eine Schleifen-Variante:

    AutoIt
    _ShiftState(63) ;-)
    
    Func _ShiftState($extended)
        Local Const $aShiftState = ["  1, 'Either SHIFT key is pressed.' ", "  2, 'Either CTRL key is pressed.' ", "  4, 'Either ALT key is pressed.' ", "  8, 'The Hankaku key is pressed' ", " 16, 'Reserved (defined by the keyboard layout driver).' ", " 32, 'Reserved (defined by the keyboard layout driver).' "]
        If $extended < 1 Then Return " [" & $extended & ", '']"
        If $extended > 63 Then Exit $extended ; Fehler wenn größer 63!
        Local $sRet
        For $i = 0 To 5 Step 1 ; 0 To 3 wäre wohl ausreichend, da 16 und 32 ja "Reserved" sind, es diese also noch nicht gibt.
            $sRet &= BitAND($extended, 2^$i) ? $aShiftState[$i] : ''
        Next
        Return $extended & ' [' & $sRet & ']' & ($extended = 6 ? ' (AltGr)' : '')
    EndFunc   ;==>_ShiftState
    Alles anzeigen
  • Systemweit ermitteln, ob ein "(" per Tastatur eingegeben wurde - UNABHÄNGIG vom Tastaturlayout

    • Bitnugger
    • 10. Februar 2021 um 17:35
    Zitat von BugFix

    AltGr gibt es eigentlich nicht

    https://de.wikipedia.org/wiki/Alt_Gr

  • Systemweit ermitteln, ob ein "(" per Tastatur eingegeben wurde - UNABHÄNGIG vom Tastaturlayout

    • Bitnugger
    • 9. Februar 2021 um 03:33
    Zitat von Professor Bernd

    Zu deinem Code. Hattest du den bei dir rumliegen, oder schnell mal aus dem Ärmel geschüttelt? (Bitte sag, dass du den NICHT mal eben schnell erstellt hast!)

    Auf die Gefahr hin, dass wir dann keine Freunde mehr sind... den habe ich in der Tat mal eben schnell aus dem Ärmel geschüttelt. 8o

    Ohne den Link von @Musashi hätte ich das aber nicht hinbekommen...

  • Systemweit ermitteln, ob ein "(" per Tastatur eingegeben wurde - UNABHÄNGIG vom Tastaturlayout

    • Bitnugger
    • 9. Februar 2021 um 02:43

    Interessantes Thema... hier mal mein Testscript:

    AutoIt
    ;-- TIME_STAMP   2021-02-09 02:42:19   v 0.1
    
    ;~ Opt('MustDeclareVars', 1)
    
    #include <WinAPISys.au3>
    
    Global $g_iOutEncoding = Int(StringRegExpReplace(FileRead(@LocalAppDataDir & '\AutoIt v3\SciTE\SciTEUser.properties'), '(?s).+\Routput\.code\.page=(.+?)\R.*', '\1'))
    
    ; "§" funktioniert mit der DE-Tastatur, weil es das Zeichen dort gibt.
    ; "§" funktioniert nicht mit der US-Tastatur, weil es das Zeichen dort nicht gibt.
    
    ConsoleWrite('- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ' & @CRLF)
    Local $hLayout, $hWnd = WinGetHandle('AutoIt Help'), $dwhkl = _WinAPI_GetKeyboardLayout($hWnd)
    _ConOut('> vkKeyScan for [' & "(" & '] = [' & _VkKeyScan("(") & '] @extended = ' & _ShiftState(@extended) & @CR & @CR)
    _ConOut('- vkKeyScan for [' & "@" & '] = [' & _VkKeyScan("@") & '] @extended = ' & _ShiftState(@extended) & @CR & @CR)
    _ConOut('+ vkKeyScan for [' & "§" & '] = [' & _VkKeyScan("§") & '] @extended = ' & _ShiftState(@extended) & @CR)
    ConsoleWrite('- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ' & @CRLF)
    
    _ConOut('> vkKeyScan for [' & "(" & '] = [' & _VkKeyScan("(", $dwhkl) & '] @extended = ' & _ShiftState(@extended) & @CR & @CR)
    _ConOut('- vkKeyScan for [' & "@" & '] = [' & _VkKeyScan("@", $dwhkl) & '] @extended = ' & _ShiftState(@extended) & @CR & @CR)
    _ConOut('+ vkKeyScan for [' & "§" & '] = [' & _VkKeyScan("§", $dwhkl) & '] @extended = ' & _ShiftState(@extended) & @CR)
    ConsoleWrite('- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ' & @CRLF)
    
    $hLayout = _WinAPI_LoadKeyboardLayout(0x0409, $KLF_SETFORPROCESS) ; en-US
    _ConOut('> vkKeyScan for [' & "(" & '] = [' & _VkKeyScan("(", $hLayout) & '] @extended = ' & _ShiftState(@extended) & @CR & @CR)
    _ConOut('- vkKeyScan for [' & "@" & '] = [' & _VkKeyScan("@", $hLayout) & '] @extended = ' & _ShiftState(@extended) & @CR & @CR)
    _ConOut('+ vkKeyScan for [' & "§" & '] = [' & _VkKeyScan("§", $hLayout) & '] @extended = ' & _ShiftState(@extended) & @CR) ; "§" funktioniert nicht, weil es das Zeichen auf der US-Tastatur nicht gibt.
    ConsoleWrite('- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ' & @CRLF)
    _WinAPI_UnloadKeyboardLayout($hLayout)
    Exit
    
    ; return value is VK code
    ; @extended contains shift state
    Func _VkKeyScan($s_Char, $hLocale = '')
        Local $aRet, $hLayout
        _ConOut('! $s_Char              = ' & $s_Char & @CRLF)
        ConsoleWrite('! AscW($s_Char)        = ' & AscW($s_Char) & @CRLF)
        _ConOut('! Unicode code for "' & $s_Char & '" = U+' & Hex(AscW($s_Char), 6) & @CRLF)
    
        If IsPtr($hLocale) Then
            ConsoleWrite('- $hLocale             = ' & $hLocale & @TAB & "The language of the KB is: " & _GetLanguage($hLocale) & " (" & LCIDToLocaleName($hLocale) & ")" & @CRLF)
    ;~         $aRet = DllCall("user32.dll", "short", "VkKeyScanEx", "ushort", Asc($s_Char), 'dword', $hLocale)   ; OK!
            $aRet = DllCall("user32.dll", "short", "VkKeyScanEx", "ushort", AscW($s_Char), 'dword', $hLocale)  ; OK!
    ;~         $aRet = DllCall("user32.dll", "short", "VkKeyScanExA", "ushort", Asc($s_Char), 'dword', $hLocale)  ; OK!
    ;~         $aRet = DllCall("user32.dll", "short", "VkKeyScanExW", "ushort", AscW($s_Char), 'dword', $hLocale) ; OK!
        Else
            $hLayout = _WinAPI_GetKeyboardLayout(WinGetHandle(""))
            ConsoleWrite('! $hLayout             = ' & $hLayout & @TAB & "The language of the KB is: " & _GetLanguage($hLayout) & " (" & LCIDToLocaleName($hLayout) & ")" & @CRLF)
    ;~         $aRet = DllCall("user32.dll", "short", "VkKeyScan", "ushort", Asc($s_Char))   ; OK!
            $aRet = DllCall("user32.dll", "short", "VkKeyScan", "ushort", AscW($s_Char))  ; OK!
    ;~         $aRet = DllCall("user32.dll", "short", "VkKeyScanA", "ushort", Asc($s_Char))  ; OK!
    ;~         $aRet = DllCall("user32.dll", "short", "VkKeyScanW", "ushort", AscW($s_Char)) ; OK!
        EndIf
        If @error Then Return SetError(@error, @extended, -1)
        If $aRet[0] = -1 Then Return SetError(@error, @extended, -2)
        Return SetExtended(BitShift($aRet[0], 8), BitAND($aRet[0], 0xFF) & '] = ["' & ChrW(BitAND($aRet[0], 0xFF)) & '"')
    EndFunc   ;==>_VkKeyScan
    
    Func _ShiftState($extended)
        If $extended = -1 Then Return $extended & ' [""]'
        Local $sRet
        For $i = 0 To 6 Step 1
    ;~         ConsoleWrite('BitAND('&$extended&', '&2^$i&') = ' & BitAND($extended, 2^$i) & @CRLF)
            Switch True
                Case $extended = 0
                    Return '0 [""]'
                Case BitAND($extended, 2^$i) = 1
                    $sRet &= " 1, 'Either SHIFT key is pressed.' "
                Case BitAND($extended, 2^$i) = 2
                    $sRet &= " 2, 'Either CTRL key is pressed.' "
                Case BitAND($extended, 2^$i) = 4
                    $sRet &= " 4, 'Either ALT key is pressed.' "
                Case BitAND($extended, 2^$i) = 8
                    $sRet &= " 8, 'The Hankaku key is pressed' "
                Case BitAND($extended, 2^$i) = 16
                    $sRet &= " 16, 'Reserved (defined by the keyboard layout driver).' "
                Case BitAND($extended, 2^$i) = 32
                    $sRet &= " 32, 'Reserved (defined by the keyboard layout driver).' "
            EndSwitch
        Next
        If $sRet = '' Then Exit $extended
        Return $extended & ' [' & $sRet & ']' & ($extended = 6 ? ' (AltGr)' : '')
    EndFunc   ;==>_ShiftState
    
    ; Retrieve the language of the operating system.
    Func _GetLanguage($hLayout = '')
        ; @OSLang is four characters in length, the first two is the dialect and the remaining two are the language group.
        ; Therefore we only require the language group and therefore select the two right-most characters.
        If $hLayout = '' Then $hLayout = @KBLayout
    ;~     Switch StringRight(@OSLang, 2)
        Switch StringRight($hLayout, 2)
            Case "07"
                Return "German"
            Case "09"
                Return "English"
            Case "0a"
                Return "Spanish"
            Case "0b"
                Return "Finnish"
            Case "0c"
                Return "French"
            Case "10"
                Return "Italian"
            Case "13"
                Return "Dutch"
            Case "14"
                Return "Norwegian"
            Case "15"
                Return "Polish"
            Case "16"
                Return "Portuguese"
            Case "1d"
                Return "Swedish"
    
            Case Else
                Return "Other (can't determine with @OSLang directly)"
        EndSwitch
    EndFunc   ;==>_GetLanguage
    
    Func LCIDToLocaleName($iLCID)
        If IsPtr($iLCID) Then
            $iLCID = '0x0000' & StringRight($iLCID, 4)
        ElseIf $iLCID = '' Then
            $iLCID = '0x' & @KBLayout
        EndIf
        Local $aRet = DllCall("kernel32.dll", "int", "LCIDToLocaleName", "int", $iLCID, "wstr", "", "int", 85, "dword", 0)
        Return $aRet[2]
    EndFunc   ;==>LCIDToLocaleName
    
    ; Damit die Umlaute und Sonderzeichen "in der Console und in SciTE" korrekt dargestellt werden.
    Func _ConOut($vText)
        ; String(), Damit _WinAPI_WideCharToMultiByte nicht abstürzt, wenn kein String übergeben wurde!
        ConsoleWrite(_WinAPI_WideCharToMultiByte(String($vText), @Compiled ? 1 : $g_iOutEncoding, True, False))
    EndFunc   ;==>_ConOut
    Alles anzeigen
  • Liste sämtlicher Windows 10 Icons + Möglichkeit diese nach Belieben zu ersetzen

    • Bitnugger
    • 28. Januar 2021 um 16:38
    Zitat von Masel_tov

    Da ich eine Möglichkeit suche, die Ikonen einfach in einem Rutsch in die Registry zu importieren, habe ich ein *.cmd-Script zusammengebastelt:

    Hier mal zuerst dein Script... allerdings in einer viel kürzeren Variante...

    Code
    @echo off & setlocal
    
    set "Extensions=001 AVI bat bmp cab cmd css DIVX dll doc FLAC FLV gif H264 H265 hta htm html ini jar jpeg jpg Ink M4V MIDI MKV MOV MP4 MPEG MPG MTS nfo odt part pdf png rar searchConnector-ms tar tiff TS txt URL WAV WMA WMV xsl log"
    
    FOR /D %%I in (%Extensions%) do call :import %%I
    Pause & goto :eof REM Alternative für Exit
    
    :import
    @echo reg import D:\KeepDesktopIcons\%~1.reg
    reg import D:\KeepDesktopIcons\%~1.reg
    ::Timeout 1 >nul REM "::" entfernen, um die Zeile zu aktivieren
    Alles anzeigen

    Hier eine Liste der Windows 10 File Type and Protocol Associations - direkt im ersten Beitrag zu diesem Thread findest du eine Lösung, wie du es mit dism machen kannst... in einem Rutsch!

    Zitat

    If you want to save your all your current associations to a file:

    dism /online /Export-DefaultAppAssociations:C:\PATH\TO\FILE.xml


    If you want to restore your associations as the new default associations for new users:

    dism /online /Import-DefaultAppAssociations:C:\PATH\TO\FILE.xml

    _WinAPI_AssocQueryString ; Sucht nach einer Datei- oder Protokollzuordnungszeichenfolge und ruft sie aus der Registrierung ab

    Damit kannst du u.A. das derzeit verwendete Icon für einen Dateityp oder ein Protokoll ermitteln. Ein Bsp. dazu findest du in der AutoIt-Hilfe.

  • ListViewEdit.au3 mit FrameRect (Alpha Version) - In-Place-Editieren aller ListView-Items

    • Bitnugger
    • 20. Januar 2021 um 21:41

    Neue Version in Post #1!

    - Fehler mit ControlGetPos korrigiert

    - Frame-Handling verfeinert, wenn Maus im ListView-Header steht.

    - Debugausgabe + MsBoxEx... (wenn $g_bDebug = True) ...benötigt ToolTipEx.au3... oder einfach die Include-Zeile auskommentieren.

  • Controller auslesen

    • Bitnugger
    • 19. Januar 2021 um 17:36
    Zitat von Gofel

    Ich werde da wohl erstmal mit leben müssen.

    Nun ja, das ist aber nicht wirklich ein Problem... wenn du die GUI nicht brauchst, dann minimiere sie doch einfach beim Start...

    Hier noch eine letzte Version mit minimierter GUI, in der ich auch alle nicht mehr benötigten Zeilen entfernt habe.

    AutoIt
    ;-- TIME_STAMP   2021-01-19 16:21:58
    
    ;~ https://autoit.de/thread/87245-controller-auslesen/#wcf22
    
    #NoTrayIcon
    
    #include <Array.au3> ; _ArrayToString
    #include <WinAPIDiag.au3> ; _WinAPI_DisplayStruct
    
    Opt('MustDeclareVars', 1)
    
    GUICreate("") ;,1,1,-1,-1)
    GUISetState(@SW_SHOWMINIMIZED)
    
    ;~ If Not HotKeySet('{ESC}', '_Exit') Then Exit 1
    
    Global Const $tagJOYINFOEX = 'STRUCT; DWORD dwSize; DWORD dwFlags; DWORD dwXpos; DWORD dwYpos; DWORD dwZpos; DWORD dwRpos; DWORD dwUpos; DWORD dwVpos; DWORD dwButtons; DWORD dwButtonNumber; DWORD dwPOV; DWORD dwReserved1; DWORD dwReserved2; ENDSTRUCT;'
    
    Global $g_tJOYINFOEX = _GPExInitialize(), $g_aJoyRawData
    
    AdlibRegister('_Adlib_GPExGetRawData', 1000) ; 1000 = 1x pro Sekunde
    
    Do
    Until GUIGetMsg() = -3
    
    Func _Adlib_GPExGetRawData()
        Local Static $aOldJoyRawData, $sColor = '>'
        $g_aJoyRawData = _GPExGetRawData($g_tJOYINFOEX, 0) ; Get almost every data possible from the gamepad. Returns in an array with 8 elements.
        ;
        ; Display the RAW output.
        ;
        ; ---> Resize the console area so that you can have all the outputs and then move the gamepad. <---
        ;
        If _ArrayToString($g_aJoyRawData, '') <> _ArrayToString($aOldJoyRawData, '') Then
            $aOldJoyRawData = $g_aJoyRawData
            ConsoleWrite(@CRLF & $sColor& " ==========================================================")
            ConsoleWrite(@CRLF & $sColor& " [0] " & $g_aJoyRawData[0]) & ' X Axis'
            ConsoleWrite(@CRLF & $sColor& " [1] " & $g_aJoyRawData[1]) & ' Y Axis'
            ConsoleWrite(@CRLF & $sColor& " [2] " & $g_aJoyRawData[2]) & ' Z Axis'
            ConsoleWrite(@CRLF & $sColor& " [3] " & $g_aJoyRawData[3]) & ' R Axis'
            ConsoleWrite(@CRLF & $sColor& " [4] " & $g_aJoyRawData[4]) & ' U Axis'
            ConsoleWrite(@CRLF & $sColor& " [5] " & $g_aJoyRawData[5]) & ' V Axis'
            ConsoleWrite(@CRLF & $sColor& " [6] " & $g_aJoyRawData[6]) & ' Point of View'
            ConsoleWrite(@CRLF & $sColor& " [7] " & $g_aJoyRawData[7]) & ' Buttons'
            ConsoleWrite(@CRLF & $sColor& " ==========================================================" & @CRLF)
            $sColor = $sColor = '>' ? '-' : '>'
        EndIf
    EndFunc   ;==>_Adlib_GPExGetRawData
    
    Func _GPExInitialize()
        ; https://docs.microsoft.com/en-us/previous-versions/ms709358(v=vs.85)
        Local $tJOYINFOEX = DllStructCreate($tagJOYINFOEX)
        If @error Then
            ConsoleWrite('Error by DllStructCreate($tagJOYINFOEX) : ' & @LF & "!@ " & @TAB & "#Error: " & @error & @LF)
            Exit
        EndIf
    
        DllStructSetData($tJOYINFOEX, 'dwSize', DllStructGetSize($tJOYINFOEX)) ; sizeof(struct)
        DllStructSetData($tJOYINFOEX, 'dwFlags', 255) ; GetAll
    
    ;~     _WinAPI_DisplayStruct($tJOYINFOEX, $tagJOYINFOEX, 'GPExInitialize: $tJOYINFOEX STRUCT; ...')
        Return $tJOYINFOEX
    EndFunc   ;==>_GPExInitialize
    
    Func _GPExGetRawData($tJOYINFOEX, $iJoyID)
        #Tidy_Off
        Local Const _
                $MMSYSERR_NOERROR      =   0, _ ; successful
                $MMSYSERR_ERROR        =   1, _
                $MMSYSERR_BADDEVICEID  =   2, _ ; Windows 95/98/Me: The specified joystick identifier is invalid.
                $MMSYSERR_NOTENABLED   =   3, _
                $MMSYSERR_ALLOCATED    =   4, _
                $MMSYSERR_INVALHANDLE  =   5, _
                $MMSYSERR_NODRIVER     =   6, _ ; The joystick driver is not present.
                $MMSYSERR_NOMEM        =   7, _
                $MMSYSERR_NOTSUPPORTED =   8, _
                $MMSYSERR_BADERRNUM    =   9, _
                $MMSYSERR_INVALFLAG    =  10, _
                $MMSYSERR_INVALPARAM   =  11, _ ; An invalid parameter was passed. Windows 95/98/Me: The specified joystick identifier is invalid.
                $MMSYSERR_HANDLEBUSY   =  12, _
                $MMSYSERR_INVALIDALIAS =  13, _
                $MMSYSERR_BADDB        =  14, _
                $MMSYSERR_KEYNOTFOUND  =  15, _
                $MMSYSERR_READERROR    =  16, _
                $MMSYSERR_WRITEERROR   =  17, _
                $MMSYSERR_DELETEERROR  =  18, _
                $MMSYSERR_VALNOTFOUND  =  19, _
                $MMSYSERR_NODRIVERCB   =  20, _
                $WAVERR_BADFORMAT      =  32, _
                $WAVERR_STILLPLAYING   =  33, _
                $WAVERR_UNPREPARED     =  34, _
                $JOYERR_PARMS          = 165, _ ; Windows NT/2000/XP: The specified joystick identifier is invalid.
                $JOYERR_UNPLUGGED      = 167    ; The specified joystick is not connected to the system.
        #Tidy_On
    
        ; https://docs.microsoft.com/en-us/previous-versions/ms709354(v=vs.85)
        Local $aJoy[8], $aRet = DllCall("Winmm.dll", "INT", "joyGetPosEx", _
                "UINT", $iJoyID, "LONG_PTR", DllStructGetPtr($tJOYINFOEX))
        If Not @error And $aRet[0] = $MMSYSERR_NOERROR Then
            ; 1       2        3       4       5       6       7       8       9          10              11     12           13
            ; dwSize; dwFlags; dwXpos; dwYpos; dwZpos; dwRpos; dwUpos; dwVpos; dwButtons; dwButtonNumber; dwPOV; dwReserved1; dwReserved2;'
            #Tidy_Off
            $aJoy[0] = DllStructGetData($tJOYINFOEX, 'dwXpos')    ;  3 X Axis
            $aJoy[1] = DllStructGetData($tJOYINFOEX, 'dwYpos')    ;  4 Y Axis
            $aJoy[2] = DllStructGetData($tJOYINFOEX, 'dwZpos')    ;  5 Z Axis
            $aJoy[3] = DllStructGetData($tJOYINFOEX, 'dwRpos')    ;  6 R Axis
            $aJoy[4] = DllStructGetData($tJOYINFOEX, 'dwUpos')    ;  7 U Axis
            $aJoy[5] = DllStructGetData($tJOYINFOEX, 'dwVpos')    ;  8 V Axis
            $aJoy[6] = DllStructGetData($tJOYINFOEX, 'dwPOV')     ; 11 POV Value
            $aJoy[7] = DllStructGetData($tJOYINFOEX, 'dwButtons') ;  9 Buttons Mask
            #Tidy_On
        Else
            Local $sErr, $iError = @error, $iExtended = @extended
            Switch $aRet[0]
                Case $MMSYSERR_BADDEVICEID
                    $sErr = '$MMSYSERR_BADDEVICEID (2)'
                Case $MMSYSERR_NODRIVER
                    $sErr = '$MMSYSERR_NODRIVER (6)'
                Case $MMSYSERR_INVALPARAM
                    $sErr = '$MMSYSERR_INVALPARAM (11)'
                Case $JOYERR_PARMS
                    $sErr = '$JOYERR_PARMS (165)'
                Case $JOYERR_UNPLUGGED
                    $sErr = '$JOYERR_UNPLUGGED (167)'
                Case Else
                    $sErr = 'Case Else (other error)'
            EndSwitch
    
            ConsoleWrite("@@_Debug_line" & @TAB & @TAB & @ScriptLineNumber & "   var: $aRet --> " & _ArrayToString($aRet, ', ') & @LF & _
                    "!@ " & @TAB & "$sErr: " & $sErr & @TAB & "#Error: " & $iError & @TAB & "#Extended: " & $iExtended & @LF)
            Exit
        EndIf
    
    ;~     _WinAPI_DisplayStruct($tempHandle, $tagJOYINFOEX, 'GPExGetRawData: $tempHandle')
        Return $aJoy
    EndFunc   ;==>_GPExGetRawData
    
    Func _Exit()
        Exit
    EndFunc   ;==>_Exit
    Alles anzeigen

    Im Anhang noch XInput inkl. Demo aus deinem 2. Link, etwas aufgepeppt und von Fehlern bereinigt.

    Dateien

    XInput.7z 2,46 kB – 349 Downloads
  • Controller auslesen

    • Bitnugger
    • 18. Januar 2021 um 22:49

    Habe das PS4-GamePad vorhin dann doch noch angeschlossen... und bei mir funktioniert es mit und ohne GUI!

    PS4-GamePad Testdaten - ohne GUI!

    ==========================================================

    [0]32767

    [1]32767

    [2]32767

    [3]32767

    [4]32767

    [5]32767

    [6]65535

    [7]0

    ==========================================================


    ==========================================================

    [0]32768

    [1]32511

    [2]33288

    [3]31999

    [4]0

    [5]0

    [6]65535

    [7]0

    ==========================================================


    ==========================================================

    [0]32768

    [1]32511

    [2]33288

    [3]31999

    [4]65535

    [5]65535

    [6]65535

    [7]192

    ==========================================================


    ==========================================================

    [0]32768

    [1]32511

    [2]33288

    [3]31743

    [4]0

    [5]0

    [6]22500

    [7]0

    ==========================================================


    ==========================================================

    [0]32768

    [1]32511

    [2]33288

    [3]31999

    [4]0

    [5]0

    [6]4500

    [7]8

    ==========================================================


    ==========================================================

    [0]32768

    [1]32511

    [2]33288

    [3]31999

    [4]0

    [5]0

    [6]18000

    [7]2

    ==========================================================


    ==========================================================

    [0]32768

    [1]32511

    [2]33288

    [3]31743

    [4]0

    [5]0

    [6]0

    [7]56

    ==========================================================


    ==========================================================

    [0]40830

    [1]65535

    [2]45771

    [3]34588

    [4]0

    [5]0

    [6]65535

    [7]0

    ==========================================================


    ==========================================================

    [0]31231

    [1]33028

    [2]33028

    [3]31487

    [4]0

    [5]0

    [6]65535

    [7]8

    ==========================================================


    ==========================================================

    [0]54873

    [1]7424

    [2]57473

    [3]4864

    [4]1536

    [5]65535

    [6]65535

    [7]192

    ==========================================================


    ==========================================================

    [0]65535

    [1]31743

    [2]32768

    [3]31487

    [4]1280

    [5]46811

    [6]65535

    [7]204

    ==========================================================


    ==========================================================

    [0]32768

    [1]32511

    [2]32768

    [3]31487

    [4]20479

    [5]0

    [6]65535

    [7]132

    ==========================================================


    ==========================================================

    [0]32768

    [1]32511

    [2]32768

    [3]31487

    [4]0

    [5]0

    [6]65535

    [7]0

    ==========================================================

    Hier noch mal zur Sicherheit, die Version ohne GUI, mit der ich erfolgreich getestet habe.

    AutoIt
    ;-- TIME_STAMP   2021-01-18 22:43:57
    
    ;~ https://autoit.de/thread/87245-controller-auslesen/#wcf22
    
    #include <Array.au3>
    #include <WinAPIDiag.au3>
    
    Opt('MustDeclareVars', 1)
    
    ;~ GUICreate("");,1,1,-1,-1)
    ;~ GUISetState()
    HotKeySet('{ESC}', '_Exit')
    
    Global Const $tagJOYINFOEX_OLD = "dword[13]"
    Global Const $tagJOYINFOEX = 'STRUCT; DWORD dwSize; DWORD dwFlags; DWORD dwXpos; DWORD dwYpos; DWORD dwZpos; DWORD dwRpos; DWORD dwUpos; DWORD dwVpos; DWORD dwButtons; DWORD dwButtonNumber; DWORD dwPOV; DWORD dwReserved1; DWORD dwReserved2; ENDSTRUCT;'
    
    Global $myGamePadHandle = GPExInitialize(), $aTestRawData
    
    While 1
    ;~ While GUIGetMsg() <> -3
        $aTestRawData = GPExGetRawData($myGamePadHandle, 0) ; Get almost every data possible from the gamepad. Returns in an array with 8 elements.
        ;
        ; Display the RAW output.
        ; --->
        ; ---> Resize the console area so that you can have all the outputs and then move the gamepad. <---
        ; --->
        ConsoleWrite(@CRLF & "==========================================================")
        ConsoleWrite(@CRLF & "[0]" & $aTestRawData[0]) ; X Axis
        ConsoleWrite(@CRLF & "[1]" & $aTestRawData[1]) ; Y Axis
        ConsoleWrite(@CRLF & "[2]" & $aTestRawData[2]) ; Z Axis
        ConsoleWrite(@CRLF & "[3]" & $aTestRawData[3]) ; R Axis
        ConsoleWrite(@CRLF & "[4]" & $aTestRawData[4]) ; U Axis
        ConsoleWrite(@CRLF & "[5]" & $aTestRawData[5]) ; V Axis
        ConsoleWrite(@CRLF & "[6]" & $aTestRawData[6]) ; Point of View
        ConsoleWrite(@CRLF & "[7]" & $aTestRawData[7]) ; Buttons
        ConsoleWrite(@CRLF & "==========================================================" & @CRLF & @CRLF)
        Sleep(1000)
    WEnd
    
    Func GPExInitialize()
        ; https://docs.microsoft.com/en-us/previous-versions/ms709358(v=vs.85)
    ;~     Local $tJOYINFOEX_OLD = DllStructCreate($tagJOYINFOEX_OLD)
        Local $tJOYINFOEX = DllStructCreate($tagJOYINFOEX)
        If @error Then
            ConsoleWrite('Error by DllStructCreate($tagJOYINFOEX) : ' & @LF & "!@ " & @TAB & "#Error: " & @error & @LF)
            Exit
        EndIf
    
        ; Mit Global Const $tagJOYINFOEX_OLD = "dword[13]"
    ;~     DllStructSetData($tJOYINFOEX_OLD, 1, DllStructGetSize($tJOYINFOEX), 1) ; dwSize  = sizeof(struct)
    ;~     DllStructSetData($tJOYINFOEX_OLD, 1, 255, 2) ; dwFlags = GetAll
    ;~     _WinAPI_DisplayStruct($tJOYINFOEX_OLD, $tagJOYINFOEX_OLD, 'GPExInitialize: $tJOYINFOEX_OLD dword[13]')
    
        ; Mit Global Const $tagJOYINFOEX = 'STRUCT; ...
        DllStructSetData($tJOYINFOEX, 1, DllStructGetSize($tJOYINFOEX)) ; dwSize  = sizeof(struct)
        DllStructSetData($tJOYINFOEX, 2, 255) ; dwFlags = GetAll
        ; oder so...
    ;~     DllStructSetData($tJOYINFOEX, 'dwSize', DllStructGetSize($tJOYINFOEX)) ; dwSize  = sizeof(struct)
    ;~     DllStructSetData($tJOYINFOEX, 'dwFlags', 255) ; dwFlags = GetAll
    
    ;~     _WinAPI_DisplayStruct($tJOYINFOEX, $tagJOYINFOEX, 'GPExInitialize: $tJOYINFOEX STRUCT; ...')
        Return $tJOYINFOEX
    EndFunc   ;==>GPExInitialize
    
    Func GPExGetRawData($tempHandle, $tempID)
        Local Const _
                $MMSYSERR_NOERROR      =   0, _ ; successful
                $MMSYSERR_ERROR        =   1, _
                $MMSYSERR_BADDEVICEID  =   2, _ ; Windows 95/98/Me: The specified joystick identifier is invalid.
                $MMSYSERR_NOTENABLED   =   3, _
                $MMSYSERR_ALLOCATED    =   4, _
                $MMSYSERR_INVALHANDLE  =   5, _
                $MMSYSERR_NODRIVER     =   6, _ ; The joystick driver is not present.
                $MMSYSERR_NOMEM        =   7, _
                $MMSYSERR_NOTSUPPORTED =   8, _
                $MMSYSERR_BADERRNUM    =   9, _
                $MMSYSERR_INVALFLAG    =  10, _
                $MMSYSERR_INVALPARAM   =  11, _ ; An invalid parameter was passed. Windows 95/98/Me: The specified joystick identifier is invalid.
                $MMSYSERR_HANDLEBUSY   =  12, _
                $MMSYSERR_INVALIDALIAS =  13, _
                $MMSYSERR_BADDB        =  14, _
                $MMSYSERR_KEYNOTFOUND  =  15, _
                $MMSYSERR_READERROR    =  16, _
                $MMSYSERR_WRITEERROR   =  17, _
                $MMSYSERR_DELETEERROR  =  18, _
                $MMSYSERR_VALNOTFOUND  =  19, _
                $MMSYSERR_NODRIVERCB   =  20, _
                $WAVERR_BADFORMAT      =  32, _
                $WAVERR_STILLPLAYING   =  33, _
                $WAVERR_UNPREPARED     =  34, _
                $JOYERR_PARMS          = 165, _ ; Windows NT/2000/XP: The specified joystick identifier is invalid.
                $JOYERR_UNPLUGGED      = 167    ; The specified joystick is not connected to the system.
    
        Local $aJoy[8]
    
        ; https://docs.microsoft.com/en-us/previous-versions/ms709354(v=vs.85)
        Local $aRet = DllCall("Winmm.dll", "INT", "joyGetPosEx", _
                "UINT", $tempID, "LONG_PTR", DllStructGetPtr($tempHandle))
        If Not @error And $aRet[0] = $MMSYSERR_NOERROR Then
    ;~         ConsoleWrite("@@_Debug_line" & @TAB & @TAB & @ScriptLineNumber & "   var: $aRet --> " & _ArrayToString($aRet, ', ') & @LF)
            ; Mit Global Const $tagJOYINFOEX = "dword[13]"
    ;~         $aJoy[0] = DllStructGetData($tempHandle, 1, 3) ; X Axis
    ;~         $aJoy[1] = DllStructGetData($tempHandle, 1, 4) ; Y Axis
    ;~         $aJoy[2] = DllStructGetData($tempHandle, 1, 5) ; Z Axis
    ;~         $aJoy[3] = DllStructGetData($tempHandle, 1, 6) ; R Axis
    ;~         $aJoy[4] = DllStructGetData($tempHandle, 1, 7) ; U Axis
    ;~         $aJoy[5] = DllStructGetData($tempHandle, 1, 8) ; V Axis
    ;~         $aJoy[6] = DllStructGetData($tempHandle, 1, 11) ; POV Value
    ;~         $aJoy[7] = DllStructGetData($tempHandle, 1, 9) ; Buttons Mask
    
            ; Mit Global Const $tagJOYINFOEX = 'STRUCT; ...
            ; DWORD dwSize; DWORD dwFlags; DWORD dwXpos; DWORD dwYpos; DWORD dwZpos; DWORD dwRpos; DWORD dwUpos; DWORD dwVpos; DWORD dwButtons; DWORD dwButtonNumber; DWORD dwPOV; DWORD dwReserved1; DWORD dwReserved2;'
            $aJoy[0] = DllStructGetData($tempHandle, 3)  ; X Axis, dwXpos
            $aJoy[1] = DllStructGetData($tempHandle, 4)  ; Y Axis, dwYpos
            $aJoy[2] = DllStructGetData($tempHandle, 5)  ; Z Axis, dwZpos
            $aJoy[3] = DllStructGetData($tempHandle, 6)  ; R Axis, dwRpos
            $aJoy[4] = DllStructGetData($tempHandle, 7)  ; U Axis, dwUpos
            $aJoy[5] = DllStructGetData($tempHandle, 8)  ; V Axis, dwVpos
            $aJoy[6] = DllStructGetData($tempHandle, 11) ; POV Value, dwPOV
            $aJoy[7] = DllStructGetData($tempHandle, 9)  ; Buttons Mask, dwButtons
        Else
            Local $sErr, $iError = @error, $iExtended = @extended
            Switch $aRet[0]
                Case $MMSYSERR_BADDEVICEID
                    $sErr = '$MMSYSERR_BADDEVICEID (2)'
                Case $MMSYSERR_NODRIVER
                    $sErr = '$MMSYSERR_NODRIVER (6)'
                Case $MMSYSERR_INVALPARAM
                    $sErr = '$MMSYSERR_INVALPARAM (11)'
                Case $JOYERR_PARMS
                    $sErr = '$JOYERR_PARMS (165)'
                Case $JOYERR_UNPLUGGED
                    $sErr = '$JOYERR_UNPLUGGED (167)'
                Case Else
                    $sErr = 'Case Else'
            EndSwitch
    ;~         DllStructGetPtr($tempHandle)
            ConsoleWrite("@@_Debug_line" & @TAB & @TAB & @ScriptLineNumber & "   var: $aRet --> " & _ArrayToString($aRet, ', ') & @LF & _
                    "!@ " & @TAB & "$sErr: " & $sErr & @TAB & "#Error: " & $iError & @TAB & "#Extended: " & $iExtended & @LF)
            Exit
        EndIf
    
    ;~     _WinAPI_DisplayStruct($tempHandle, $tagJOYINFOEX, 'GPExGetRawData: $tempHandle')
        Return $aJoy
    EndFunc   ;==>GPExGetRawData
    
    Func _Exit()
        Exit
    EndFunc
    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™