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

  • Controller auslesen

    • Bitnugger
    • 18. Januar 2021 um 20:48
    Zitat von Gofel

    Funktioniert es den bei dir ohne GUI?

    Ich habe momentan kein GamePad angeschlossen und bekomme deshalb den Error $JOYERR_PARMS... werde morgen versuchen das von meiner PS4 anzuschließen... melde mich dann wieder.

    $JOYERR_PARMS = 165 ; Windows NT/2000/XP: The specified joystick identifier is invalid.

  • Controller auslesen

    • Bitnugger
    • 18. Januar 2021 um 20:31

    Hast du den letzten Test mit meinem Script ohne und mit GUI gemacht?

    Zitat von Gofel

    Wenn ich mir den Code allerdings für meine Bedürfnisse umbaue geht nichts mehr.

    geht nichts mehr... was heißt das konkret?

  • Controller auslesen

    • Bitnugger
    • 18. Januar 2021 um 20:14

    Kannst du mir mal eine Ausgabe deines Scripts aus Post #1 (mit GUI) geben, in der ich etwa 3-5 Durchläufe mit verschiedenen Ergebniswerten sehe...

  • Controller auslesen

    • Bitnugger
    • 18. Januar 2021 um 20:06

    Ich Idiot!!!

    $aJoy[0] = DllStructGetData($tempHandle, 1, 3) ; X Axis

    ...

    Das kann so nicht gehen... weil die Struct ist ja kein Array mehr, deshalb muss die 1 bei DllStructGetData weg!

    $aJoy[0] = DllStructGetData($tempHandle, 3) ; X Axis

    ...

    Habe die Stellen nun auch korrigiert, jetzt sollte es aber funktionieren!

  • Controller auslesen

    • Bitnugger
    • 18. Januar 2021 um 19:52
    Zitat von Gofel

    Da passiert jetzt mit und ohne GUI gar nichts

    Ich hatte noch ein paar Fehler in dem Script, die ich nun korrigiert habe... teste noch mal... passiert nichts... du bekommst nur das als Ausgabe, was du hier gepostet hast? :/

    PS: Sleep(3000) hast du gesehen?

  • Controller auslesen

    • Bitnugger
    • 18. Januar 2021 um 19:13

    Teste mal dieses Script:

    AutoIt
    ;-- TIME_STAMP   2021-01-18 20:04:48
    
    ;~ https://autoit.de/thread/87245-controller-auslesen/#wcf22
    
    #include <Array.au3>
    #include <WinAPIDiag.au3>
    
    Opt('MustDeclareVars', 1)
    
    ;~ GUICreate("");,1,1,-1,-1)
    ;~ GUISetState()
    
    ;~ Global Const $tagJOYINFOEX = "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
        $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(3000)
    WEnd
    
    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
    
        ; Mit Global Const $tagJOYINFOEX = "dword[13]"
        DllStructSetData($tJOYINFOEX, 1, DllStructGetSize($tJOYINFOEX), 1) ; dwSize  = sizeof(struct)
        DllStructSetData($tJOYINFOEX, 1, 255, 2) ; dwFlags = GetAll
    
        ; 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')
        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; ...
            $aJoy[0] = DllStructGetData($tempHandle, 3) ; X Axis
            $aJoy[1] = DllStructGetData($tempHandle, 4) ; Y Axis
            $aJoy[2] = DllStructGetData($tempHandle, 5) ; Z Axis
            $aJoy[3] = DllStructGetData($tempHandle, 6) ; R Axis
            $aJoy[4] = DllStructGetData($tempHandle, 7) ; U Axis
            $aJoy[5] = DllStructGetData($tempHandle, 8) ; V Axis
            $aJoy[6] = DllStructGetData($tempHandle, 11) ; POV Value
            $aJoy[7] = DllStructGetData($tempHandle, 9) ; Buttons Mask
        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
    Alles anzeigen
  • Position von Desktop Icons speichern und wiederherstellen

    • Bitnugger
    • 17. Januar 2021 um 23:33

    "AutoIt habe ich offiziell in der Whitelist und kann es also benutzen."

    Das habe ich aber auch übersehen... dann kann @CHmux seine Scripte ja einfach mit der AutoIt3.exe starten, ohne sie zu kompilieren.


    Run a script using the interpreter:

    AutoIt3.exe [/ErrorStdOut] [/AutoIt3ExecuteScript] filename [params ...] ; Execute the AutoIt3 script 'filename' with optional parameters

  • Position von Desktop Icons speichern und wiederherstellen

    • Bitnugger
    • 17. Januar 2021 um 19:41
    Zitat von Musashi

    Du solltest in deiner Firma mal nachfragen, ob diese Datei auf die Whitelist/Allowlist gesetzt werden kann.

    Die AutoIt3.exe auf die Whitelist/Allowlist setzen... dann kann er ihm auch gleich eine Lizenz zum Töten ausstellen... :rofl:

    Kein Admin mit mehr als 3 Gramm Hirn wird das freiwillig machen...

  • ControlGetPos($hControl, '', '')

    • Bitnugger
    • 17. Januar 2021 um 19:28
    Zitat von Oscar

    Wenn Du bei ControlFocus das Child korrekt setzt: ControlFocus($hEdit, '', $hListView), dann geht ControlGetPos auch mit Leerstrings: ControlGetPos($hListView, '', '').

    Danke für dein Feedback... ich denke zwar, dass es so nicht korrekt ist, obwohl es funktioniert, aber es hat mich dennoch auf den Weg der Erleuchtung gebracht!

    Die ersten drei Parameter der Control*()-Funktionen sind ja immer gleich...

    Control* ( "title", "text", controlID ...

    ParameterErklärungBemerkungspez. Beschreibungen
    titleThe title/hWnd/class of the window to access.Parent-WindowTITLE, TEXT, REGEXPTITLE, REGEXPCLASS, LAST, ACTIVE, X \ Y \ W \ H, INSTANCE
    textThe text of the window to access.kann in Verbindung mit title angegeben werdenirgendein Text, den AutoIt sehen kann, z.B. von einem Edit, Input, Button.
    text wird als SubString behandelt.
    Versteckte Fenster können nur durch den title gefunden werden, wenn text leer ist.
    controlIDThe control to interact with.ControlID, TEXT, CLASS, CLASSNN, NAME, REGEXPCLASS, X \ Y \ W \ H, INSTANCE

    Als controlID kann auch das Handle des Controls ($hEdit, $hListView) angegeben werden, was der Hilfe aber nicht zu entnehmen ist... dann dürfen die ersten beiden Parameter auch Leerstrings sein.

    AutoIt
    ;-- TIME_STAMP   2021-01-17 19:24:14
    
    #include <GUIConstantsEx.au3>
    #include <Array.au3>
    #include <WinAPISysWin.au3>
    
    Example()
    
    Func Example()
        ; Create a GUI with various controls.
        Local $hGUI = GUICreate("Example")
        Local $idOK = GUICtrlCreateButton("OK", 310, 370, 85, 25)
        Local $hOK = GUICtrlGetHandle($idOK)
    
        Local $idListview = GUICtrlCreateListView('Test', 2, 2, 300, 300)
        Local $idItem2 = GUICtrlCreateListViewItem("item1", $idListview)
        Local $idItem1 = GUICtrlCreateListViewItem("item2", $idListview)
        Local $idItem3 = GUICtrlCreateListViewItem("item3", $idListview)
        Local $hListview = GUICtrlGetHandle($idListview)
    
        Local $idEdit = GUICtrlCreateInput('Input', 70, 120, 100, 20)
        Local $hEdit = GUICtrlGetHandle($idEdit)
        _WinAPI_SetWindowLong($hEdit, $GWL_HWNDPARENT, $hListView)
    
        ; Display the GUI.
        GUISetState(@SW_SHOW, $hGUI)
    
        ConsoleWrite("> $hGUI                                : " & $hGUI & @CRLF)
        ConsoleWrite("> $hEdit                               : " & $hEdit & @CRLF)
        ConsoleWrite("> $hListView                           : " & $hListView & @CRLF)
        ConsoleWrite("> _WinAPI_GetParent($hOK)              : " & _WinAPI_GetParent($hOK) & @TAB & _WinAPI_GetClassName(_WinAPI_GetParent($hOK)) & @CRLF)
        ConsoleWrite("> _WinAPI_GetParent($hListView)        : " & _WinAPI_GetParent($hListView) & @TAB & _WinAPI_GetClassName(_WinAPI_GetParent($hListView)) & @CRLF)
        ConsoleWrite("> _WinAPI_GetParent($hEdit)            : " & _WinAPI_GetParent($hEdit) & @TAB & _WinAPI_GetClassName(_WinAPI_GetParent($hEdit)) & @CRLF)
        ConsoleWrite("> ControlGetFocus($hGUI)               : " & ControlGetFocus($hGUI) & @CRLF)
        ConsoleWrite("> ControlGetPos($hGUI, '', $idOK)      : " & _ArrayToString(ControlGetPos($hGUI, '', $idOK), ', ') & @CRLF)
        ConsoleWrite("> ControlGetPos($hGUI, '', $idEdit)    : " & _ArrayToString(ControlGetPos($hGUI, '', $idEdit), ', ') & @CRLF)
        ConsoleWrite("> ControlGetPos($hGUI, '', $idListView): " & _ArrayToString(ControlGetPos($hGUI, '', $idListView), ', ') & @CRLF & @CRLF)
    
        ConsoleWrite("+ ControlFocus('', '', $hListView)     : " & ControlFocus('', '', $hListView) & @CRLF)
        ConsoleWrite("+ ControlGetFocus($hGUI)               : " & ControlGetFocus($hGUI) & @CRLF)
        ConsoleWrite("+ ControlGetPos('', '', $hOK)          : " & _ArrayToString(ControlGetPos('', '', $hOK), ', ') & @CRLF)
        ConsoleWrite("+ ControlGetPos('', '', $hEdit)        : " & _ArrayToString(ControlGetPos('', '', $hEdit), ', ') & @CRLF)
        ConsoleWrite("+ ControlGetPos('', '', $hListView)    : " & _ArrayToString(ControlGetPos('', '', $hListView), ', ') & @CRLF & @CRLF)
    
        ConsoleWrite("+ ControlFocus('', '', $hEdit)         : " & ControlFocus('', '', $hEdit) & @CRLF)
        ConsoleWrite("+ ControlGetFocus($hGUI)               : " & ControlGetFocus($hGUI) & @CRLF)
        ConsoleWrite("+ ControlGetPos('', '', $hOK)          : " & _ArrayToString(ControlGetPos('', '', $hOK), ', ') & @CRLF)
        ConsoleWrite("+ ControlGetPos('', '', $hEdit)        : " & _ArrayToString(ControlGetPos('', '', $hEdit), ', ') & @CRLF)
        ConsoleWrite("+ ControlGetPos('', '', $hListView)    : " & _ArrayToString(ControlGetPos('', '', $hListView), ', ') & @CRLF & @CRLF)
    
        ConsoleWrite("+ ControlFocus('', '', $hOK)           : " & ControlFocus('', '', $hOK) & @CRLF)
        ConsoleWrite("+ ControlGetFocus($hGUI)               : " & ControlGetFocus($hGUI) & @CRLF)
        ConsoleWrite("+ ControlGetPos('', '', $hOK)          : " & _ArrayToString(ControlGetPos('', '', $hOK), ', ') & @CRLF)
        ConsoleWrite("+ ControlGetPos('', '', $hEdit)        : " & _ArrayToString(ControlGetPos('', '', $hEdit), ', ') & @CRLF)
        ConsoleWrite("+ ControlGetPos('', '', $hListView)    : " & _ArrayToString(ControlGetPos('', '', $hListView), ', ') & @CRLF & @CRLF)
    ;~     Exit
    
        ; Loop until the user exits.
        While 1
            Switch GUIGetMsg()
                Case $GUI_EVENT_CLOSE, $idOK
                    ExitLoop
    
            EndSwitch
        WEnd
    
        ; Delete the previous GUI and all controls.
        GUIDelete($hGUI)
    EndFunc   ;==>Example
    Alles anzeigen

    ControlGetPos_3.jpg

  • ControlGetPos($hControl, '', '')

    • Bitnugger
    • 16. Januar 2021 um 23:25

    Allem Anschein nach verhält es sich so:

    Alle Control*()-Funktionen erwarten als ersten Parameter etwas, mit dem das Handle eines Windows identifiziert werden kann. Dort kann alternativ auch direkt das Handle eines Controls angegeben werden, solange dieses selbst keine Child-Windows hat. Ist der erste Parameter eindeutig, kann für die beiden folgenden Parameter einfach ein Leerstring übergeben werden, ohne das Probleme zu erwarten sind.

    Hat das Control allerdings selbst Child-Windows, kann der Fokus nur auf eines dieser Childs gesetzt werden, was dazu führt, dass dann alle Control*()-Funktionen ebenfalls das Handle des Childs verwenden... also das Handle des Controls, dass den Fokus hat.

  • ControlGetPos($hControl, '', '')

    • Bitnugger
    • 16. Januar 2021 um 20:52
    Zitat von Professor Bernd

    Also Problem gelöst?

    Es ist weniger ein Problem, sondern vielmehr eine Verständnisfrage... denn im ersten Post habe ich ja bereits im Script gezeigt, wie ich zum korrekten Ergebnis komme.

    Zitat von Bitnugger

    Was sagt ihr dazu?

    Ich formuliere sie mal anders: Wieso beeinflußt der Fokus das Ergebnis von ControlGetPos($hListView, '', '') und wieso wird der Fokus bei ControlFocus($hListView, '', '') auf "Edit1" gesetzt?

    Letzteres kann ich ja noch halbwegs nachvollziehen... weil $hListView mit _WinAPI_SetWindowLong zum Parent-Window für $hEdit gemacht wurde...

  • ControlGetPos($hControl, '', '')

    • Bitnugger
    • 16. Januar 2021 um 20:36
    Zitat von Professor Bernd

    _WinAPI_SetFocus($hListView)

    Ja... der Fokus wird damit korrekt gesetzt...

    ControlGetPos_2.jpg

  • ControlGetPos($hControl, '', '')

    • Bitnugger
    • 16. Januar 2021 um 19:47
    Zitat von BananaJoe

    Da fehlt die ControlID:

    Darum geht es doch gar nicht... denn ControlFocus($hEdit, '', '') funktioniert ja... und zwar immer, weil $hEdit ja das Handle des Controls ist und somit auch unverwechselbar ist, weshalb dann für Text und ID ein Leerstring reicht.

    Das Problem ist, dass ControlGetPos dann unterschiedlich reagiert, wenn... siehe Post #3.

  • ControlGetPos($hControl, '', '')

    • Bitnugger
    • 16. Januar 2021 um 19:34
    Zitat von Professor Bernd

    Ich verstehe dein Problem nicht ganz. Wenn ich "ControlFocus()" benutze wie vorgesehen, funktioniert es doch richtig, oder?

    Hehe... ja, sicher, wie vorgesehen... das ist ja auch unverwechselbar... nur gibt es halt auch Controls, für die keine ControlID verfügbar ist... deshalb habe ich mir angewöhnt, nur das Handle des Controls zu nehmen... und unter "normalen" Bedingungen funktioniert das ja auch tadellos.

    Bei ControlGetPos gebe ich dann ja als ersten Parameter auch das unverwechselbare Handle des Controls an... Text und ID kann ich mir somit ersparen, dachte ich... aber wie man sieht, eben nicht immer... und wie schon erwähnt... was machen, wenn das Control keine ID hat?

    ControlGetPos($hGUI, "", "[CLASS:Blabla; INSTANCE n]") wäre eine Möglichkeit... nur blöd, wenn sich die Instanz dann im Laufe des Betriebs ändert...

    Das Problem hier ist, dass ControlGetPos($hControl, '', '') nur dann korrekt funktioniert, wenn der Fokus nicht auf einem der Controls liegt, die durch _WinAPI_SetWindowLong() beeinflußt wurden.

    Die erste Frage ist also: Was hat ControlGetPos mit dem Fokus zu tun?

  • ControlGetPos($hControl, '', '')

    • Bitnugger
    • 16. Januar 2021 um 04:23

    So wie im Titel angegeben, mache ich es sehr oft mit ControlGetPos und hatte bis dato kein Problem damit gehabt... aber das hat sich nun geändert!

    Die für den "Fehler" relevanten Zeilen:

    _WinAPI_SetWindowLong($hEdit, $GWL_HWNDPARENT, $hListView) ; Setzt das Handle des Parentfensters für $hEdit auf $hListView - das allein löst aber keinen Fehler aus!

    ControlFocus($hEdit, '', '') ; Das ist der Bösewicht... ControlGetPos($hListView, '', '') und ControlFocus($hListView, '', '') funktionieren danach nicht mehr richtig!

    Lege ich den Fokus auf ein anderes Control, z.B. ControlFocus($hOK, '', ''), funktioniert wieder alles...

    Was sagt ihr dazu?

    Hier das Test-Script:

    AutoIt
    ;-- TIME_STAMP   2021-01-16 03:58:11
    
    #include <GUIConstantsEx.au3>
    #include <Array.au3>
    #include <WinAPISysWin.au3>
    
    Example()
    
    Func Example()
        ; Create a GUI with various controls.
        Local $hGUI = GUICreate("Example")
        Local $idOK = GUICtrlCreateButton("OK", 310, 370, 85, 25)
        Local $hOK = GUICtrlGetHandle($idOK)
    
        Local $idListview = GUICtrlCreateListView('Test', 2, 2, 300, 300)
        Local $idItem2 = GUICtrlCreateListViewItem("item1", $idListview)
        Local $idItem1 = GUICtrlCreateListViewItem("item2", $idListview)
        Local $idItem3 = GUICtrlCreateListViewItem("item3", $idListview)
        Local $hListview = GUICtrlGetHandle($idListview)
    
    
        Local $idEdit = GUICtrlCreateInput('Input', 70, 120, 100, 20)
        Local $hEdit = GUICtrlGetHandle($idEdit)
        _WinAPI_SetWindowLong($hEdit, $GWL_HWNDPARENT, $hListView)
    
        ; Display the GUI.
        GUISetState(@SW_SHOW, $hGUI)
    
        ConsoleWrite("> $hGUI                                : " & $hGUI & @CRLF)
        ConsoleWrite("> $hEdit                               : " & $hEdit & @CRLF)
        ConsoleWrite("> $hListView                           : " & $hListView & @CRLF)
        ConsoleWrite("> _WinAPI_GetParent($hListView)        : " & _WinAPI_GetParent($hListView) & @CRLF)
        ConsoleWrite("> _WinAPI_GetParent($hEdit)            : " & _WinAPI_GetParent($hEdit) & @CRLF)
        ConsoleWrite("> ControlGetFocus($hGUI)               : " & ControlGetFocus($hGUI) & @CRLF & @CRLF)
    
        ConsoleWrite("+ ControlGetPos($hEdit, '', '')        : " & _ArrayToString(ControlGetPos($hEdit, '', ''), ', ') & @CRLF)
        ConsoleWrite("+ ControlGetPos($hListView, '', '')    : " & _ArrayToString(ControlGetPos($hListView, '', ''), ', ') & @CRLF & @CRLF)
    
        ConsoleWrite("+ ControlFocus($hEdit, '', '')         : " & ControlFocus($hEdit, '', '') & @CRLF)
        ConsoleWrite("+ ControlGetFocus($hGUI)               : " & ControlGetFocus($hGUI) & @CRLF)
        ConsoleWrite("+ ControlGetPos($hEdit, '', '')        : " & _ArrayToString(ControlGetPos($hEdit, '', ''), ', ') & @CRLF)
        ConsoleWrite("! ControlGetPos($hListView, '', '')    : " & _ArrayToString(ControlGetPos($hListView, '', ''), ', ') & @CRLF)
        ConsoleWrite("+ ControlGetPos($hGUI, '', $hListView) : " & _ArrayToString(ControlGetPos($hGUI, '', $hListView), ', ') & @CRLF & @CRLF)
    
        ConsoleWrite("! ControlFocus($hListView, '', '')     : " & ControlFocus($hListView, '', '') & @CRLF)
        ConsoleWrite("! ControlGetFocus($hGUI)               : " & ControlGetFocus($hGUI) & @CRLF)
        ConsoleWrite("+ ControlGetPos($hEdit, '', '')        : " & _ArrayToString(ControlGetPos($hEdit, '', ''), ', ') & @CRLF)
        ConsoleWrite("! ControlGetPos($hListView, '', '')    : " & _ArrayToString(ControlGetPos($hListView, '', ''), ', ') & @CRLF)
        ConsoleWrite("+ ControlGetPos($hGUI, '', $hListView) : " & _ArrayToString(ControlGetPos($hGUI, '', $hListView), ', ') & @CRLF & @CRLF)
    
        ConsoleWrite("+ ControlFocus($hOK, '', '')           : " & ControlFocus($hOK, '', '') & @CRLF)
        ConsoleWrite("+ ControlGetFocus($hGUI)               : " & ControlGetFocus($hGUI) & @CRLF)
        ConsoleWrite("+ ControlGetPos($hEdit, '', '')        : " & _ArrayToString(ControlGetPos($hEdit, '', ''), ', ') & @CRLF)
        ConsoleWrite("+ ControlGetPos($hListView, '', '')    : " & _ArrayToString(ControlGetPos($hListView, '', ''), ', ') & @CRLF)
    
        ; Loop until the user exits.
        While 1
            Switch GUIGetMsg()
                Case $GUI_EVENT_CLOSE, $idOK
                    ExitLoop
    
            EndSwitch
        WEnd
    
        ; Delete the previous GUI and all controls.
        GUIDelete($hGUI)
    EndFunc   ;==>Example
    Alles anzeigen

    ControlGetPos.jpg

  • Seriennummer auslesen

    • Bitnugger
    • 14. Januar 2021 um 18:21
    Zitat von Moombas

    Mittlerweile vermute ich ein Problem in der (erlaubten) Kommunikation da, wenn ich das Skript lokal ausführe, es funktioniert.

    Das kannst du mit dem Microsoft-Tool wbemtest testen.

    https://knowledge.broadcom.com/external/artic…sing-micro.html

    Externer Inhalt www.youtube.com
    Inhalte von externen Seiten werden ohne deine Zustimmung nicht automatisch geladen und angezeigt.
    Durch die Aktivierung der externen Inhalte erklärst du dich damit einverstanden, dass personenbezogene Daten an Drittplattformen übermittelt werden. Mehr Informationen dazu haben wir in unserer Datenschutzerklärung zur Verfügung gestellt.

    https://social.technet.microsoft.com/Forums/lync/en…erverManagement

    https://www.windowspro.de/wolfgang-somme…er-wmi-auslesen


    Zitat von Moombas

    Ich teste später aber dennoch nochmal das Skript von dir (Bitnugger) ob das eine Änderung bewirkt.

    Ich denke mal ja... denn in deinem Script sind zwei böse Fehler drin...

    - Zeile 9 muss vor Zeile 8 stehen

    - nach Zeile 8 musst du testen, ob $colItems ein Objekt ist, bevor du darauf zugreifst.

    So wäre es korrekt:

    AutoIt
    Local $sBIOS
    $sBIOS = _Serial_Number() ; Lokaler PC, liefert bei mir einen Leerstring - das ist aber kein Fehler!
    ConsoleWrite("$sBIOS --> " & $sBIOS & @LF & "!@ " & @TAB & "#Error: " & @error & @TAB & "#Extended: " & @extended & @LF)
    $sBIOS = _Serial_Number('Server') ; Remote PC, hier ist ok.
    ConsoleWrite("$sBIOS --> " & $sBIOS & @LF & "!@ " & @TAB & "#Error: " & @error & @TAB & "#Extended: " & @extended & @LF)
    $sBIOS = _Serial_Number('Blablabla') ; Den PC gibt es nicht, Error 1!
    ConsoleWrite("$sBIOS --> " & $sBIOS & @LF & "!@ " & @TAB & "#Error: " & @error & @TAB & "#Extended: " & @extended & @LF)
    
    
    Func _Serial_Number($IP = '.')
        Local Const $objWMIService = ObjGet("winmgmts:\\" & $IP & "\root\CIMV2") ; Ergebnis mus sein Objekt sein.
        If Not IsObj($objWMIService) Then Return SetError(1, 0, False) ; Testen, ob es ein Objekt ist.
        Local Const $colItems = $objWMIService.ExecQuery("Select * from Win32_BIOS") ; Ergebnis mus sein Objekt sein.
        If Not IsObj($colItems) Then Return SetError(2, 0, False) ; Testen, ob es ein Objekt ist.
        For $objItem In $colItems ; Ok, jetzt kann nichts mehr schief gehen...
            Return $objItem.SerialNumber ; Liefert im Idealfall die SerialNumber, kann aber auch ein Leerstring ("") sein, oder z.B. "To be filled by O.E.M." oder 0!
        Next
    EndFunc   ;==>_Serial_Number
    Alles anzeigen
  • ListViewEdit.au3 mit FrameRect (Alpha Version) - In-Place-Editieren aller ListView-Items

    • Bitnugger
    • 14. Januar 2021 um 01:49

    Moin, hier mal eine erste Alpha-Version meines Scripts zum In-Place-Editieren aller ListView-Items.

    Das Besondere daran ist, dass um das Edit-Control (Input) ein Frame gezeichet wird, dass die Farbe wechelt... wenn der Mauszeiger darüber steht, wird Brush2 verwendet, wenn nicht Brush1 und dass es auch funktioniert, wenn die Items im ListView gescrollt werden - und dass die Farben der Items/SubItems anpassbar sind, wobei das Item mit dem Fokus eine eigene Farbe bekommt. Es funktioniert auch dann, wenn die Schrift-art/größe des ListViews geändert wird.

    Ich würde gerne eure Meinungen/Verbesserungsvorschläge dazu hören... und wer mag, darf gerne Hand anlegen und es optimieren. ;)

    ListViewEdit.jpg

    Update: Edit bleibt nun auch aktiv, wenn sich die Größe des Fensters geändert hat.

    Dateien

    ToolTipEx.au3 18,46 kB – 387 Downloads ListViewEdit.au3 40,54 kB – 407 Downloads
  • Position von Desktop Icons speichern und wiederherstellen

    • Bitnugger
    • 12. Januar 2021 um 17:42
    Zitat von SEuBo

    Mein Desktop hat die Klasse "WorkerW". Im ICU Tool scheint das berücksichtigt zu sein.

    Ja, genau, in der zweiten Version meines Scripts in Post #7 auch... aber in Post #10 habe ich auch was dazu geschrieben, warum man es besser nicht nutzen sollte...

  • Seriennummer auslesen

    • Bitnugger
    • 12. Januar 2021 um 16:57

    Bei einigen PCs wird allerdings keine SerialNumber angezeigt, so auch bei virtuellen Maschinen. Da kann dann z.B. auch To be filled by O.E.M. oder 0 stehen.

    Hier ein Bsp. mit Powershell:

    PS C:\Users\bitnugger> Get-WmiObject -Class Win32_BIOS

    SMBIOSBIOSVersion : A7522MLN.10F

    Manufacturer : American Megatrends Inc.

    Name : Default System BIOS

    SerialNumber :

    Version : MEDION - 20100914

  • Seriennummer auslesen

    • Bitnugger
    • 12. Januar 2021 um 16:18
    Zitat von Moombas

    Wobei _WinAPI_GetLastError() & ' ' & _WinAPI_GetLastErrorMessage() mir zurück gibt: 0 DER VORGANG WURDE ERFOLGREICH BEENDET.

    _WinAPI_GetLastError() und _WinAPI_GetLastErrorMessage() rufst du auf, wenn du zuvor eine _WinAPI_*-Funktion ausgeführt hast, z.B. _WinAPI_ActivateKeyboardLayout.

    Um Fehler bei Objekten abzufangen und auszuwerten, brauchst du einen COM ERROR HANDLER.

    Hier ein Bsp. mit _DebugCOMError:

    AutoIt
    #include <Debug.au3>
    
    Opt('MustDeclareVars', 1)
    
    _DebugSetup(Default, True, 1, Default, True) ; 1 = Write messages with timestamps to the Report Log Window
    _DebugCOMError(1)
    
    Local $objWMI, $IP
    
    $objWMI = ObjGet("winmgmts:{impersonationLevel=impersonate}!\\" & @ComputerName & '\root\cimv2:Win32_LogicalDisk="C:"')
    ConsoleWrite('> ' & @ComputerName & " Free Diskspace on C: " & $objWMI.FreeSpace & " bytes / " & Round($objWMI.FreeSpace / 1024 ^ 2) & " mb" & @CRLF)
    $objWMI = ObjGet("winmgmts:{impersonationLevel=impersonate}!\\" & 'Server' & '\root\cimv2:Win32_LogicalDisk="C:"')
    ConsoleWrite("> Server     Free Diskspace on C: " & $objWMI.FreeSpace & " bytes / " & Round($objWMI.FreeSpace / 1024 ^ 2) & " mb" & @CRLF & @CRLF)
    
    $IP = '192.168.178.26' ; = @ComputerName
    ConsoleWrite('+ Serial for ' & $IP & ': ' & _Serial_Number($IP) & @CRLF & @CRLF)
    $IP = 'Server' ; = '192.168.178.31'
    ConsoleWrite('+ Serial for ' & $IP & ': ' & _Serial_Number($IP) & @CRLF & @CRLF)
    $IP = '192.168.178.31' ; = 'Server'
    ConsoleWrite('+ Serial for ' & $IP & ': ' & _Serial_Number($IP) & @CRLF & @CRLF)
    
    Func _Serial_Number($IP)
        ConsoleWrite('! $IP: ' & $IP & @CRLF)
        Local $item, $objItem
        Local Const $objWMIService = ObjGet("winmgmts:\\" & $IP & "\root\CIMV2")
        ConsoleWrite('- $objWMIService: ' & VarGetType($objWMIService) & @CRLF)
        If IsObj($objWMIService) Then
            Local Const $colItems = $objWMIService.ExecQuery("Select * from Win32_BIOS")
            ConsoleWrite('- $colItems: ' & VarGetType($colItems) & @CRLF)
            If IsObj($colItems) Then
                For $objItem In $colItems
                    ConsoleWrite('- $objItem: ' & VarGetType($objItem) & @CRLF)
                    $item = $objItem.SerialNumber
                    ConsoleWrite('> $item: ' & $item & @CRLF)
    
                    If $IP = '192.168.178.31' Then
                        ; Provoke a COM error. Function is unknown
                        $colItems.xyz()
                        If @error <> 0 Then Return MsgBox($MB_SYSTEMMODAL, "_DebugCOMError UDF", "Error occurred and handled." & _
                                @CRLF & "@error = " & @error)
                    EndIf
    
                    Return ($item)
                Next
            Else
                Return ('Error: ' & @error)
            EndIf
        EndIf
    EndFunc   ;==>_Serial_Number
    Alles anzeigen

    Hier noch eins ohne _DebugCOMError:

    AutoIt
    #include <WinAPIError.au3> ; __COMErrorFormating(ByRef $oCOMError, $sPrefix = @TAB) -->> #INTERNAL_USE_ONLY#
    
    Opt('MustDeclareVars', 1)
    
    Local $IP
    
    $IP = '192.168.178.26' ; = @ComputerName
    ConsoleWrite('+ Serial for ' & $IP & ': ' & _Serial_Number($IP) & @CRLF & @CRLF)
    $IP = 'Server' ; = '192.168.178.31'
    ConsoleWrite('+ Serial for ' & $IP & ': ' & _Serial_Number($IP) & @CRLF & @CRLF)
    $IP = '192.168.178.31' ; = 'Server'
    ConsoleWrite('+ Serial for ' & $IP & ': ' & _Serial_Number($IP) & @CRLF & @CRLF)
    
    Func _Serial_Number($IP)
        ; Error monitoring. This will trap all COM errors while alive.
        ; This particular object is declared as local, meaning after the function returns it will not exist.
        Local $oErrorHandler = ObjEvent("AutoIt.Error", "_ErrFunc")
    
        ConsoleWrite('! $IP: ' & $IP & @CRLF)
        Local $item, $objItem
        Local Const $objWMIService = ObjGet("winmgmts:\\" & $IP & "\root\CIMV2")
        ConsoleWrite('- $objWMIService: ' & VarGetType($objWMIService) & @CRLF)
        If IsObj($objWMIService) Then
            Local Const $colItems = $objWMIService.ExecQuery("Select * from Win32_BIOS")
            ConsoleWrite('- $colItems: ' & VarGetType($colItems) & @CRLF)
            If IsObj($colItems) Then
                For $objItem In $colItems
                    ConsoleWrite('- $objItem: ' & VarGetType($objItem) & @CRLF)
                    $item = $objItem.SerialNumber
                    ConsoleWrite('> $item: ' & $item & @CRLF)
    
                    If $IP = '192.168.178.31' Then
                        ; Provoke a COM error. Function is unknown
                        $colItems.xyz()
    ;~                     If @error <> 0 Then Return MsgBox($MB_SYSTEMMODAL, "_DebugCOMError UDF", "Error occurred and handled." & _
    ;~                             @CRLF & "@error = " & @error)
                    EndIf
    
                    Return ($item)
                Next
            Else
                Return ('Error: ' & @error)
            EndIf
        EndIf
    EndFunc   ;==>_Serial_Number
    
    ; User's COM error function. Will be called if COM error occurs
    Func _ErrFunc($oError)
        ; Do anything here.
    
        ; Entweder so... benötigt #include <WinAPIError.au3>
        ConsoleWrite(__COMErrorFormating($oError) & @CRLF & @CRLF)
    
        ; oder so... selbst ist der Mann
        ConsoleWrite(@ScriptName & " (" & $oError.scriptline & ") : ==> COM Error intercepted !" & @CRLF & _
                @TAB & "err.number          : " & "0x" & Hex($oError.number) & @CRLF & _
                @TAB & "err.windescription  : " & StringStripWS($oError.windescription, $STR_STRIPTRAILING) & @CRLF & _
                @TAB & "err.description     : " & StringStripWS($oError.description, $STR_STRIPTRAILING) & @CRLF & _
                @TAB & "err.source          : " & $oError.source & @CRLF & _
                @TAB & "err.helpfile        : " & $oError.helpfile & @CRLF & _
                @TAB & "err.helpcontext     : " & $oError.helpcontext & @CRLF & _
                @TAB & "err.lastdllerror    : " & $oError.lastdllerror & @CRLF & _
                @TAB & "err.scriptline      : " & $oError.scriptline & @CRLF & _
                @TAB & "err.retcode         : " & "0x" & Hex($oError.retcode) & @CRLF & @CRLF)
    EndFunc   ;==>_ErrFunc
    Alles anzeigen

    $IP musst du natürlich anpassen...

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™