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

Beiträge von BugFix

  • AutoIt3ExecuteLine > Ausgabe Umleiten in Datei - Datei wird nicht erstellt -- bei Aufruf aus Lua

    • BugFix
    • 6. März 2021 um 17:46

    Dann kann man auch mal in Lua-Skripten auf AutoIt-Makros (sofern sie nicht am Skript orientiert sind) zugreifen:

    Code
    ExecuteAU3Macro = function(_macro)
        local au3exe = props['autoit3dir']..'\\autoit3.exe'
        local outfile = os.getenv('TEMP')..'\\expand_macro_au3.txt'
        local cmdau3 = ("ConsoleWrite(StringFormat('%%s', %s) & @CRLF)"):format(_macro)
        local cmdlua = ('""%s" /ErrorStdOut /AutoIt3ExecuteLine "%s" > "%s""'):format(au3exe, cmdau3, outfile)
    --     print("@@_Debug_line        "..debug.getinfo(1).currentline.." cmdlua:", cmdlua)
        local exec = os.execute(cmdlua)
        local fh = io.open(outfile)
        if fh == nil then return "NO FILE" end
        local result = fh:read()
        fh:close()
        os.remove(outfile)
        return result
    end
    
    res = ExecuteAU3Macro('@OSServicePack')
    print("@@_Debug_line        "..debug.getinfo(1).currentline.." res:", res)
    Alles anzeigen
  • Script stoppt wenn Notebook aus Docking-Station gezogen wird

    • BugFix
    • 3. März 2021 um 13:01

    Ja, aber WIE arbeitet das Skript?

    - Einfache Schleife mit Sleep

    - Timer

    - oder anderes

    Zeig doch mal das Skript.

  • Script stoppt wenn Notebook aus Docking-Station gezogen wird

    • BugFix
    • 3. März 2021 um 12:39

    Dazu müsste man schon wissen, was das Skript tut. Alles andere ist Kaffeesatz Leserei.

  • AutoIt3ExecuteLine > Ausgabe Umleiten in Datei - Datei wird nicht erstellt -- bei Aufruf aus Lua

    • BugFix
    • 28. Februar 2021 um 17:59

    Ich habs nochmal aufgemacht, da ich jetzt getestet habe, wie das wohl wäre von Lua aus (also aus SciTE) damit zu arbeiten.

    Es ist eigentlich einfacher, da os.execute immer in der CMD arbeitet.

    Für einfache Windowsbefehle funktioniert das tadellos:

    Code
    local tree = "tree \"C:/code/lua\" /A > \"C:/code/lua/tree.txt\""
    os.execute(tree)

    Aber AutoIt3ExecuteLine geht in die Hose:

    Code
    local hallo = "\"C:/Program Files (x86)/AutoIt3/autoit3.exe\" /ErrorStdOut /AutoIt3ExecuteLine \"ConsoleWrite('Hallo AutoIt' & @CRLF)\" > \"C:/code/lua/hallo.txt\""
    os.execute(hallo)

    :?::?:

  • AutoIt3ExecuteLine > Ausgabe Umleiten in Datei - Datei wird nicht erstellt -- bei Aufruf aus Lua

    • BugFix
    • 28. Februar 2021 um 12:39
    Zitat von Bitnugger

    @ComSpec & ' /c

    :Face:

  • AutoIt3ExecuteLine > Ausgabe Umleiten in Datei - Datei wird nicht erstellt -- bei Aufruf aus Lua

    • BugFix
    • 28. Februar 2021 um 11:05

    In der CMD kann ich folgenden Befehl ausführen:

    "C:\Program Files (x86)\AutoIt3\autoit3.exe" /ErrorStdOut /AutoIt3ExecuteLine "ConsoleWrite(""Hallo AutoIt"" & @CRLF)" > "C:\Users\BugFix\AppData\Local\Temp\execute_line_au3.txt"

    und erhalte das Ergebnis, wie erwartet, in der angegebenen Datei.

    Versuche ich das jedoch aus der Anwendung heraus, wird die Datei nicht erstellt:

    AutoIt
    $sCmd = '"C:\Program Files (x86)\AutoIt3\autoit3.exe" /ErrorStdOut /AutoIt3ExecuteLine "ConsoleWrite(""Hallo AutoIt"" & @CRLF)" > "C:\Users\BugFix\AppData\Local\Temp\execute_line_au3.txt"'
    Run($sCmd)
    ;~ Run($sCmd, @TempDir, @SW_HIDE, 0x2)  ; ebenso ohne Erfolg
    
    $TmpFile = @TempDir & '\execute_line_au3.txt'
    If FileExists($TmpFile) Then
        ConsoleWrite(FileRead($TmpFile) & @CRLF)
    Else
        ConsoleWrite('No File' & @CRLF)
    EndIf

    Wie bekomme ich das zum Laufen? (Datei erstellen und dorthinein Schreiben ist keine Option. Das Ergebnis des Aufrufs ist eine Konsolenausgabe und diese soll direkt in eine Datei umgeleitet werden.)

  • _IsPressed() Abfrage strukturieren/verbessern

    • BugFix
    • 27. Februar 2021 um 10:22
    Zitat von Professor Bernd

    Wie ich vom Gesamt-Text zum Text am Caret kommen kann, weiß ich noch nicht. Mal sehen, was ich draus machen kann. Auf jeden Fall ein interessanter Ansatz! :thumbup:

    Das korrekte Auslesen des Textes war doch doch schon seit langer Zeit erledigt (oder interpretiere ich das falsch: RE: Selektierten Text in SynEdit finden?

    Zeichen am Caret (also davor) ist doch Erweiterung der Auswahl auf (pos-1, pos). Vielleicht ist das mit der Objektlösung realisierbar.

  • Ermitteln, ob in PSPad ein "(" geschrieben wurde

    • BugFix
    • 24. Februar 2021 um 11:55

    Ist es nicht einfacher, wenn du die Feststellung, wie "(" beim Anwender erstellt wird von diesem abfragst und in der INI speicherst (auch für verschiedene Layouts, die der User evtl. nutzt).

    Dann prüfst du auf genau diese gespeicherte Keysequenz.

    Die Abfrage an den Anwender könntets du so gestalten:

    AutoIt
    #include <WinAPI.au3>
    #include <WinAPISys.au3>
    #include <EditConstants.au3>
    #include <GuiConstants.au3>
    #include <WindowsConstants.au3>
    #include <StructureConstants.au3>
    #include "VKCodeConstants.au3"
    
    OnAutoItExitRegister("_KeyHookOf")
    
    Global $g_hKeyProc, $g_hMod, $g_hHook
    
    
    
    Global $hGui = GUICreate('Settings', 500, 250)
    GUICtrlCreateLabel('Press the Button <Start> and write in the Input the character "(".' & @CRLF & 'Than press the Button <Stop>.', 10, 18, 400,  30)
    Global $btStart = GUICtrlCreateButton('Start', 420, 15, 70, 20)
    Global $inChar = GUICtrlCreateInput('', 10, 55, 100, 20)
    GUICtrlSetState(-1, $GUI_DISABLE)
    Global $btStop = GUICtrlCreateButton('Stop', 420, 55, 70, 20)
    GUICtrlSetState(-1, $GUI_DISABLE)
    Global $btSave = GUICtrlCreateButton('Save', 420, 95, 70, 20)
    GUICtrlSetState(-1, $GUI_DISABLE)
    GUICtrlCreateLabel('Current KeyboardLayout', 10, 98, 130)
    Global $inKBLayout = GUICtrlCreateInput(_WinAPI_GetKeyboardLayout($hGui), 135, 95, 80, 20, BitOR($ES_CENTER, $ES_READONLY) )
    GUICtrlSetBkColor(-1, 0xFFFFFF)
    Global $edKeySeq = GUICtrlCreateEdit('', 10, 125, 480, 115)
    GUICtrlSetFont(-1, Default, Default, Default, 'Consolas')
    Global $sHeader = 'KeyMsg   vkCode  CodeName        ScanCode  KeyFlags  ExtendedKey  AltDown' & @CRLF
    GUICtrlSetData($edKeySeq, $sHeader)
    
    Global $bDetectKeyMsg = False
    
    GUISetState()
    
    ; Starte Tastatur-Hook
    _KeyHookOn()
    
    While True
        Switch GUIGetMsg()
            Case -3
                Exit
            Case $btStart
                $bDetectKeyMsg = True
                GUICtrlSetState($btStart, $GUI_DISABLE)
                GUICtrlSetState($btStop, $GUI_ENABLE)
                GUICtrlSetState($inChar, $GUI_ENABLE)
                GUICtrlSetData($inChar, '')
                GUICtrlSetData($edKeySeq, $sHeader)
                ControlFocus($hGui, '', $inChar)
            Case $btStop
                $bDetectKeyMsg = False
                GUICtrlSetState($btStart, $GUI_ENABLE)
                GUICtrlSetState($btStop, $GUI_DISABLE)
                GUICtrlSetState($btSave, $GUI_ENABLE)
                GUICtrlSetState($inChar, $GUI_DISABLE)
            Case $btSave
                ConsoleWrite('Save to INI:' & @CRLF & _
                'Keyboardlayout: ' & GUICtrlRead($inKBLayout) & @CRLF & _
                GUICtrlRead($edKeySeq))
                GUICtrlSetState($btSave, $GUI_DISABLE)
        EndSwitch
    WEnd
    
    
    Func _Exit()
        Exit
    EndFunc
    
    
    Func _KeyHookOn()
        ; Registrieren der Funktion "_KeyProc" als Callback
        $g_hKeyProc = DllCallbackRegister("_KeyProc", "long", "int;wparam;lparam")
    
        ; Installieren einer eigenen Prozedur zur Verarbeitung der Tastaturereignisse
        $g_hMod = _WinAPI_GetModuleHandle(0)
        $g_hHook = _WinAPI_SetWindowsHookEx($WH_KEYBOARD_LL, DllCallbackGetPtr($g_hKeyProc), $g_hMod)
    EndFunc
    
    Func _KeyHookOf()
        ; Entfernen der eigenen Key-Prozedur
        _WinAPI_UnhookWindowsHookEx($g_hHook)
        DllCallbackFree($g_hKeyProc)
    EndFunc
    
    Func _KeyProc($_nCode, $_wParam, $_lParam)
        Local $tKEYHOOKS, $vkCode, $scanCode, $extKeyFlags, $timeStamp, $dwExtraInfo
        $tKEYHOOKS = DllStructCreate($tagKBDLLHOOKSTRUCT, $_lParam)
    
        If $_nCode < 0 Or (Not $bDetectKeyMsg) Then Return _WinAPI_CallNextHookEx($g_hHook, $_nCode, $_wParam, $_lParam)
    
        ; Auslesen Struktur
        $vkCode      = $tKEYHOOKS.vkCode
        $scanCode    = $tKEYHOOKS.scanCode
        $extKeyFlags = $tKEYHOOKS.flags
        $timeStamp   = $tKEYHOOKS.time
        $dwExtraInfo = $tKEYHOOKS.dwExtraInfo
    
        ; Auswerten "flags"
        Local $bExtKey      = (BitAnd($tKEYHOOKS.flags, $LLKHF_EXTENDED) = $LLKHF_EXTENDED)
        Local $bEvtInjected = (BitAnd($tKEYHOOKS.flags, $LLKHF_INJECTED) = $LLKHF_INJECTED)
        Local $bAltDown     = (BitAnd($tKEYHOOKS.flags, $LLKHF_ALTDOWN) = $LLKHF_ALTDOWN)
    
    
        ; Key-Events in Edit eintragen
        GUICtrlSetData($edKeySeq, GUICtrlRead($edKeySeq) & StringFormat('%-9s0x%-6s%-16s%-10s0x%-8s%-13s%-7s', _
            ($_wParam = $WM_KEYDOWN ? 'KEYDOWN' : 'KEYUP'), Hex($vkCode,2), _VKCodeName($vkCode), $scanCode, Hex($extKeyFlags,4), $bExtKey, $bAltDown) & @CRLF)
    
        Return _WinAPI_CallNextHookEx($g_hHook, $_nCode, $_wParam, $_lParam)
    EndFunc
    Alles anzeigen

    settings.png

  • _MouseGetPosEx

    • BugFix
    • 22. Februar 2021 um 12:48

    Nur ein kleiner Schnipsel.

    Wenn ich die Mausposition benötige, brauche ich die häufig nicht in der Standardausgabe (absolute Screenkoordinaten), sondern z.B. relativ zum aktiven Fenster. Also schalte ich erst per Opt den Modus um und nach Positionsermittlung dann wieder zurück. Da die Skriptzeilen ja immer dieselben sind, bietet es sich an, dafür eine Funktion zu verwenden. Zusätzlich wandele ich die Koordinaten in eine POINT Struktur. Diese oder ein Pointer darauf wird in vielen anderen Funktionen benötigt. Wenn man die Struktur nicht braucht, macht es auch keinen Unterschied ob man $MPos[0] oder $MPos.X verwendet (Wobei die Struktur den Vorteil der besseren Lesbarkeit hat).

    AutoIt
    ;-- TIME_STAMP   2021-02-22 11:57:57
    
    
    
    ; Position der Maus als Struktur .X, .Y                   - das macht auch _WinAPI_GetMousePos
    ; MouseCoordMode als Parameter in der Funktion enthalten  - aber das nicht ;-)
    
    
    ; Standard: absolute Screenposition
    Local $tMPos = _MouseGetPosEx()
    ConsoleWrite(StringFormat('Screen absolut                     >> X:%6s,Y:%6s', $tMPos.X, $tMPos.Y) & @CRLF)
    
    ; MouseCoordMode(0): relativ zum aktiven Fenster
    $tMPos = _MouseGetPosEx(0)
    ConsoleWrite(StringFormat('Akt. Fenster relativ               >> X:%6s,Y:%6s', $tMPos.X, $tMPos.Y) & @CRLF)
    
    ; MouseCoordMode(2): relativ zum Clientbereich des aktiven Fensters
    $tMPos = _MouseGetPosEx(2)
    ConsoleWrite(StringFormat('Clientbereich akt. Fenster relativ >> X:%6s,Y:%6s', $tMPos.X, $tMPos.Y) & @CRLF)
    
    ; Einzelparameterabfrage
    ConsoleWrite(StringFormat('Screen absolut, Einzelparamter     >> X:%6s', _MouseGetPosEx().X) & @CRLF)
    
    ;===================================================================================================
    ; Function Name....: _MouseGetPosEx
    ; Description......: Gets the mouse position as structure POINT.
    ; Parameter(s).....: $_MouseCoordMode  Sets the option to determine the mouse position. 1 (Default) - absolut on screen
    ; Return Value(s)..: POINT structure with mouse position by choosed coord mode
    ;===================================================================================================
    Func _MouseGetPosEx($_MouseCoordMode=1) ; $_MouseCoordMode: 0=rel. aktive Wnd., 1=abs. Screen(default), 2=rel. client area aktive Wnd.
        Local $tPos = DllStructCreate('struct;long X;long Y;endstruct')
        Local $optOld = Opt('MouseCoordMode', $_MouseCoordMode)
        Local $aPos = MouseGetPos()
        Opt('MouseCoordMode', $optOld)
        $tPos.x = $aPos[0]
        $tPos.y = $aPos[1]
        Return $tPos
    EndFunc  ;==>_MouseGetPosEx
    Alles anzeigen
  • Wie kann ich eine html Webseite in ein Bild umwandeln?

    • BugFix
    • 22. Februar 2021 um 12:36
    Zitat von 32vroni

    Dazu läuft aber ständig dieser Browser im Vordergrund; das hätte ich gern unterbunden.

    Ich weiß nicht, ob man den negativen Desktopbereich capturen kann (also Browser aus dem sichtbaren Bereich verschoben). Falls ja, wäre das eine Lösung.

    Ansonsten - hast du evtl. einen alten Monitor, den du zusätzlich anschliessen kannst? - Browser darauf verschieben und er stört nicht mehr. Da könntest du sogar einen alten Monitor mit defekter Darstellung nehmen, es wird ja das Signal, das zum Monitor geht abgegriffen unabhängig von dem, was er anzeigt.

  • Wie kann ich eine html Webseite in ein Bild umwandeln?

    • BugFix
    • 22. Februar 2021 um 09:22
    Zitat von 32vroni

    und brauche davon einen Screenshot.

    Zitat von 32vroni

    da es stört, wenn sich der Browser regelmäßig auf dem Desktop breit macht.

    Wie kann ich die Seite automatisiert mit einem Kommadozeilenprogramm oder AutoIt in png oder jpg wandeln?

    Widerspricht das nicht der ersten Anforderung: Screenshot?

    Ein Screenshot ist ein Abbild des Desktops. Also muss die Seite dazu auch auf dem Desktop sichtbar sein.

    Oder willst du ein Image einer Webseite erstellen OHNE diese im Browser zu laden? - Auf die Idee bin ich bisher nicht gekommen und bezweifle auch die Umsetzbarkeit. Denn die Webseite liegt als html vor, evtl./wahrscheinlich noch mit eingebetteten Javascripts. Das musst du in einem Browser laden um es zu visualisieren.


    EDIT:

    Aber verschiebe doch einfach den Browser aus dem sichtbaren Bereich des Desktops. Du kannst dann trotzdem darauf zugreifen und es gibt genug Browser-PlugIns zum Umwandeln von Webseiten in Images (auch mit Darstellung des gesamten Inhalts trotz Scrollens). Such dir solch ein Tool und automatisiere es, sofern das überhaupt erforderlich ist. Da musst du das Rad nicht neu erfinden.

  • Traffic eines Netzadapters abfragen

    • BugFix
    • 20. Februar 2021 um 09:55

    Guckst du: https://www.autoitscript.com/forum/topic/15…cs-and-traffic/

  • _IsPressed() Abfrage strukturieren/verbessern

    • BugFix
    • 17. Februar 2021 um 18:54

    Ich habe mal versucht, die Nachricht abzugreifen, bevor die Msg-Queue Verarbeitung beginnt.

    M. M. n. ist das vom Code her korrekt, jedoch erhalte ich ausschliesslich die Messages: WM_TIMER und WM_HOTKEY (beim Beenden) . Das lässt mich etwas ratlos zurück.

    Aber vielleicht hilft es dir als Ansatz.

    AutoIt
    #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 <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
    
    _CharHookOn()
    
    
    While True
        Sleep(20)
    WEnd
    
    
    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 $tMSG = DllStructCreate('hwnd hwnd;uint message;wparam wParam;lparam lParam;dword time;struct;long x;long y;endstruct;dword lPrivate;', $_lParam)
    
    Local $sMsg = $tMSG.message = 0x0113 ? 'WM_TIMER' : ($tMSG.message = 0x0312 ? 'WM_HOTKEY' : '0x' & Hex($tMSG.message, 4))
    ConsoleWrite('MSG: ' & $sMsg & _
                ' Time: [' & _WinAPI_StrFromTimeInterval($tMSG.time)  & '],' & _
                ' x: ' & $tMSG.x & ', y: ' & $tMSG.y & _
                ', hWnd: ' & $tMSG.hwnd & _
                ', lParam: ' & $tMSG.lParam & _
                ', lPrivate: ' & $tMSG.lPrivate & @CRLF)
    
        ; only work with message: $WM_CHAR
        If $tMSG.message <> $WM_CHAR Then Return _WinAPI_CallNextHookEx($g_hHook, $_nCode, $_wParam, $_lParam)
        ; wParam from MSG struct is the character code of the pressed key
        Local $charCode = $tMSG.wParam
        ConsoleWrite('CharCode: ' & $charCode & @CRLF)
    
        Return _WinAPI_CallNextHookEx($g_hHook, $_nCode, $_wParam, $_lParam)
    EndFunc
    Alles anzeigen
  • _IsPressed() Abfrage strukturieren/verbessern

    • BugFix
    • 17. Februar 2021 um 12:34

    Das Problem liegt im vkCode. Dieser enthält nunmal keine layoutspezifischen Werte, sondern ist für jedes Layout identisch.

    Man muss sich den "Werdegang" eines Zeichens vom Drücken der Taste bis zum Erscheinen im Edit etc. mal genauer ansehen:

    - Tastendruck - Auslösen eines Hardware-Interupts, Scancode (Tastenposition) wird gelesen. Der Scancode gibt nur die Position der gedrückten Taste für eine Standardtastatur an, unabhängig von der Anordnung, der Sprache des BS oder der Tastenbeschriftung.

    - Der Scancode wird vom System in den vkCode übersetzt, dem die ASCII-Zeichen zugrunde liegen

    Bis hier ist das LowLevel - was wir z.B. mit _IsPressed() abfragen. -- Also sind wir da eigentlich falsch, denn das sagt uns noch nichts über das tatsächlich im Editor ankommende Zeichen, nur über die gedrückte Taste.

    - Weiter gehts mit der System-Message WM_CHAR. Hier wird aus vkCode und Layout das letztlich gewünschte Zeichen an die Anwendung gesendet. Somit sollte der Ansatz sein, diese Message auszuwerten.

    Da wir dann aber nicht mehr LowLevel sind, hat das auch ein paar zu beachtende Punkte:

    Wir können nicht einfach auf WM_CHAR warten, sondern müssen mit GetMessage() vom Message-Queue abfragen.

    Die Nachricht ist an ein Fenster gebunden, dessen Handle ich angeben muss. Alle evtl. zu berücksichtigenden Fenster müssen zu einem Prozess gehören.

    Somit ist eine systemweite Abfrage eines Zeichens wohl nicht realisierbar.

    P.S.

    Ist mir gerade noch eingefallen: Bei der Abfrage eines mit Shift generierten Zeichens muss der Vollständigkeit halber immer auch Capslock abgefragt werden.

  • GuiCtrlInfo.au3

    • BugFix
    • 13. Februar 2021 um 13:23

    Manchmal möchte ich abhängig vom Gui-Ctrl in einer Funktion unterschiedlich reagieren (z.B. bei registriertem $WM_COMMAND auf $EN_CHANGE). Da z.B. Edit und Input beide der Klasse "Edit" angehören, kann ich Aktionen, die gleichermaßen auf alle Input aber nicht auf Edit angewendet werden sollen nur durch Speichern der zugelassenen Ctrl-ID in einem Array realisieren, welches ich dann durchlaufe und auf Übereinstimmung mit der gerade aktiven ID prüfe. Es würde mir besser gefallen, wenn ich allgemein auf den Control-Typ (z.B. Edit oder Input) prüfen könnte.

    Mit der GuiCtrlInfo.au3 stelle ich die Funktion _GuiCtrlGetInfo(ID) bereit, die anhand der übergebenen Ctrl-ID nicht nur die Klasse, sondern bei derselben Klasse für unterschiedliche AutoIt-Control auch deren AutoIt-Namen ermittelt. Davon betroffen sind folgende Ctrl:

    Code
    GUICtrlCreateButton()	Button
    GUICtrlCreateCheckbox()	Button
    GUICtrlCreateGroup()	Button
    GUICtrlCreateRadio()	Button
    GUICtrlCreateEdit()	Edit
    GUICtrlCreateInput()	Edit
    GUICtrlCreateGraphic()	Static
    GUICtrlCreateIcon()	Static
    GUICtrlCreateLabel()	Static
    GUICtrlCreatePic()	Static

    Die Funktion gibt eine Struktur zurück mit folgendem Inhalt:

    Code
    .ID       GuiControl-ID
    .hWnd     GuiControl-Handle
    .Class    Classname
    .Au3Name  AutoIt-Name (der Teil nach GuiCtrlCreate..)
    .Au3Type  Konstante für den AutoIt-Namen
    .Style    GuiControl-Style
    .ExStyle  GuiControl-ExStyle

    Das Unterscheiden der Control anhand der Styles sollte funktionieren. Bin mir aber noch nicht sicher, ob es auch bei den verschiedensten Style-Kombinationen klappt. Bin da für Rückmeldungen dankbar.

    Was mir aufgefallen ist:

    Ein GuiCtrlCreateLabel() ist von einem GuiCtrlCreateGraphic() anhand Klasse und Style nicht zu unterscheiden - sie sind identisch. Ist mir völlig unklar, wie das intern differenziert wird. Ich habe jetzt als Notlösung einfach mit Grafikfunktion einen Pixel im nicht sichtbaren Bereich des Controls gezeichnet. Ist die Funktion erfolgreich, ist es ein Graphic, wenn nicht - ein Label.

    Es werden ausschliesslich durch Native AutoIt Funktionen erstellte Ctrl-ID geprüft (GuiCtrlCreateObj ist somit nicht dabei).

    UDF
    AutoIt: GuiCtrlInfo.au3
    ;-- TIME_STAMP   2021-02-13 12:19:09   v 0.1
    
    #include-once
    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    
    
    
    ; CONSTANTS: (G)ui(C)reated(C)ontrol ordered by Classname
    ;                                    FUNCTION                    CLASS
    Global Const $GCC_NONE     = 0
    Global Const $GCC_BUTTON   = 1     ; GUICtrlCreateButton()        Button
    Global Const $GCC_CHECKBOX = 2     ; GUICtrlCreateCheckbox()    Button
    Global Const $GCC_GROUP    = 3     ; GUICtrlCreateGroup()        Button
    Global Const $GCC_RADIO    = 4     ; GUICtrlCreateRadio()        Button
    Global Const $GCC_COMBO    = 5     ; GUICtrlCreateCombo()        ComboBox
    Global Const $GCC_EDIT     = 6     ; GUICtrlCreateEdit()        Edit
    Global Const $GCC_INPUT    = 7     ; GUICtrlCreateInput()        Edit
    Global Const $GCC_LIST     = 8     ; GUICtrlCreateList()        ListBox
    Global Const $GCC_PROGRESS = 9     ; GUICtrlCreateProgress()    msctls_progress32
    Global Const $GCC_SLIDER   = 10    ; GUICtrlCreateSlider()        msctls_trackbar32
    Global Const $GCC_UPDOWN   = 11    ; GUICtrlCreateUpdown()        msctls_updown32
    Global Const $GCC_GRAPHIC  = 12    ; GUICtrlCreateGraphic()        Static
    Global Const $GCC_ICON     = 13    ; GUICtrlCreateIcon()        Static
    Global Const $GCC_LABEL    = 14    ; GUICtrlCreateLabel()        Static
    Global Const $GCC_PIC      = 15    ; GUICtrlCreatePic()            Static
    Global Const $GCC_AVI      = 16    ; GUICtrlCreateAvi()            SysAnimate32
    Global Const $GCC_DATE     = 17    ; GUICtrlCreateDate()        SysDateTimePick32
    Global Const $GCC_LISTVIEW = 18    ; GuiCtrlCreateListView()    SysListView32
    Global Const $GCC_MONTHCAL = 19    ; GUICtrlCreateMonthCal()    SysMonthCal32
    Global Const $GCC_TAB      = 20    ; GUICtrlCreateTab()            SysTabControl32
    Global Const $GCC_TREEVIEW = 21    ; GUICtrlCreateTreeView()    SysTreeView32
    
    Global $__gaGCC_CLASSES[][2] = [['None_Class_detected',''], _  ; [[Class,Au3-Name (part from "GuiCtrlCreate..")]]
    ['Button','Button'],['Button','Checkbox'],['Button','Group'],['Button','Radio'],['ComboBox','Combo'], _
    ['Edit','Edit'],['Edit','Input'],['ListBox','List'],['msctls_progress32','Progress'],['msctls_trackbar32','Slider'], _
    ['msctls_updown32','Updown'],['Static','Graphic'],['Static','Icon'],['Static','Label'],['Static','Pic'], _
    ['SysAnimate32','Avi'],['SysDateTimePick32','Date'],['SysListView32','ListView'],['SysMonthCal32','MonthCal'], _
    ['SysTabControl32','Tab'],['SysTreeView32','TreeView']]
    
    
    Func _GuiCtrlGetInfo($_ID)
        Local $tInfo = DllStructCreate('int ID;hwnd hWnd;char Class[32];char Au3Name[32];int Au3Type;int Style;int ExStyle;')
        $tInfo.ID = $_ID
        $tInfo.hWnd = GUICtrlGetHandle($_ID)
        Local $aResult = DllCall("user32.dll", "int", "GetClassName", "hwnd", $tInfo.hWnd, "str", "", "int", 4096)
        If @error Or Not $aResult[0] Then
            $tInfo.Class = "None_Class_detected"
            Return SetError(@error, @extended, $tInfo)
        Else
            $tInfo.Class = StringStripWS($aResult[2], 2)
        EndIf
        Local $aStyle = _CtrlGetStyle($tInfo.hWnd)
        $tInfo.Style = $aStyle[0]
        $tInfo.ExStyle = $aStyle[1]
    
        Switch $tInfo.Class
            Case "Button"
                If BitAND($tInfo.Style, $BS_GROUPBOX) = $BS_GROUPBOX Then
                    $tInfo.Au3Type = $GCC_GROUP
                ElseIf BitAND($tInfo.Style, $BS_3STATE) = $BS_3STATE Or _
                       BitAND($tInfo.Style, $BS_AUTO3STATE) = $BS_AUTO3STATE Or _
                       BitAND($tInfo.Style, $BS_AUTOCHECKBOX) = $BS_AUTOCHECKBOX Or _
                       BitAND($tInfo.Style, $BS_CHECKBOX) = $BS_CHECKBOX Then
                    $tInfo.Au3Type = $GCC_CHECKBOX
                ElseIf BitAND($tInfo.Style, $BS_RADIOBUTTON) = $BS_RADIOBUTTON Or _
                       BitAND($tInfo.Style, $BS_AUTORADIOBUTTON) = $BS_AUTORADIOBUTTON Then
                    $tInfo.Au3Type = $GCC_RADIO
                Else
                    $tInfo.Au3Type = $GCC_BUTTON
                EndIf
            Case "Edit"
                If BitAND($tInfo.Style, $ES_AUTOVSCROLL) = $ES_AUTOVSCROLL Then
                    $tInfo.Au3Type = $GCC_EDIT
                Else
                    $tInfo.Au3Type = $GCC_INPUT
                EndIf
            Case "Static"
                If BitAND($tInfo.Style, $SS_ICON) = $SS_ICON Then
                    $tInfo.Au3Type = $GCC_ICON
                ElseIf BitAND($tInfo.Style, $SS_BITMAP) = $SS_BITMAP Or _
                       BitAND($tInfo.Style, $SS_ENHMETAFILE) = $SS_ENHMETAFILE Then
                    $tInfo.Au3Type = $GCC_PIC
                ; Label and Graphic can have as only style: $SS_NOTIFY
                ElseIf BitAND($tInfo.Style, $SS_NOTIFY) = $SS_NOTIFY Then
                    ; try to use a graphic function - if fails: it's a label
                    Local $ret = GUICtrlSetGraphic($tInfo.ID, $GUI_GR_PIXEL, -1, -1)
                    If $ret = 1 Then
                        $tInfo.Au3Type = $GCC_GRAPHIC
                    Else
                        $tInfo.Au3Type = $GCC_LABEL
                    EndIf
                EndIf
            Case Else
                For $i = 0 To UBound($__gaGCC_CLASSES) -1
                    If $__gaGCC_CLASSES[$i][0] = $tInfo.Class Then
                        $tInfo.Au3Type = $i
                        ExitLoop
                    EndIf
                Next
        EndSwitch
    
        $tInfo.Au3Name = $__gaGCC_CLASSES[$tInfo.Au3Type][1]
        Return $tInfo
    EndFunc
    
    
    
    ; #FUNCTION# =======================================================================================
    ; Name...........: _CtrlGetStyle
    ; Description ...: Retrieves the Styles/ExStyles value(s) of the control.
    ; Syntax.........: _CtrlGetStyle($iControlID)
    ; Parameters ....: $iControlID - A valid control ID.
    ; Requirement(s).: v3.3.2.0 or higher
    ; Return values .: Success - Returns an Array[2] = [Style, ExStyle] with the Styles/ExStyles value(s).
    ;                  Failure - Returns an Array with -1 as the 0 & 1 Index's.
    ; Author ........: guinness & additional information from Melba23.
    ; Example........; Yes
    ;===================================================================================================
    Func _CtrlGetStyle($iControlID)
        Local $aArray[2] = [-1, -1], $aExStyle, $aStyle, $hControl = $iControlID
        If Not IsHWnd($hControl) Then $hControl = GUICtrlGetHandle($iControlID)
        $aStyle = DllCall("user32.dll", "long", "GetWindowLong", "hwnd", $hControl, "int", 0xFFFFFFF0)
        If Not @error Then
            $aArray[0] = $aStyle[0]
        EndIf
        $aExStyle = DllCall("user32.dll", "long", "GetWindowLong", "hwnd", $hControl, "int", 0xFFFFFFEC)
        If Not @error Then
            $aArray[1] = $aExStyle[0]
        EndIf
        Return $aArray
    EndFunc  ;==>_CtrlGetStyle
    Alles anzeigen
    Beispiel
    AutoIt: GuiCtrlInfo_Example.au3
    ;-- TIME_STAMP   2021-02-13 12:16:22
    
    #include 'GuiCtrlInfo.au3'
    #include <TreeViewConstants.au3>
    #include <WindowsConstants.au3>
    #include <GUIConstantsEx.au3>
    
    $hGui = GUICreate('Test Ctrl', 800, 600)
    
    ; class: Button                                                                                     ID
    $button = GUICtrlCreateButton('Button', 10, 40)                                                    ; 3
    $check = GUICtrlCreateCheckbox('check', 100, 40)                                                   ; 4
    $group = GUICtrlCreateGroup('group', 370, 70, 120, 60)                                             ; 5
    $radio = GUICtrlCreateRadio('radio', 390, 310, 60)                                                 ; 6
    
    ; class: Edit
    $edit = GUICtrlCreateEdit('Edit', 200, 70, 150, 50)                                                ; 7
    $input = GUICtrlCreateInput('input', 640, 70, 100, 25)                                             ; 8
    
    ; class: Static
    $graphic = GUICtrlCreateGraphic(510, 70, 60, 60)                                                   ; 9
    GUICtrlSetBkColor(-1, 0x0000ff)
    $icon = GUICtrlCreateIcon("shell32.dll", 10, 590, 70)                                              ;10
    $label = GUICtrlCreateLabel('', 10, 140, 60)                                                       ;11
    $pic = GUICtrlCreatePic("C:\Program Files (x86)\AutoIt3\Examples\GUI\mslogo.jpg", 10, 310, 200, 50);12
    
    $avi  = GUICtrlCreateAvi(@SystemDir & "\shell32.dll", 165, 250, 450, 300)                           ;13
    GUICtrlSetState($avi, $GUI_AVISTART)
    $combo = GUICtrlCreateCombo('combo', 200, 40, 150)                                                 ;14
    $date = GUICtrlCreateDate("1953/04/25", 10, 70, 185, 20)                                           ;15
    $list = GUICtrlCreateList('list', 100, 140, 120, 30)                                               ;16
    $lv = GuiCtrlCreateListView('list|view', 250, 140, 200, 50)                                        ;17
    $monthCal = GUICtrlCreateMonthCal("1953/03/25", 610, 140, 180, 165)                                ;18
    $oIE = ObjCreate("Shell.Explorer.2")                                                               ;KEINE ID - aber IsObj() = 1
    $gcObj = GUICtrlCreateObj($oIE, 10, 200, 590, 100)                                                 ;19, ID - keine Class - aber IsObj() = 0
    $progress = GUICtrlCreateProgress(250, 310, 120, 25)                                               ;20
    GUICtrlSetData(-1, 35)
    $slider = GUICtrlCreateSlider(460, 310, 100, 25)                                                   ;21
    GUICtrlSetData(-1, 75)
    $tab = GUICtrlCreateTab(10, 450, 200, 60)                                                          ;22
    $tv = GUICtrlCreateTreeView(610, 310, 180, 150, BitOR($TVS_HASBUTTONS, $TVS_HASLINES, $TVS_LINESATROOT, $TVS_DISABLEDRAGDROP, $TVS_SHOWSELALWAYS), $WS_EX_CLIENTEDGE)
                                                                                                       ;23
    $inputUD = GUICtrlCreateInput("2", 10, 610, 50, 20)                                                ;24
    $ud = GUICtrlCreateUpdown($inputUD)                                                                ;25
    
    GUISetState()
    
    Local $t, $aPre[] = ['>> ', '+> '], $ip = 1, $classLast = ''
    ConsoleWrite(StringFormat('->  ID    HWND         CLASSNAME              AU3NAME       AU3TYPE  STYLE        EXSTYLE') & @CRLF)
    For $i = $button To $ud
        $t = _GuiCtrlGetInfo($i)
        If $t.Class <> $classLast Then
            $ip = Abs($ip-1)
            $classLast = $t.Class
        EndIf
        ConsoleWrite(StringFormat('%s %-6s%-13s%-23s%-14s%-9s0x%-11s0x%s\n', $aPre[$ip], $t.ID, $t.hWnd, $t.Class, $t.Au3Name, $t.Au3Type, Hex($t.Style,8), Hex($t.ExStyle,8)))
    Next
    
    Do
    Until GUIGetMsg() = -3
    Alles anzeigen
    Ausgabe Beispielcode
    Code
    ->  ID    HWND         CLASSNAME              AU3NAME       AU3TYPE  STYLE        EXSTYLE
    >>  3     0x006F070E   Button                 Button        1        0x50030000   0x00000000
    >>  4     0x00050322   Button                 Checkbox      2        0x50010003   0x00000000
    >>  5     0x0006031C   Button                 Group         3        0x50020007   0x00000000
    >>  6     0x004B080A   Button                 Radio         4        0x50010009   0x00000000
    +>  7     0x006A068E   Edit                   Edit          6        0x503110C4   0x00000200
    +>  8     0x001B07A2   Edit                   Input         7        0x50010080   0x00000200
    >>  9     0x0048034C   Static                 Graphic       12       0x50000100   0x00000000
    >>  10    0x00B304BE   Static                 Icon          13       0x50010103   0x00000000
    >>  11    0x009805A6   Static                 Label         14       0x50000100   0x00000000
    >>  12    0x008B086E   Static                 Pic           15       0x5000010E   0x00000000
    +>  13    0x0026034A   SysAnimate32           Avi           16       0x50000002   0x00000000
    >>  14    0x000E0352   ComboBox               Combo         5        0x50010242   0x00000000
    +>  15    0x007307FA   SysDateTimePick32      Date          17       0x52010004   0x00000000
    >>  16    0x00A8085A   ListBox                List          8        0x50810003   0x00000200
    +>  17    0x01EB0562   SysListView32          ListView      18       0x5001000D   0x00000220
    >>  18    0x007D069C   SysMonthCal32          MonthCal      19       0x50010000   0x00000200
    +>  19    0x00000000   None_Class_detected                  0        0x00000000   0x00000000
    >>  20    0x00F10552   msctls_progress32      Progress      9        0x50000000   0x00000000
    +>  21    0x00890630   msctls_trackbar32      Slider        10       0x50000001   0x00000000
    >>  22    0x00320738   SysTabControl32        Tab           20       0x54014040   0x00000000
    +>  23    0x0096078A   SysTreeView32          TreeView      21       0x50010037   0x00000200
    >>  24    0x008C0528   Edit                   Input         7        0x50010080   0x00000200
    +>  25    0x00220878   msctls_updown32        Updown        11       0x50000106   0x00000000
    Alles anzeigen

    Dateien

    GuiCtrlInfo.au3 5,98 kB – 540 Downloads GuiCtrlInfo_Example.au3 3,7 kB – 504 Downloads
  • Self Modifying Code / IPC / Funktionen zur Laufzeit erzeugen

    • BugFix
    • 11. Februar 2021 um 12:21
    Zitat von SEuBo

    ich habe mich bis vor diesem Projekt auch nicht mit AutoItObject beschäftigt

    Dann möchte ich dich gleichmal auf ein Problem hinweisen, das leider nicht lösbar ist und mich viele Nerven gekostet hat: AutoIt-Object -- Parameter einer Methode als ByRef

  • SQL - Abfrageproblem

    • BugFix
    • 10. Februar 2021 um 13:23
    Zitat von AspirinJunkie

    Eine Frage noch: Was ist "&&SQL1"? Eine View oder irgendeine Temp-Table?

    Das ist eine temporäre Tabelle. Ist ganz praktisch für Batchverarbeitung und man muss sich nicht so verbiegen um Ergebnisse aus mehreren Abfragen zusammenzuführen.

    Danke für deine Mühe.

  • SQL - Abfrageproblem

    • BugFix
    • 10. Februar 2021 um 10:34

    (Firebird SQL 1.5)

    Ziel ist eine Liste für den Servicemitarbeiter, mit allen relevanten Kundendaten zu den Geräten zu erhalten (es erfolgt noch eine Selektion bestimmter Geräte, das hat aber auf diese Abfrage keinen Einfluß).

    Ich frage in einem ersten Schritt die Geräte, die Kunden zugebucht sind ab. Dabei enthält jeder DS alle relevanten Kundendaten (KD-Nr,Name,Anschrift,Tel,Handy) und die Hersteller-SerNr. des Gerätes.

    Das funktioniert, wie gewünscht.

    Fiktives Ergebnis (von einem Kunden):

    100251,Max Meier,12345 Musterdorf,03123-304050,0170-11223344,G1234QH789

    100251,Max Meier,12345 Musterdorf,03123-304050,0170-11223344,G1234QM137

    Jetzt möchte ich zu den vorhandenen Daten noch die Rufnummer eines Ansprechpartners einfügen (sofern vorhanden, aus extra Tabelle).

    gewünscht:

    100251,Max Meier,12345 Musterdorf,03123-304050,0170-11223344,G1234QH789,03123-304055

    100251,Max Meier,12345 Musterdorf,03123-304050,0170-11223344,G1234QM137,03123-304055

    tatsächlich:

    100251,Max Meier,12345 Musterdorf,03123-304050,0170-11223344,G1234QH789

    100251,Max Meier,12345 Musterdorf,03123-304050,0170-11223344,G1234QH789,03123-304055

    100251,Max Meier,12345 Musterdorf,03123-304050,0170-11223344,G1234QM137

    100251,Max Meier,12345 Musterdorf,03123-304050,0170-11223344,G1234QM137,03123-304055


    Hier die Abfragen: SQL_Ansprech.pdf

    Wie muss ich das korrekt einbinden?

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

    • BugFix
    • 10. Februar 2021 um 09:19
    Zitat von Professor Bernd

    AltGr ist NIICHT in allen Layouts gleich belegt.

    Stimmt, hatte ich nicht dran gedacht: AltGr gibt es eigentlich nicht - beim Betätigen der Taste wird der Hardwareinput "Strg+Alt" generiert. ;)

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

    • BugFix
    • 8. Februar 2021 um 18:36
    Zitat von Professor Bernd

    So scheint mir z.B. die Windows-API-Funktion "VkKeyScanExA()" genau das leisten zu können, was ich suche: Man gibt das gesuchte Zeichen "(" ein und erhält einen virtuellen Key-Code und den Shift-Status, passend zum jeweiligen Tastaturlayout.

    Das hört sich zumindest sinnvoll an.

    Mein Test erbrachte aber entweder total blödsinnige Ergebnisse oder keine (vkCode: 255).

    Kannst ja selbst damit probieren:

    C
    #include <WinAPISys.au3>
    #include <WinAPIConv.au3>
    
    Local $t
    $t = _VkKeyScanExA('a')
    ConsoleWrite('Char: "a"' & @TAB & 'vkCode: ' & $t.vkCode & @TAB & 'Shift: ' & BitAND($t.ShiftState, 1) & @CRLF)
    $t = _VkKeyScanExA('A')
    ConsoleWrite('Char: "A"' & @TAB & 'vkCode: ' & $t.vkCode & @TAB & 'Shift: ' & BitAND($t.ShiftState, 1) & @CRLF)
    $t = _VkKeyScanExA('(')
    ConsoleWrite('Char: "("' & @TAB & 'vkCode: ' & $t.vkCode & @TAB & 'Shift: ' & BitAND($t.ShiftState, 1) & @CRLF)
    $t = _VkKeyScanExA(')')
    ConsoleWrite('Char: ")"' & @TAB & 'vkCode: ' & $t.vkCode & @TAB & 'Shift: ' & BitAND($t.ShiftState, 1) & @CRLF)
    
    
    Func _VkKeyScanExA($_char)
        Local Static $KBLayout = _WinAPI_GetKeyboardLayout(WinGetHandle(''))
        Local $tChar = DllStructCreate('char[1]')
        DllStructSetData($tChar, 1, $_char)
        Local $ret = DllCall('user32.dll', 'short', 'VkKeyScanExA', 'ptr', DllStructGetPtr($tChar), 'dword', $KBLayout)
        Local $tRes = DllStructCreate("byte vkCode;byte ShiftState;")
        $tRes.vkCode = _WinAPI_LoByte($ret[0])
        $tRes.ShiftState = _WinAPI_HiByte($ret[0])
        Return $tRes
    EndFunc
    Alles anzeigen

    Wobei das Problem evtl. beim Datentyp HKL des Keyboardlayouts liegt. Aufgrund der Beschreibung habe ich das als DWORD (LO word & HI word) interpretiert.

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™