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

Beiträge von JBO

  • _ArrayUnique Problem

    • JBO
    • 2. Dezember 2021 um 14:42
    Zitat von Moombas

    Schau dir mal die Hilfe an. Ich habe eine Vermutung:

    Versuch mal (alles Default, nur der letzte Wert nicht):

    $aExpo = _ArrayUnique($aExportables, 0, 0, 0, $ARRAYUNIQUE_COUNT, 4)

    SUPER, vielen Dank!! Es hat funktioniert!

  • _ArrayUnique Problem

    • JBO
    • 2. Dezember 2021 um 14:14
    Zitat von AspirinJunkie

    Bitte poste ein direkt ausführbares Minimalbeispiel, was diesen Fehler reproduziert und welches andere direkt bei sich selbst ausführen können.

    Naja, da das Script eins unserer Programme auf der Arbeit steuern soll, ist das nicht 100% ausführbar. Aber ich kann mal die Funktion posten, die den Fehler versursacht:

    Code
    Func GetExportableItems ( $hWnd, $sSearchString )
       WinActivate( $hWnd )
       $hNextItem = _GUICtrlTreeView_GetItemHandle( $hWnd ) ; Handle to start from
    
       Local $aExportables[0]
       Local $hLevel0Item = 0
    
       While $hNextItem <> 0
          $iLevel = _GUICtrlTreeView_Level( $hWnd, $hNextItem ) ; Das Item-Level wird abgefragt
          Switch $iLevel
             Case 0
                $hLevel0Item = $hNextItem
                _GUICtrlTreeView_SelectItem( $hWnd, $hLevel0Item )
                _GUICtrlTreeView_Expand( $hWnd, $hLevel0Item )
             Case 1
                _GUICtrlTreeView_SelectItem( $hWnd, $hNextItem )
             Case 2
                _GUICtrlTreeView_SelectItem( $hWnd, $hNextItem )
                $sLevel2Text = _GUICtrlTreeView_GetText( $hWnd, $hNextItem )
                If StringInStr( $sLevel2Text, $sSearchString, 1 ) > 0 Then
                   _ArrayAdd( $aExportables, $hLevel0Item )
                   _GUICtrlTreeView_SelectItem( $hWnd, $hLevel0Item )
                   _GUICtrlTreeView_Expand( $hWnd, $hLevel0Item, False )
                Else
                   $hNext = _GUICtrlTreeView_GetNext( $hWnd, $hNextItem )
                   If _GUICtrlTreeView_Level( $hWnd, $hNext ) = 0 Then
                      _GUICtrlTreeView_SelectItem( $hWnd, $hLevel0Item )
                      _GUICtrlTreeView_Expand( $hWnd, $hLevel0Item, False )
                   EndIf
                EndIf
          EndSwitch
          $hNextItem = _GUICtrlTreeView_GetNext( $hWnd, $hNextItem )
       WEnd
       Local $aExpo = _ArrayUnique( $aExportables )
       _ArrayDisplay( $aExpo )
       Return $aExpo
    EndFunc
    Alles anzeigen

    Zum Verständnis:

    Die Funktion geht einen TreeView durch, wenn in Level 2 ein Eintrag gefunden wird, der dem Suchstring entspricht, wird das dazugehörige Level 0 Item in den Array gespeichert, mit _ArrayAdd. Am Ende gibt es mehrere Einträge mit dem gleichen Level 0 Item (Handle). Darum möchte ich den Array kürzen lassen.

  • _ArrayUnique Problem

    • JBO
    • 2. Dezember 2021 um 13:25

    Hallo zusammen!

    Ich habe in einer Funktion einen 1D-Array erstellen lassen in dem Handles stehen. Da allerdings in dem Array mehrere Handles mehrfach vorkommen, wollte ich diese mit _ArrayUnique( $Array ) auf einen Eintrag pro Handle kürzen.

    Mein Problem ist, dass AutoIt immer wieder aussteigt mit der Meldung:

    Zitat

    C:\Program Files (x86)\AutoIt3\Include\Array.au3" (1830) : ==> The requested action with this object has failed.:

    $oDictionary.Item($vElem)

    $oDictionary^ ERROR

    Was mache ich da falsch? Oder ist das ein Bug?

    VG

  • Funktionen als Administrator ausführen

    • JBO
    • 23. November 2021 um 15:52
    Zitat von Musashi

    Du lässt das #RequireAdmin zu Beginn des Skriptes weg.

    Bereiche (Menüpunkte), die Adminrechte erfordern, prüfst Du mittels IsAdmin .

    Wird das kompilierte Skript 'normal' gestartet, dann werden diese Bereiche nicht ausgeführt.

    Startest Du das Skript aber mit Als Administrator ausführen erscheint eine UAC-Abfrage (vorausgesetzt es wurde nichts deaktiviert). Bestätigst Du die UAC-Abfrage (ggf. Admindaten eingeben), dann läuft Dein Skript mit Adminrechten.

    Super, vielen Dank! Es funktioniert!

  • Funktionen als Administrator ausführen

    • JBO
    • 23. November 2021 um 15:09
    Zitat von BugFix

    Du kannst doch bei Aufruf des jeweiligen Menüpunktes vor dem Ausführen abfragen, ob der angemeldete User Admin ist.

    OK, klingt gut, aber wie? Am liebsten wäre mir natürlich, dass man dann, wie bei #RequireAdmin aufgefordert wird, das Administratorpassowrt einzugeben, aber es geht auch mit einer Fehlermeldung. Für die Fehlermeldung muss ich dann nur wissen, zu welcher Gruppe der aktuelle Benutzer gehört.

  • Funktionen als Administrator ausführen

    • JBO
    • 23. November 2021 um 14:41

    Hallo zusammen!

    Gibt es eine Möglichkeit, mit der ich einzelne Funktionen oder Menüpunkte in einem GUI nur als Admin ausführen kann? Also nicht das komplette Script.

    Der Hintergrund ist folgender: Man soll als normaler DAU-User das Programm bedienen können. Ich habe allerdings im Menü Programmpunkte zum Aufruf der INI-Dateien im Editor, was man nur als Admin können soll.

    #RequireAdmin gilt ja für das komplette Programm und RunAs lässt mich Programmteile mit vorgegebenem Benutzer ausführen, wenn ich das richtig verstanden hab.

    VG

  • Funktionen/STRG+C auslesen

    • JBO
    • 23. November 2021 um 14:33

    Hallo und willkommen!

    Ich bin zwar auch noch recht neu hier, aber ich versuch es mal ;)

    Zu 1.:

    Code
    Func Funktion1()
    MouseClick("left", 1372, $koord1, 1)
    sleep(Random(500,1000))
    MouseClick("left", 522, 487, 1)
    sleep(Random(500,1000))
    For $a = 1 To $H
    a()
    Next
    MouseClick("left", 522, 487, 1)
    sleep(Random(500,1000))
    Send("{LEFT}")
    sleep(Random(300,600))
    For $a = 1 To $R
    b()
    Next
    Alles anzeigen

    Warum machst du nicht einen array mit den Koordinaten, die du dann als Paramter an deine Funktion übergibst?

    Also entweder vorher:

    $aKoords = [ [ 12, 120 ], [ 540, 230] ]

    Funktion ( $aKoords )

    Func Funktion( $aAdress )

    For $i = 0 To UBound( $aAdress ) Step 1

    MouseClick("left", 1372, $aAdress[$i], 1)

    ... weiterer Code

    Next

    EndFunc

    Oder halt mit der For-Schleife außerhalb der Funktion:

    $aKoords = [ [ 12, 120 ], [ 540, 230] ]

    For $i = 0 To UBound( $aKoords ) Step 1

    Funktion( $aKoords[$i] )

    Next

    Func Funktion ( $iAdresse ) ; ist die Adresse eine eizelne Zahl, oder 2 Zahlen? Dann musst du das anpassen

    ... ; = Funktionsinhalte

    EndFunc

    Zu 2.:

    Guck dir mal die Funktion "_ClipBoard_GetData" an, die gibt dir einen String zurück, wenn nur Text in der Zwischenablage ist, den du dann mit den Stringfunktionen bearbeitetn kannst.

    VG

  • GUICtrlSetColor Problem

    • JBO
    • 23. November 2021 um 11:17
    Zitat von Moombas

    funkey hat dir dazu doch oben ein Beispiel geschrieben.

    Oh sorry, da war ich zu voreilig. Habs jetzt so wie es sein soll.
    DANKE!!

  • GUICtrlSetColor Problem

    • JBO
    • 23. November 2021 um 10:17

    Danke an alle!

    Zitat von Moombas

    Ich denke die Vermutung von BugFix passt und das zweite SetColor gehört ins else

    Danke, das hat jetzt zumindest mit der Farbe funktioniert. Leider färbt es halt das komplette Edit-Field.

    Ich dachte, ich könnte die Farbe pro Zeile einstellen, darum erst auf Rot, dann Zeile ausgeben und sofort wieder auf Schwarz.

  • GUICtrlSetColor Problem

    • JBO
    • 23. November 2021 um 09:12

    Hallo zusammen!

    Ich habe eine Funktion:

    Code
    Func UpdateEditField( $idEditField, $sString, $bError )
       Local $sValue = GUICtrlRead( $idEditField )
       If $bError = True Then
          Beep( 500, 500 )
          GUICtrlSetColor( $idEditField, $COLOR_RED )
          GUICtrlSetData( $idEditField, $sValue & @CRLF & $sString )
          GUICtrlSetColor( $idEditField, $COLOR_BLACK )
       Else
          GUICtrlSetData( $idEditField, $sValue & @CRLF & $sString )
       EndIf
    EndFunc
    Alles anzeigen

    Die soll in einem Editfield Fehlermeldungen und Hinweise ausgeben. Bei einer Fehlermeldung soll sie den Text in rot ausgeben, ansonsten in schwarz. Leider funktioniert das nicht so, wie ich es mir vorgestellt habe. Das EditField steht auf "Readonly". Liegt es an Readonly, oder muss ich einen Refresh auf meine GUI machen? Wenn ja, wie mache ich das vernünftig, oder muss ich das komplette GUI mit @SW_SHOW einfach neu aufbauen?

    VG

  • Kontextmenü auslesen

    • JBO
    • 15. November 2021 um 11:32
    Zitat von Bitnugger
    AutoIt: _GUICtrlMenu_GetContextMenu_Example.au3
    ;-- TIME_STAMP   2021-11-13 22:20:09   
    
    ;~ #include <AutoItConstants.au3>
    #include <WindowsConstants.au3>
    ;~ #include <Array.au3>
    #include <GuiMenu.au3>
    #include <Process.au3>
    #include <SendMessage.au3>
    #include <WinAPISysWin.au3>
    
    
    _GUICtrlMenu_GetContextMenu_Example()
    
    Func _GUICtrlMenu_GetContextMenu_Example()
        Local $hDesktop = _WinAPI_GetDesktopWindow()
    
        Local $hWnd, $hPopUp, $hActive, $hParent, $hRoot, $hRootOwner, $sMenuText
        $hActive = WinGetHandle('[ACTIVE]')
        ConsoleWrite("@@_Debug_line" & @TAB & @TAB & @ScriptLineNumber & "   var: $hActive    --> " & $hActive & @CRLF & @CRLF & 'Open a popup menu...' & @CRLF & @CRLF)
        Do
            Sleep(250)
            $hWnd = WinGetHandle('[CLASS:#32768]')
        Until $hWnd
        $hParent = _WinAPI_GetAncestor($hWnd, $GA_PARENT)
        $hRoot = _WinAPI_GetAncestor($hWnd, $GA_ROOT)
        $hRootOwner = _WinAPI_GetAncestor($hWnd, $GA_ROOTOWNER)
        Local $iPID = WinGetProcess($hWnd)
        $sProcessName = _ProcessGetName($iPID)
        ConsoleWrite("@@_Debug_line" & @TAB & @TAB & @ScriptLineNumber & "   var: $iPID         --> " & $iPID & @CRLF)
        ConsoleWrite("@@_Debug_line" & @TAB & @TAB & @ScriptLineNumber & "   var: $sProcessName --> " & $sProcessName & @CRLF)
        ConsoleWrite("@@_Debug_line" & @TAB & @TAB & @ScriptLineNumber & "   var: $hWnd         --> " & $hWnd & @TAB & 'Title = "' & WinGetTitle($hWnd) & '"' & @CRLF)
        ConsoleWrite("@@_Debug_line" & @TAB & @TAB & @ScriptLineNumber & "   var: $hParent      --> " & $hParent & @TAB & 'Title = "' & WinGetTitle($hParent) & '"' & @CRLF)
        ConsoleWrite("@@_Debug_line" & @TAB & @TAB & @ScriptLineNumber & "   var: $hRoot        --> " & $hRoot & @TAB & 'Title = "' & WinGetTitle($hRoot) & '"' & @CRLF)
        ConsoleWrite("@@_Debug_line" & @TAB & @TAB & @ScriptLineNumber & "   var: $hRootOwner   --> " & $hRootOwner & @TAB & 'Title = "' & WinGetTitle($hRootOwner) & '"' & @CRLF)
    
        $hPopUp = _SendMessage($hWnd, $MN_GETHMENU)
        ConsoleWrite("@@_Debug_line" & @TAB & @TAB & @ScriptLineNumber & "   var: $hPopUp       --> " & $hPopUp & @CRLF)
    
        Local $sItemText, $aSplit, $aRect, $iItemCount = _GUICtrlMenu_GetItemCount($hPopUp), $hSub, $iSubItemCount, $sSubItemText, $iIndent = 16
        ConsoleWrite("@@_Debug_line" & @TAB & @TAB & @ScriptLineNumber & "   var: $iItemCount   --> " & $iItemCount & @CRLF)
        For $iItem = 0 To $iItemCount - 1 Step 1
            $sItemText = _GUICtrlMenu_GetItemText($hPopUp, $iItem)
            If $sItemText = '' Then $sItemText = '--------------------------------' ; Separator line
            $aSplit = StringSplit($sItemText & @TAB, @TAB, $STR_NOCOUNT)
            $aRect = _GUICtrlMenu_GetItemRect($hDesktop, $hPopUp, $iItem); Mit $hPopUp funktioniert es!
            ConsoleWrite(StringFormat('> $sItemText #%02i: %-48s %s $aRect[%5i,%5i,%5i,%5i]\n', $iItem, $aSplit[0], $aSplit[1], $aRect[0], $aRect[1], $aRect[2], $aRect[3]))
    
            $hSub = _GUICtrlMenu_GetItemSubMenu($hPopUp, $iItem)
            If $hSub Then
                $iSubItemCount = _GUICtrlMenu_GetItemCount($hSub)
                ConsoleWrite("@@_Debug_line" & @TAB & @TAB & @ScriptLineNumber & "   var: $hSub         --> " & $hSub & @CRLF)
                For $iSubItem = 0 To $iSubItemCount - 1 Step 1
                    $sSubItemText = _GUICtrlMenu_GetItemText($hSub, $iSubItem)
                    $aSplit = StringSplit($sSubItemText & @TAB, @TAB, $STR_NOCOUNT)
                    $aRect = _GUICtrlMenu_GetItemRect($hDesktop, $hSub, $iSubItem) ; Mit $hSub funktioniert es nicht!
                    ConsoleWrite(StringFormat('+ %'&$iIndent&'s$sSubItemText #%02i: %-48s %s $aRect[%5i,%5i,%5i,%5i]\n', '', $iSubItem, $aSplit[0], $aSplit[1], $aRect[0], $aRect[1], $aRect[2], $aRect[3]))
                Next
            EndIf
        Next
    EndFunc   ;==>_GUICtrlMenu_GetContextMenu_Example
    Alles anzeigen

    _GUICtrlMenu_GetContextMenu_Example.png

    Ah super! Genau sowas hab ich gesucht! DANKE!!

  • Kontextmenü auslesen

    • JBO
    • 12. November 2021 um 09:30
    Zitat von Bitnugger

    Schau mal, ob dir das hier weiterhilft:

    Das Ermitteln des Handles für $hWnd, $hMain, $hDatei und die Keys bei ControlSend musst du natürlich entsprechend anpassen!

    AutoIt
    ;-- TIME_STAMP   2021-11-10 21:53:36   v 0.1
    
    #include <AutoItConstants.au3>
    #include <GuiMenu.au3>
    
    Opt('SendKeyDelay', 10) ; Mit ControlSend kommt der Text oft fehlerhaft an, wenn KeyDelay auf 5 (Default) steht! Bei mir funktioniert es mit 10 sehr gut.
    ;~ Opt('SendKeyDownDelay', 20)
    Example_GUICtrlMenu_GetMenu()
    Opt('SendKeyDelay', 5)
    ;~ Opt('SendKeyDownDelay', 5)
    
    Func Example_GUICtrlMenu_GetMenu()
        Local $hWnd, $hMain, $hDatei
    
        ; Open Notepad
        Local $iPID = Run("notepad.exe")
        WinWaitActive("[CLASS:Notepad]")
        $hWnd = WinGetHandle("[CLASS:Notepad]")
        $hMain = _GUICtrlMenu_GetMenu($hWnd)
    
        Local $hDatei = _GUICtrlMenu_GetItemSubMenu($hMain, 0) ; Handle für das Menu "Datei"
        Writeln("@@_Debug_line" & @TAB & @TAB & @ScriptLineNumber & "   var: $hDatei      --> " & $hDatei & @LF)
        Local $sItemText, $aSplit, $iItemCount = _GUICtrlMenu_GetItemCount($hDatei)
        For $iItem = 0 To $iItemCount - 1 Step 1
            $sItemText = _GUICtrlMenu_GetItemText($hDatei, $iItem)
            If $sItemText = '' Then $sItemText = '--------------------------------' ; Separator line
            $aSplit = StringSplit($sItemText & @TAB, @TAB, $STR_NOCOUNT)
            Writeln(StringFormat('> $sItemText #%02i: %-32s %s\n', $iItem, $aSplit[0], $aSplit[1]))
        Next
        Writeln(@CRLF)
    
        ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        ; Namen der SubMenues, deren AcceleratorKeys und den dazu passenden ControlSend ausgeben.
        Local $sMenuText, $iMenuCount = _GUICtrlMenu_GetItemCount($hMain), $iKeyPos, $sAccelatorKey, $sSend
        Writeln("@@_Debug_line" & @TAB & @TAB & @ScriptLineNumber & "   var: $iMenuCount --> " & $iMenuCount & @LF)
        For $iMenu = 0 To $iMenuCount - 1 Step 1 ; Datei | Bearbeiten | Format | Ansicht | Hilfe
            $sMenuText = _GUICtrlMenu_GetItemText($hMain, $iMenu)
            $iKeyPos = StringInStr(StringReplace($sMenuText, '&&', '##'), '&') + 1
            $sAccelatorKey = $iKeyPos ? StringMid($sMenuText, $iKeyPos, 1) : '' ; Das ist das Zeichen hinter dem "&" - falls vorhanden!
            $sSend = $sAccelatorKey ? "ControlSend($hWnd, '', '', '" & '!' & $sAccelatorKey & "', $SEND_DEFAULT)" : ''
            Writeln(StringFormat('> $sMenuText #%02i: %-32s Alt+%-32s %s\n', $iMenu, $sMenuText, $sAccelatorKey, $sSend))
        Next
        Writeln(@CRLF)
    
        ; Get/Set File menu help context ID
        Writeln("> File (Datei) help context ID: " & _GUICtrlMenu_GetMenuContextHelpID($hDatei) & '\n')
        _GUICtrlMenu_SetMenuContextHelpID($hDatei, 1234)
        Writeln("> File (Datei) help context ID: " & _GUICtrlMenu_GetMenuContextHelpID($hDatei) & '\n')
    
        ; Möchten Sie die Änderungen an Unbekannt speichern?
        ; Wenn kein HotKey vorhanden ist.
    ;~     ControlSend($hWnd, "", "", StringFormat('!du{Enter}'), $SEND_DEFAULT) ; Send AcceleratorKey (Alt+du{Enter}) "Dateimenu öffnen"
        ; Wenn ein HotKey vorhanden ist.
        ControlSend($hWnd, "", "", StringFormat('^+s{Enter}'), $SEND_DEFAULT) ; Send HotKey (Strg+Shift+s{Enter}) "Dateimenu öffnen"
    
        MsgBox(64 + 262144, @ScriptName, 'Press Ok for Exit')
        ProcessClose($iPID)
    EndFunc   ;==>Example_GUICtrlMenu_GetMenu
    
    ; Write a line of text to Notepad
    Func Writeln($sText)
        ControlSend("[CLASS:Notepad]", "", "Edit1", StringFormat($sText), $SEND_RAW)
    EndFunc   ;==>Writeln
    Alles anzeigen

    OK, danke, aber das ist leider nicht das, was ich wollte.

    Ich möchte das Kontextmenü auslesen, also das, was erscheint, wenn man die rechte Maustaste bzw. die Kontextmenütaste drückt, auslesen.

    Im Fall von Editor wäre das bei einem leeren Dokument:

    01: Rückgängig (inaktiv)

    02: ------------------------------

    03: Ausschneiden (inaktiv)

    04: Kopieren (inaktiv)

    05: Einfügen (aktiv wenn etwas in der Zwischenablage ist)

    06: Löschen (inaktiv)

    07: ------------------------------

    08: Alle Auswählen (inaktiv)

    09: ------------------------------

    10: Rechts-nach-Links-Lesefolge

    11: ...

    Und falls es noch Unterpunkte gibt, dann die natürlich auch.

    Kann man das?

  • Kontextmenü auslesen

    • JBO
    • 11. November 2021 um 16:45

    Hallo zusammen!

    Ist es möglich mit AutoIt das Kontextmenü eines fremden Programms auszulesen? Da dieses Programm einen kleinen Bug hat, den man nicht beheben kann, ist es nicht sicher, ob immer alle Einträge vorhanden sind, oder nicht. Ich würde gerne den Handle in einem Array abspeichern für alle Einträge, bei denen das Kontextmenü nicht vollständig war um später darauf zurück zu kehren.

    Zur Erläuterung des Bugs: Ich lade einen Datensatz und es erscheint der Titel in einem TreeView-Fenster. Auf dem Titel in dem FEnster kann ich das Kontextmenü öffnen. Bei manchen Datensätzen ist das Kontextmenü unvollständig. Wenn ich allerdings einen anderen Datensatz lade, bei dem das Kontextmenü vollständig ist und kehre dann zu dem ersten Datensatz zurück, dann ist dort das Kontextmenü auch vollständig. Ich habe leider keinen Plan, warum das so ist und wie man das ändern kann. Ich muss halt damit leben -.- (ist ein Fremdprogramm)

  • Programm fernsteuern

    • JBO
    • 9. November 2021 um 12:09

    "ES LEBT!" ;)

    Vielen lieben Dank! Es hat funktioniert, ich bin im Programm angekommen und kann (zumindest schon mal) das richtige Menü aufrufen. Das Programm beendet sich sogar ohne die Nachfrage, ob man wirklich beenden möchte, was man beim Klicken auf "X" sonst bekommt :) Das hätte ich alleine nicht hinbekommen!

    Jetzt muss ich nur noch raus kriegen, wie ich die Listfelder, ausgelesen bekomme und darauf reagieren kann.

  • Programm fernsteuern

    • JBO
    • 5. November 2021 um 12:24
    Zitat von Bitnugger

    Hier mal ein kleines Bsp. mit notepad.exe:

    AutoIt: Notepad_Example.au3
    #include <AutoItConstants.au3>
    
    _Example()
    
    Func _Example()
        Local $iPID = ProcessExists('notepad.exe')
        If Not $iPID Then $iPID = Run('notepad.exe')
        ConsoleWrite("@@_Debug_line" & @TAB & @TAB & @ScriptLineNumber & "   var: $iPID      --> " & $iPID & @LF)
    
        Local $hNotepad = WinWait('[REGEXPTITLE:.*Editor;CLASS:Notepad]', '', 3)
        ConsoleWrite("@@_Debug_line" & @TAB & @TAB & @ScriptLineNumber & "   var: $hNotepad  --> " & $hNotepad & @LF)
        If IsHWnd($hNotepad) Then
            WinActivate($hNotepad)
    
            ; Text einfügen
            ControlSend($hNotepad, '', '', 'Mit AutoIt Text in andere Programme einfügen ist ganz einfach...' & @LF, $SEND_RAW)
            ControlSend($hNotepad, '', '', 'aber möglichst mit ControlSend anstelle Send...' & @CRLF, $SEND_RAW)
            ControlSend($hNotepad, '', '', 'Und jetzt speichern wir das in eine Datei.' & @LF, $SEND_RAW)
    
            ControlSend($hNotepad, '', '', '^+s', $SEND_DEFAULT) ; Send STRG+SHIFT+S - Menü "Datei" -->> "Speichern unter..."
            Local $hSaveAs = WinWait('[TITLE:Speichern unter; CLASS:#32770]', '', 3) ; 3 Sekunden auf Fenster warten.
            ConsoleWrite("@@_Debug_line" & @TAB & @TAB & @ScriptLineNumber & "   var: $hSaveAs  --> " & $hSaveAs & @LF)
            Sleep(1000) ; Etwas warten, bis das Fenster komplett aufgebaut ist, da wir sonst evtl. kein Handle für die ToolBar (Pfadname) oder das Edit (Dateiname) bekommen.
    
            Local $hToolBar = ControlGetHandle($hSaveAs, '', '[CLASS:ToolbarWindow32; INSTANCE:4]')
            ConsoleWrite("@@_Debug_line" & @TAB & @TAB & @ScriptLineNumber & "   var: $hToolBar --> " & $hToolBar & @LF)
            ControlSetText($hToolBar, '', '', @ScriptDir) ; Pfad ändern, in dem die Datei gespeichert werden soll.
    
            Local $hEdit = ControlGetHandle($hSaveAs, '', '[CLASS:Edit; INSTANCE:1]')
            ConsoleWrite("@@_Debug_line" & @TAB & @TAB & @ScriptLineNumber & "   var: $hEdit    --> " & $hEdit & @LF)
    
            ControlSetText($hEdit, '', '', 'Test_mit_AutoIt.txt') ; Hier kommt der Dateiname hin.
            Sleep(5000) ; Kleine Pause, damit wir sehen können, ob der Pfad/Name korrekt geändert wurde.
            ControlClick($hSaveAs, '', '[CLASS:Button; INSTANCE:2]') ; Text speichern.
    
            ConsoleWrite('Done...' & @CRLF)
            Sleep(3000)
    
            ; Aufräumen
            If FileExists(@ScriptDir & '\Test_mit_AutoIt.txt') Then FileDelete(@ScriptDir & '\Test_mit_AutoIt.txt') ; Testdatei wieder löschen...
            ProcessClose($iPID) ; Notepad beenden.
        EndIf
    EndFunc   ;==>_Example
    Alles anzeigen

    OK ... das sieht schon mal sehr nice aus. Das Skript läuft auch. Wenn ich allerdings die Befehle in meinem Programm ausprobiere, dann passiert leider nichts. Es gibt z. B. keine Möglichkeit mit STRG irgendwas zu steuern, ich müsste wissen, wie ich die Alt-Taste abfrage, bzw. ansteuere. In der Hilfe von AutoIt hab ich dazu leider nichts gefunden. Mit dem AutoIt Info-Tool bekomme ich zwar die ID von dem Menüpunkt, weiß aber nicht, wie mich das weiter bringt.

    Wo ist das Script eigentlich her? Gibts dafür eine ausführliche Dokumentation?

    VG

  • Programm fernsteuern

    • JBO
    • 5. November 2021 um 12:20
    Zitat von water

    Wenn ich mich richtig erinnere: Das Beispielscript für die Automation von Notepad funktioniert nur mit einem engl. Windows, da der Titel des Fensters sprachabhängig ist.

    Dein Beispiel: autoit.Send ist sicher verkehrt, da dies nur für die ActiveX Version funktioniert. Versuche "Send" bzw. - was ich SEHR empfehle - ist die Automation von Controls also "ControlSend".

    Hallo,

    danke für die Antwort, leider hat mich das bis jetzt auch nicht weiter gebracht. Ich bekomme kein Lebenszeichen von AutoIt in dieses Programm gesetzt -.- Mit SEND oder ControlSend tut sich bis jetzt noch nicht, aber ich muss mir ControlSend noch genauer angucken.

  • Programm fernsteuern

    • JBO
    • 4. November 2021 um 12:17

    Hallo,

    ich möchte ein Tool, was zum Export von Bilddateien genutzt wird, mit AutoIt fernsteuern. Leider funktioniert das Script nur bis zum Start des Programms, danach tut sich leider gar nichts mehr. Auch das Beispielscript zum öffnen von Notepad, in dem eine Textzeile eingegeben wird und sich danach schließt ohne zu speichern, funktioniert auch nur bis zum Programmstart von Notepad, danach ist Funkstille.

    Kann es sein, dass AutoIt unter dem aktuellen Windows (21H2) mit der Programmsteuerung Probleme hat, oder muss ich vlt. irgend etwas aufrufen, was die Steuerung dann ermöglicht? Ich möchte erst einmal Im Programmmenü den Punkt "Record" aufrufen und dort dann "Load All". Das weitere Vorgehen, denke ich, werde ich dann alleine hin bekommen, allerdings muss ich erst mal das Programmfenster richtig ansteuern können.

    Für Hinweise wäre ich sehr dankbar!

    VG

    Mein Code sieht im Moment so aus (die auskommentierten Zeilen sind erfolglose Versuche. Der Send-Befehl funktioniert übrigens auch nicht):

    C
    #include <MsgBoxConstants.au3>
    #include <WinAPIFiles.au3>
    #include <AutoItConstants.au3>
    #include <File.au3>
    #include <Array.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <String.au3>
    
    Global $pHeyexePath = "C:\Studien-Heyexe"
    Global $pExportPath = "C:\Heyex_XML_RAW_Export"
    
    If DirectoryCheck( $pHeyexePath, $pExportPath ) == 0 Then
       MsgBox( $MB_SYSTEMMODAL, "Error", "Heyex not installed" )
       Exit
    EndIf
    
    $sProgramToRun = SelectStudy()
    
    If $sProgramToRun == "0" Then
       MsgBox( $MB_SYSTEMMODAL, "Error", "Please select a study" )
    Else
       $sProgramToRun = StringTrimRight( $sProgramToRun, 22 )
       Run( $sProgramToRun & "\heyex.exe", $sProgramToRun )
       ; WinWaitActive( "Heidelberg Eye Explorer" )
       ; Sleep( 10000 )
       ; WinMenuSelectItem( "Heidelberg Eye Explorer", "", "&Record", "Load All" )
       ; ControlFocus( "Heidelberg Eye Explorer", "Ja", 254 )
       ; WinWaitClose( "Loading Patients" )
       autoit.send( '{ALT}+{R}+{ENTER}' )
    EndIf
    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™