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

Beiträge von Espyre

  • Update Funktion

    • Espyre
    • 31. Januar 2018 um 15:10


    Hi,

    ich habe auf Arbeit den Updater wie folgt umgesetzt:

    - Mitarbeiter erhalten die EXE lokal auf Ihrem Rechner in einem definierten Pfad gespeichert

    - Im Autostart hinterlegen wir unsere Updater.exe. Diese prüft dann in Dauerschleife, ob auf dem Netzlaufwerk eine neue Version vorhanden ist. Dies geschieht mittels _Crypt_HashFile (Hash unterschiedlich = neue Version vorhanden). Sprich, ich vergleiche den Hashwerte der Exe vom Netzlaufwerk mit dem Hashwert der lokalen Exe.

    - Wenn ein Update erforderlich ist, folgt noch ein ProcessExists. Daher weis der Updater, ob er direkt die Datei vom Netzlaufwerk in das lokale Verzeichnis kopieren/überschreiben kann oder er bringt dem Mitarbeiter eine GUI, über die er das Update selbstständig anstoßen kann.

    Ich hoffe das Prinzip ist verständlich.

    Vg

  • DllStructCreate für DllCall

    • Espyre
    • 23. November 2017 um 14:40
    Zitat von BugFix

    EDIT

    Funktioniert dieser Aufruf?

    struct*, $tAccessibleContextInfo soll einen Pointer auf $tAccessibleContextInfo legen.

    Ja, der funktioniert einwandfrei.


    Ich habe für den Test jetzt ein Textfeld anstatt des Buttons genommen. Das Textfeld hat 56 actions.

    AutoIt
    Global Const $MAX_STRING_SIZE   = 1024
    Global Const $SHORT_STRING_SIZE = 256
    Global Const $MAX_ACTION_INFO   = 256
    Global Const $MAX_ACTIONS_TO_DO = 32
    
    Global $tagAccessibleActionInfo = 'wchar name[' & $SHORT_STRING_SIZE & ']'
    
    ; create Byte-Array "actionInfo"
    Global $iSize = DllStructGetSize(DllStructCreate($tagAccessibleActionInfo, 1))
    Global $a_actionInfo[$MAX_ACTION_INFO +1]
    $a_actionInfo[0] = DllStructCreate('byte[' & $iSize *$MAX_ACTION_INFO & "]")
    Global $ptr = DllStructGetPtr($a_actionInfo[0])
    For $i = 0 To $MAX_ACTION_INFO -1
        $a_actionInfo[$i+1] = DllStructCreate($tagAccessibleActionInfo, $ptr + $i*$iSize)
    Next
    
    ; Dll-Call
    ; DllCall($g_hAccessBridgeDll, 'BOOL:cdecl', 'getAccessibleActions','long', $vmId, 'long', $acButton, 'ptr', DllStructGetPtr($a_actionInfo[0]))
    Alles anzeigen

    Dein Beispiel hat anscheinend funktioniert.

    Wenn ich _WinAPI_DisplayStruct($a_actionInfo[0]) ausführe, findet man auch die 56.

    a_actionInfo_0.PNG

    Vielen Dank Bugfix. Ich versuche jetzt deinen Code zu verstehen und mit der Struct weiter zu arbeiten. Damit möchte ich dann im nächsten Schritt eine bestimmte Aktion ausführen.

    Viele Grüße

    Espyre

  • DllStructCreate für DllCall

    • Espyre
    • 22. November 2017 um 10:36

    Danke, der Aufruf führt zumindest zu keinem Fehler. Leider enthält er mMn auch nicht die gewünschten Daten.

    Nach meinem Verständnis sollte bei an Anzahl "1" rauskommen und beim Namen der Aktion "click" oder so ähnlich.

    JavaMonkey2.pngJavaMonkey.png


    Ich hole mal eben aus, wie ich zu den benötigten Daten für den Aufruf komme.

    AutoIt
    Global Const $c_JOBJECT64  = "UINT64"   ;~ JOBJECT64
    Global Const $cP_JOBJECT64 = "UINT64*" ;~ POINTER(JOBJECT64)
    Global $g_hAccessBridgeDll, $vmId, $acParent
    
    ; Ermittelt das Main-Object anhand des Fensterhandles
    Func _JAB_getMainElement($hWnd)
    
        If BitAND(WinGetState($hWnd), 8) = 0 Then
            WinActivate($hWnd)
            WinWaitActive($hWnd)
        EndIf
        
        $sIsJavaWindow = DllCall($g_hAccessBridgeDll, 'BOOL:cdecl', 'isJavaWindow', 'hwnd', $hWnd)
        If @Error <> 0 Or $sIsJavaWindow[0] <> 1 Then Return SetError(-1, 0, 0)
    
        $sAC_fromHwnd = DllCall($g_hAccessBridgeDll, 'BOOL:cdecl', 'getAccessibleContextFromHWND', 'hwnd', $hWnd, 'long*', $vmID, $cP_JOBJECT64, $acParent)
        If @Error <> 0 Then Return SetError(-2, 0, 0)
    
        $vmId     = $sAC_fromHwnd[2]
        $acParent = $sAC_fromHwnd[3]
    EndFunc ;<==/JAB_getMainElement
    Alles anzeigen

    Ich habe bisher zwei Möglichkeiten gefunden, ein Object in der Applikation zu identifizieren. Mit Koordinaten oder über den Tree von JavaMonkey. Die zweite Variante habe ich im Einsatz.

    AutoIt
    ; Mit getAccessibleChildFromContext bis zum gewünschten Objekt
    ; Beispiel: $sElementPfad = '0,1,0,2,0,0'
    ; Den Pfad entnehme ich JavaMonkey (siehe Anhang)
    Func _JAB_GetElement($hWnd, $sElementPfad)
        Local $aPfad      = StringSplit($sElementPfad, ',',2)
        Local $acElements = $acParent
    
        If BitAND(WinGetState($hWnd), 8) = 0 Then
            WinActivate($hWnd)
            WinWaitActive($hWnd)
        EndIf
    
        For $i = 0 To Ubound($aPfad) -1
            $sResult = DllCall($g_hAccessBridgeDll, 'long', 'getAccessibleChildFromContext','long', $vmId, $c_JOBJECT64, $acElements, 'int', Int($aPfad[$i]))
            $acElements = $sResult[0]
        Next
    
        Return $acElements
    EndFunc ;<==/_JAB_GetElement
    
    ; Gibt alle Infos von "getAccessibleContextInfo" als Array zurück
    Func _JAB_GetElementInfo($hWnd, $acElement)
    
        Local $aElementInfo[12][2] = [ _ 
                                        ['name',''], _ 
                                        ['description',''], _ 
                                        ['role',''], _ 
                                        ['role_en_US',''], _ 
                                        ['states',''], _ 
                                        ['states_en_US',''], _ 
                                        ['indexInParent',''], _ 
                                        ['childrenCount',''], _ 
                                        ['x',''], _ 
                                        ['y',''], _ 
                                        ['width',''], _ 
                                        ['height',''] _ 
                                     ]
    
        Local $tagAccessibleContextInfo = "WCHAR name[1024];WCHAR description[1024];WCHAR role[256];WCHAR role_en_US[256];WCHAR states[256];WCHAR states_en_US[256];INT indexInParent;INT childrenCount;INT x;INT y;INT width;INT height;BOOL accessibleComponent;BOOL accessibleAction;BOOL accessibleSelection;BOOL accessibleText;BOOL accessibleInterfaces"
        Local $tAccessibleContextInfo   = DllStructCreate($tagAccessibleContextInfo)
    
        If BitAND(WinGetState($hWnd), 8) = 0 Then
            WinActivate($hWnd)
            WinWaitActive($hWnd)
        EndIf
    
        $sAC_Info = DllCall($g_hAccessBridgeDll, 'BOOL:cdecl', 'getAccessibleContextInfo','long', $vmId, 'long', $acElement, 'struct*', $tAccessibleContextInfo)
        $AccessibleContextInfo = $sAC_Info[3]
        For $i = 0 To Ubound($aElementInfo) -1
            $aElementInfo[$i][1] = DllStructGetData($sAC_Info[3], $aElementInfo[$i][0])
        Next
    
        Return $aElementInfo
    EndFunc ;<==/JAB_GetElementInfo
    
    Liest den Text des Elements aus
    Func _JAB_getValue($hWnd, $acText)
        Local $tagAccessibleTextInfo      = "INT charCount;INT caretIndex;INT indexAtPoint"
        Local $tAccessibleTextInfo        = DllStructCreate($tagAccessibleTextInfo)
        Local $tagAccessibleTextItemsInfo = "WCHAR letter;WCHAR word[256];WCHAR sentence[1024]"
        Local $tAccessibleTextItemsInfo   = DllStructCreate($tagAccessibleTextItemsInfo)
        Local $sText
    
        If BitAND(WinGetState($hWnd), 8) = 0 Then
            WinActivate($hWnd)
            WinWaitActive($hWnd)
        EndIf
    
        $bCall = DllCall($g_hAccessBridgeDll, 'BOOL:cdecl', 'getAccessibleTextInfo','long', $vmId, 'long', $acText, 'struct*', $tAccessibleTextInfo)
        $iCharCount = DllStructGetData($tAccessibleTextInfo, 'charCount')
    
        For $i = 0 To $iCharCount - 1
            DllCall($g_hAccessBridgeDll, 'BOOL:cdecl', 'getAccessibleTextItems','long', $vmId, 'long', $acText, 'struct*', $tAccessibleTextItemsInfo, 'int', $i)
            $sText &= DllStructGetData($tAccessibleTextItemsInfo, 'letter')
        Next
    
        Return $sText
    EndFunc ;<==/JAB_getValue
    Alles anzeigen

    Ich hoffe die Informationen helfen weiter.

    Da ich noch relativ unerfahren mit DllCalls bin, kann natürlich auch eine falsche Interpretation meinerseits der Fehler sein :)

    Danke und viele Grüße

    Espyre

  • DllStructCreate für DllCall

    • Espyre
    • 21. November 2017 um 15:30

    Hallo zusammen,

    ich versuche seit einigen Tagen die Struktur in AutoIt für einen DllCall abzubilden.

    C
    BOOL getAccessibleActions(long vmID, AccessibleContext accessibleContext, AccessibleActions *actions)
    
    /**
    ******************************************************
    *  AccessibleAction packages
    ******************************************************
    */
    #define MAX_STRING_SIZE   1024
    #define SHORT_STRING_SIZE   256
    #define MAX_ACTION_INFO 256
    #define MAX_ACTIONS_TO_DO 32
    
    
    // an action assocated with a component
    typedef struct AccessibleActionInfoTag {
    wchar_t name[SHORT_STRING_SIZE];	// action name
    } AccessibleActionInfo;
    
    // all of the actions associated with a component
    typedef struct AccessibleActionsTag {
    jint actionsCount;		// number of actions
    AccessibleActionInfo actionInfo[MAX_ACTION_INFO];	// the action information
    } AccessibleActions;
    
    // struct for requesting the actions associated with a component
    typedef struct GetAccessibleActionsPackageTag {
    long vmID;
    JOBJECT64 accessibleContext;					// the component
    AccessibleActions rAccessibleActions;		// the actions
    } GetAccessibleActionsPackage;
    
    /**
    Alles anzeigen

    Meine bisherigen Versuche sehen wie folgt aus:

    AutoIt
    ; Variante 1
    Local $tAccessibleActionName   = DllStructCreate('WCHAR name[256]')
    Local $ptrAccessibleActionName = DllStructGetPtr($tAccessibleActionName)
    Local $tAccessibleActions      = DllStructCreate('INT actionsCount;PTR actionInfo')
    DllStructSetData($tAccessibleActions, 'actionInfo', $ptrAccessibleActionName)
    DllCall($g_hAccessBridgeDll, 'BOOL:cdecl', 'getAccessibleActions','long', $vmId, 'long', $acButton, 'struct*', $tAccessibleActions)
    
    ; Variante 2
    Local $tagAccessibleActions    = "INT actionsCount;WCHAR name[256];"
    Local $tAccessibleActions      = DllStructCreate($tagAccessibleActions)
    DllCall($g_hAccessBridgeDll, 'BOOL:cdecl', 'getAccessibleActions','long', $vmId, 'long', $acButton, 'struct*', $tAccessibleActions)
      
    ; Variante 3
    DllCall($g_hAccessBridgeDll, 'BOOL:cdecl', 'getAccessibleActions','long', $vmId, 'long', $acButton, 'struct', DllStructCreate('int actionsCount;WCHAR name[256]'))
    Alles anzeigen

    Alle Varianten führten bisher zum Absturz des Scriptes.

    Mit "long vmID" und "AccessibleContext accessibleContext" kann ich ohne Probleme die Element-Info's auslesen (z.B. Name, Rolle etc.). Somit schließe ich diese Parameter als Fehlerquelle aus.

    Danke und viele Grüße

    Espyre

  • WinWait Funktion: Welcher Teil des Titels wird ausgelesen?

    • Espyre
    • 12. April 2017 um 15:57

    Um nur einen Teil des Fenstertitels nutzen zu können benötigst du :
    Opt("WinTitleMatchMode", 2) ; 1=vom Anfang, 2=enthält, 3=genau, 4=fortgeschritten, -1 bis -4=Groß-/Klein ignorieren

  • Einlesen von riesigen Excel Tabellen

    • Espyre
    • 26. Januar 2017 um 13:48

    Du solltest unbedingt updaten.

    In der aktuellen Version der Excel-UDF gibt es die Funktion _Excel_RangeRead.
    Diese ist um ein vielfaches schneller als _ExcelReadSheetToArray.

  • Sparen (erledigt)

    • Espyre
    • 21. November 2016 um 08:24
    Zitat von autoBert

    was meinst du was nach 1/2 Jahr Laufzeit anfällt, da ist ja noch nicht einmal die Abschlußprovision komplett einbezahlt. Es geht darum das lt, meiner Quelle keiner der Erben den Vertrag fortführen darf, war mir zwar auch neu, aber meiner Quelle vertraue ich (noch). Das eingezahlte Geld geht also für die Provision drauf, richtig freuen hätte sich der Bankberater nur dann dürfen, wenn seine Abschlußprovision schon komplett gedeckt gewesen wäre.Aber wenn du mir den Link heraussuchst, lasse ich mich auch gerne vom Gegenteil überzeugen.

    mfg (auto)Bert

    https://www.fmh.de/bausparen-bauf…-wissen-sollten

  • If not Fileexists Then

    • Espyre
    • 1. August 2016 um 14:21
    AutoIt
    Func Arbeitet()
    	While 1
    		If FileExists($DirArbeitet) = 0 Then
    			FileWrite($DirArbeitet, "")
    			Return
    		EndIf
    	WEnd
    EndFunc
    
    
    Func Fertig()
    	FileDelete($DirArbeitet)
    EndFunc
    Alles anzeigen

    Probier mal If FileExits($DirArbeitet) = 0
    Hatte in einem meiner Scripte das Selbe Problem. Seitdem ich auf "Not" verzichte läuft es einwandfrei.

  • Datei gegen Zugriff von anderer Seite sperren

    • Espyre
    • 7. Juli 2016 um 10:28
    Zitat von DOheim

    Der Vorschlag von Oscar erscheint mir insofern problematisch, dass wenn das Programm aus irgendeinem Grund abbricht bevor die Semaphorendatei geschlossen wird, dann bleibt sie "hängen" und blockiert alles weitere.

    Schau dir mal "OnAutoItExitRegister" an ;)

  • _IEcreate Anomalie

    • Espyre
    • 20. Juni 2016 um 11:59

    _IECreate in einer Schleife aufrufen. Sobald keine Fehlermeldung von _IECreate erfolgt die Schleife verlassen.

  • Hauptanzeige unter Windows 10 ermitteln

    • Espyre
    • 4. Mai 2016 um 16:45

    Schau dir mal in der Hilfe _WinAPI_GetMonitorInfo() an.

  • Notifications UDF - Desktop Benachrichtigungen 1.2 (Update 1. Mai)

    • Espyre
    • 26. April 2016 um 15:11

    Sieht gut aus, danke fürs Teilen

  • In eigener Sache - Netiquette

    • Espyre
    • 11. April 2016 um 08:56

    :thumbup::klatschen:

  • Outlook Mail-Retoure auslesen

    • Espyre
    • 29. Januar 2016 um 09:41

    Alina: Das Array diente nur zur Veranschaulichung. Habe ich mit _OL_ItemGet($oOutlook, $oItem, Default) erstellt.
    $Body = $oItem.Body (Zeile 7) ist der Befehl vom Originalscript.

    water: Vielen Dank für den Hinweis mit der MessageClass. Auch deine Links haben mir sehr geholfen.

    für Interessierte ein Auszug:

    Spoiler anzeigen

    NDR und Sprache

    Die unzustellbarkeit wird per Default immer in der Sprache installiert, in der der Server installiert ist. Das mag nett sein, wenn Sie selbst intern unzustellbarkeiten erhalten, aber ist im internationalen Gebrauch nur bedingt nutzbar. Besonders problematisch wird dies, wenn Sie z.B. einen japanischen Server installiert haben. Dessen unzustellbarkeitsmeldungen sind für nicht Japaner schwer zu verstehen. Daher gibt es auch einen TechNet Artikel, wie einem japanischen Server eine englische Fehlermeldung abzuringen ist:

  • Outlook Mail-Retoure auslesen

    • Espyre
    • 28. Januar 2016 um 08:06

    SenderEmailAddress und ReceivedTime ist leer, da ja die Mail nicht direkt vom Empfänger zurückkommt.

    Daher würde ich den Body auslesen, da dort alle Informationen enthalten sind. Wie im Array ersichtlich ist, besteht der Body nur aus chinesischen Schriftzeichen. Habe leider noch keine Möglichkeit gefunden, den Body so auszulesen, damit ich ihn weiter verarbeiten kann.

    Lg
    Espyre

  • Outlook Mail-Retoure auslesen

    • Espyre
    • 27. Januar 2016 um 10:22

    Hallo zusammen,

    ich benötige Hilfe beim Auslesen von E-Mails.

    Anbei meine bisherige Funktion:

    Spoiler anzeigen
    AutoIt
    Func _m_readMails_getData($oOutlook, $oNamespace, $oItem, $Postfach, $Folder)
    	Local $hFile, $aFolder
        Local $aDocuments[1]
    	;----------------------------------------------------------------------------------------------/
        ; Body auslesenund als .txt speichern
        ;----------------------------------------------------------------------------------------------/
        $Body = $oItem.Body
        $hFile = FileOpen($Daten('Speicherort') & 'Body.txt', 10)
        FileWrite($hFile, $Body)
        FileClose($hFile)
        $aDocuments[0] = $Daten('Speicherort') & 'Body.txt'
        $Daten('Mailtext', $Body, 'set')
        ;----------------------------------------------------------------------------------------------/
        ; Folder-Object auslesen
        ;----------------------------------------------------------------------------------------------/
        $aFolder = _OL_FolderAccess($oOutlook, $Postfach & '\' & $Folder)
        ;----------------------------------------------------------------------------------------------/
        ; EntryID auslesen
        ;----------------------------------------------------------------------------------------------/
        $Daten('EntryID', $oItem.EntryID, 'set')
        ;----------------------------------------------------------------------------------------------/
        ; Betreff
        ;----------------------------------------------------------------------------------------------/
        $Daten('Betreff', $oItem.Subject, 'set')
        ;----------------------------------------------------------------------------------------------/
        ; Prüfung, ob eine Mailretoure vorliegt
        ;----------------------------------------------------------------------------------------------/
        If StringInStr($Daten('Betreff'), 'Unzustellbar') Then
            ; Empfänger Mail-Adresse auslesen
            ; Eingangsdatum auslesen
        Else
            ;----------------------------------------------------------------------------------------------/
            ; Eingangsdatum
            ;----------------------------------------------------------------------------------------------/
            $Eingangsdatum = StringRegExpReplace($oItem.ReceivedTime, '\A(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})\z', '$1-$2-$3 $4:$5:$6')
            $Daten('Eingangsdatum', $Eingangsdatum, 'set')
            ;----------------------------------------------------------------------------------------------/
            ; Absender
            ;----------------------------------------------------------------------------------------------/
            $Daten('Absender', $oItem.SenderEmailAddress, 'set')
        EndIf
        ;----------------------------------------------------------------------------------------------/
        ; Falls Anhänge vorhanden sind, werden diese gespeichert
        ;----------------------------------------------------------------------------------------------/
        $aAnhaenge = _OL_ItemAttachmentGet($oOutlook, $oItem,$aFolder[1])
        If Not @Error Then 
            For $i = 1 To $aAnhaenge[0][0]
                $resSave = _OL_ItemAttachmentSave($oOutlook,$oItem,$aFolder[1],$i,$Daten('Speicherort'))
                $Dateipfad = $Daten('Speicherort') & StringRegExpReplace($aAnhaenge[$i][2], '[ \/:*?"<>|]', '_') ;Dateinamen werden entsprechend der OutlookEX.au3 abgeändert
                Redim $aDocuments[UBound($aDocuments)+1]
                $aDocuments[$i] = $Dateipfad
            Next
        EndIf
        Return $aDocuments
    EndFunc ;<==/m_readMails_getData
    Alles anzeigen

    Falls eine Mail unzustellbar ist, kann ich diese Rückmeldung nicht korrekt auslesen. (siehe Anhang)

    Wie muss ich den Body auslesen, damit ich mir die Empfänger-Adresse und das Eingangsdatum der Mailretoure mit StringRegEx ziehen kann?

    Viele Grüße
    Espyre

    Mail_unzustellbar.jpg
    Result _OL_ItemGet.jpg

  • Messagebox default

    • Espyre
    • 15. Januar 2016 um 13:52
    AutoIt
    $button = MsgBox (1 , "Weiter", "Text" & @TAB & "Text" & @CRLF & @CRLF & "Text" & @CRLF & @CRLF, 3)
    ConsoleWrite('@@@ Debug line #40' & '  var: $button --> ' & $button & @CRLF)
    Switch $button
        Case 1, -1
            ConsoleWrite("Button 1 - o.k." & @CRLF)
        Case 2
            ConsoleWrite("Button 2 - abbrechen" & @CRLF)
            Exit
    EndSwitch

    Wenn der Timeout überschritten ist bekomme ich "-1" zurück.

  • SQLite Grundsatzfragen für AnfängerX

    • Espyre
    • 20. November 2015 um 11:39
    Zitat von Alina

    Moin Moin zum Wochenende hin.
    .
    Ich denke das viele genau das gleiche Problem haben wie ich, wenn es um Datenbanken geht.
    Deshalb habe ich mir überlegt hier einfach mal ein Thema auf zu machen. Sinn soll es sein, das Jeder nach und nach mehr über SQL lernt.
    ...


    Für mich als Anfänger war es sehr hilfreich Tools zu nutzen, die mich im Umgang mit einer Datenbank unterstützen.

    SQLite:
    SQLite Studio

    MySQL:
    Heidi SQL

  • Ultraedit - Fenster lokalisieren

    • Espyre
    • 6. Oktober 2015 um 14:26
    AutoIt
    #include <WinAPI.au3>
    Opt("WinTitleMatchMode", 2)
    
    
    $aWinlist = WinList('Ultraedit')
    
    
    For $i = 0 To Ubound($aWinlist) -1
    ConsoleWrite(_WinAPI_GetClassName($aWinlist[$i][1]) & @CRLF)
    Next
  • 4ern_SomeMore_GUI UDF

    • Espyre
    • 25. Juni 2015 um 15:49

    Unter Win 8.1 AutoIt 3.3.12.0 gestestet -> läuft einwandfrei

    Danke für die UDF

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™