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

  • Dateipfad der im Windowsexplorer markierten Datei auslesen

    • BugFix
    • 22. September 2021 um 12:16
    Zitat von BugFix

    Bitte beachten:

    Diese Funktion setzt voraus, dass der Datei Explorer im Moment der Abfrage das aktive Fenster ist. Den Aufruf müsstest Du dann z. B. auf einen Hotkey legen in einem AutoIt Skript, das im Hintergrund dümpelt. ;)

    Hier mal noch eine Version, in der der Datei-Explorer nicht aktiv sein muss! Es wird das topmost Explorerfenster verwendet:

    EDIT: Eine Besonderheit von Windows muss man aber selbst beachten. Hat man im Explorerfenster im Tree einen Bibliotheksnamen ausgewählt, liefert Windows nicht den Speicherpfad, da es sich hier um eine Verlinkung handelt. Man bekommt stattdessen einen Leerstring. Hat man die Standardoption mit Ordneranzeige gewählt, erhält man dann einen Backslash und Dateinamen. Wählt man jedoch im Tree den unterhalb des Bibliotheksnamens stehenden Ordner, läuft alles wie gewollt.

    AutoIt: _GetSelectionFromTopMostExplorer.au3
    ; #FUNCTION# ====================================================================================================================
    ; Name ..........: _GetSelectionFromTopMostExplorer
    ; Description ...: Gets an array with selected files from the top most explorer window
    ; Syntax ........: _GetSelectionFromTopMostExplorer([$_bDir = True])
    ; Parameters ....: $_bDir    - [optional] Returns the full path (Default 'True'). With 'False' will only the filename returned.
    ; Return values .: Array with selected files. Counter at $ar[0]
    ; Requires.......: _GetTopmostHwndFromProcess()
    ; Author ........: BugFix
    ; ===============================================================================================================================
    Func _GetSelectionFromTopMostExplorer($_bDir=True)
        Local $oShell = ObjCreate("Shell.Application")
        Local $oIE, $sPath = '', $oShellWindows = $oShell.Windows
        Local $oDoc, $bIE = False, $oFV
        For $i = 0 To $oShellWindows.Count -1  ; all opened explorer and internet explorer windows
            $oIE = $oShellWindows($i)
            $oDoc = $oIE.Document
            If _GetTopmostHwndFromProcess('explorer.exe', 'CabinetWClass') = $oIE.Hwnd Then
                If StringRegExp(ObjName($oDoc), "IShellFolderViewDual.") Then       ; be sure it's the explorer object
                    $sPath =StringReplace(StringReplace(StringTrimLeft($oIE.LocationURL, 8), '%20', ' '), '/', '\') ; extract windows path from file-url
                    $bIE = True   ; flag: found explorer
                EndIf
            EndIf
        Next
        Local $aSelection[500] = [0]
        If $bIE Then
            $oFV = $oIE.Document             ; File-Browser (ShellFolderView)
            If Not $_bDir Then $sPath = ''
            For $oFI In $oFV.SelectedItems   ; selected elements there
                $aSelection[0] += 1
                If $aSelection[0] > UBound($aSelection) Then ReDim $aSelection[UBound($aSelection) +500]
                $aSelection[$aSelection[0]] = StringFormat('%s%s%s',  $sPath, ($_bDir ? '\' : ''), $oFI.Name)
            Next
        EndIf
        If $aSelection[0] = 0 Then
            ReDim $aSelection[1]
        Else
            ReDim $aSelection[$aSelection[0]+1]
        EndIf
        Return $aSelection
    EndFunc  ;==>_GetSelectionFromTopMostExplorer
    
    
    
    ; #FUNCTION# ====================================================================================================================
    ; Name ..........: _GetTopmostHwndFromProcess
    ; Description ...: Returns the handle of the top most window of a specific process
    ; Syntax ........: _GetTopmostHwndFromProcess($_vProcess)
    ; Parameters ....: $_vProcess           The Process name or PID
    ;                  $_sClass             The classname of windows that will created by the specific process
    ; Return values .: Success              The handle of the top most window
    ;                  Failure              0, set @error = 1 (process does not exists)
    ;                                              @error = 2 (there is no window for this)
    ; Author ........: BugFix
    ; ===============================================================================================================================
    Func _GetTopmostHwndFromProcess($_vProcess, $_sClass)
        Local $aProc[2][2] = [[1],['',$_vProcess]]
        If IsString($_vProcess) Then
            $aProc = ProcessList($_vProcess)
            If $aProc[0][0] = 0 Then
                Return SetError(1,0,0)
            EndIf
        Else
            If Not ProcessExists($_vProcess) Then Return SetError(1,0,0)
        EndIf
        Local $hWnd = 0, $aWin =  WinList('[CLASS:' & $_sClass & ']')
        If $aWin[0][0] = 0 Then Return SetError(2,0,0)
        Local $tPID = DllStructCreate("int PID")
        ; check only the first window, has highest z-order
        For $i = 1 To $aProc[0][0]
            DllCall("user32.dll", "int", "GetWindowThreadProcessId", "hwnd", $aWin[1][1], "ptr", DllStructGetPtr($tPID))
            If $tPID.PID = $aProc[$i][1] Then Return $aWin[1][1]
        Next
        Return 0
    EndFunc  ;==>_GetTopmostHwndFromProcess
    Alles anzeigen

    Dateien

    _GetSelectionFromTopMostExplorer.au3 3,93 kB – 459 Downloads
  • sql Einlesen einer Dateistruktur, wie gelöschte Dateien ermitteln?

    • BugFix
    • 22. September 2021 um 09:51
    Zitat von Concara

    Das kann ich sicher noch in einem anderen Projekt gebrauchen.

    Ich hatte mir vor etlicher Zeit mal Möglichkeiten zum Erstellen von GUID zusammengesucht, vielleicht kannst du das auch brauchen:

    AutoIt
    Func _GUID_OLE32() ; = _WinAPI_CreateGUID()
        Local $tGUID = DllStructCreate("struct;ulong Data1;ushort Data2;ushort Data3;byte Data4[8];endstruct")
        Local $aReturn = DllCall('ole32.dll', 'long', 'CoCreateGuid', 'struct*', $tGUID)
        $aReturn = DllCall('ole32.dll', 'int', 'StringFromGUID2', 'struct*', $tGUID, 'wstr', '', 'int', 65536)
        Return $aReturn[2]
    EndFunc  ;==>_GUID_OLE32
    
    Func _GUID_RPCRT4($_bWSTR=True)
        Local $tGUID = DllStructCreate('ulong Data1;ushort Data2;ushort Data3;char Data4[8]')
        Local $aReturn = DllCall('RPCRT4.dll', 'int', 'UuidCreate', 'ptr', DllStructGetPtr($tGUID))
        $aReturn = DllCall('RPCRT4.dll', 'int', ($_bWSTR ? 'UuidToStringW' : 'UuidToString'), _
                            'ptr', $aReturn[1], ($_bWSTR ? 'wstr*' : 'str*'), Null)
        Return StringFormat('{%s}', StringUpper($aReturn[2]))
    EndFunc  ;==>_GUID_RPCRT4
    
    Func _GUID_TypeLib()
        Return ObjCreate("Scriptlet.TypeLib").GUID
    EndFunc  ;==>_GUID_TypeLib
    
    ConsoleWrite('_GUID_OLE32        ' & @TAB & _GUID_OLE32() & @CRLF)
    ConsoleWrite('_GUID_RPCRT4 (str) ' & @TAB & _GUID_RPCRT4(False) & @CRLF)
    ConsoleWrite('_GUID_RPCRT4 (wstr)' & @TAB & _GUID_RPCRT4() & @CRLF)
    ConsoleWrite('_GUID_TypeLib      ' & @TAB & _GUID_TypeLib() & @CRLF)
    Alles anzeigen
  • sql Einlesen einer Dateistruktur, wie gelöschte Dateien ermitteln?

    • BugFix
    • 21. September 2021 um 18:40
    Zitat von Concara

    Damit alles möglichst platzsparend ist, habe ich in der Datentabelle (IndexDB) einen Unique Index erstellt der verhindert, dass beim erneuten Einlesen die Daten mehrfach in die Tabelle geschrieben wird.

    Also Neue werden in die Tabelle geschrieben.

    Folgendes Szenario:

    • Dateiname: "Ich-bin-eine-Datei.txt"

    • Datei wird gelöscht

    • Datei wird irgendwann mit selbem Namen neu erstellt

    Obwohl sie jetzt existiert und auch nichts mit der ersten Existenz der Datei zu tun hat, wird sie nicht erfasst. Eine Indexierung nur über den Namen ist somit fehleranfällig. Eine Kombination von Namen und Erstellungszeitpunkt, gespeichert unter einer GUID (z.B. mit _WinAPI_UniqueHardwareID) könnte hier Eindeutigkeit schaffen.

    Statt WinAPI kannst Du auch TypeLib nutzen:

    AutoIt
    Func _GUID_TypeLib()
        Local $oTypeLib = ObjCreate("Scriptlet.TypeLib")
        Return $oTypeLib.GUID
    EndFunc  ;==>_GUID_TypeLib
  • Info Eintrag BugTracker

    • BugFix
    • 21. September 2021 um 10:21

    :thumbup:

    Problem wird gelöst: Fixed by revision [12590] in version: 3.3.15.5

  • Modbus TCP geht nur bei SlaveID =1

    • BugFix
    • 15. September 2021 um 15:24
    Zitat von autoit_dau

    hier geht dann gar nichts mehr - Skript bleibt hängen.

    Dann solltest du uns vielleicht mal das Skript zeigen... :whistling:

    Unsere :Glaskugel: sind gerade in der Wartung.

  • emulierte Tastatureingabe eines RFID-Scanners in Variable schreiben

    • BugFix
    • 15. September 2021 um 15:18
    Zitat von hipfzwirgel

    Da es sich dabei ja um "Personaldaten" handelt, möchte ich nun in meinem Proggi diese emulierte Tastatureingabe direkt in eine Variable schreiben ohne das jemand der vor dem Rechner steht da etwas mitlesen kann.

    Zitat von hipfzwirgel

    Eine Inputbox ist also ausgeschlossen.

    Nein.

    Ich vermute, dass diese Übertragung den Fokus in einem editierbaren Control (Input, Edit) erfordert.

    Verwende ein Input mit Style: $ES_PASSWORD.

  • Kleines AutoIt-Capture Programm

    • BugFix
    • 14. September 2021 um 19:03
    Zitat von Bitnugger

    _SetHotkey funktioniert nicht, wenn PRINTSCREEN bereits von einer anderen Anwendung gesetzt wurde...

    Mal als Idee (völlig ungetestet):

    GUI mit 1x1 Pixel Größe OnTop in eine Ecke setzen und mit GuiSetAcceletator arbeiten, dann gibt es keine Hotkey-Probleme.

  • Info Eintrag BugTracker

    • BugFix
    • 14. September 2021 um 13:33

    Zur Info für euch: Ich habe einen Eintrag im Bugtracker erstellt.

  • Kleines AutoIt-Capture Programm

    • BugFix
    • 13. September 2021 um 21:17
    Zitat

    DllStructGetData($tRECT, "Top")

    Wenn die Strukturen Variablen mit Alias enthalten, finde ich diese Darstellung übersichtlicher:

    AutoIt
    $tRECT.Top
  • UDF mit interner GUI-Verabeitung für GuiGetMsg- und OnEvent-Mode einsatzfähig -- wie macht ihr es?

    • BugFix
    • 1. September 2021 um 10:39

    Bei UDF's möchte man ja erreichen, dass möglichst viel in den UDF-Funktionen abläuft und der User dort nicht aktiv werden muss.

    Bei Verwendung von grafischen Oberflächen erspart einem der OnEvent-Mode oft viel Schreibarbeit, einige Dinge lassen sich auch nur sinnvoll mit dem OnEvent-Mode lösen.

    Nun kann ich ich natürlich festlegen: Anwendung dieser UDF ausschließlich im OnEvent-Mode.

    Oder der User muss mir die Events zum Prüfen in die UDF weiterleiten (so, wie in meinem Bsp. unten).

    Eine Möglichkeit wäre wohl auch, dass ich mich direkt in den Nachrichtenstrom des Userfensters einklinke und darüber auswerte. Wie handhabt ihr das so?

    Hier mein Funktionsbeispiel

    Die UDF:

    AutoIt: guimsg_event.au3
     
    Global Const $_GREEN  = 0x22B14C
    Global Const $_YELLOW = 0xFFF200
    Global Const $_RED    = 0xED1C24
    
    Global $aCtrl[1][2] = [[0]] ; [0][0]=Zähler, [n][0]=ID / [n][1]=Farbstatus  (0=grün, 1=gelb, 2=rot)
    
    Func _MyButtonLabel($hWnd, $sText, $iX, $iY, $iW=Default, $iH=Default)
        GUISwitch($hWnd)
        Local $iID = GUICtrlCreateLabel($sText, $iX, $iY, $iW, $iH, BitOR(0x01, 0x0200)) ; CENTER + CENTERIMAGE
        GUICtrlSetBkColor(-1, $_GREEN)
        __AddID($iID)
        If Opt("GUIOnEventMode") = 1 Then
            GUICtrlSetOnEvent(-1, _MyButtonLabelClick_OnEvent)
        EndIf
        Return $iID
    EndFunc
    
    
    Func _MyButtonLabelClick_OnEvent()
        Local $Index = __GetIndex(@GUI_CtrlId)
        If $Index = -1 Then Return
        ConsoleWrite('OnEvent - Mode' & @CRLF)
        __ChangeLabelColor($Index)
    EndFunc
    
    Func _MyButtonLabelClick_GetMsg($iMsg)
        Local $Index = __GetIndex($iMsg)
        If $Index = -1 Then Return
        ConsoleWrite('GuiGetMsg - Mode' & @CRLF)
        __ChangeLabelColor($Index)
    EndFunc
    
    Func __ChangeLabelColor($iIndex)
        Local Static $aColor[] = [$_GREEN, $_YELLOW, $_RED]
        $aCtrl[$iIndex][1] += 1
        If $aCtrl[$iIndex][1] = 3 Then $aCtrl[$iIndex][1] = 0
        GUICtrlSetBkColor($aCtrl[$iIndex][0], $aColor[$aCtrl[$iIndex][1]])
    EndFunc
    
    
    Func __AddID($_ID)
        $aCtrl[0][0] += 1
        ReDim $aCtrl[$aCtrl[0][0]+1][2]
        $aCtrl[$aCtrl[0][0]][0] = $_ID
        $aCtrl[$aCtrl[0][0]][1] = 0
    EndFunc
    
    Func __GetIndex($_ID)
        If $aCtrl[0][0] = 0 Then Return -1
        For $i = 1 To $aCtrl[0][0]
            If $aCtrl[$i][0] = $_ID Then Return $i
        Next
        Return -1
    EndFunc
    Alles anzeigen

    Die Anwendung:

    AutoIt: test_msg_evt.au3
    #include 'guimsg_event.au3'
    
    _Example_GuiGetMsg()
    
    _Example_OnEvent()
    
    
    Func _Example_GuiGetMsg()
        Local $hGui = GUICreate('Test GuiGetMsg')
        _MyButtonLabel($hGui, 'Button 1', 20, 20, 80, 30)
        _MyButtonLabel($hGui, 'Button 2', 120, 20, 80, 30)
        _MyButtonLabel($hGui, 'Button 3', 20, 60, 80, 30)
        _MyButtonLabel($hGui, 'Button 4', 120, 60, 80, 30)
    
        GUISetState()
    
        Local $iMsg
        While True
            $iMsg = GUIGetMsg()
            _MyButtonLabelClick_GetMsg($iMsg)
            If $iMsg = -3 Then ExitLoop
        WEnd
    EndFunc
    
    Func _Example_OnEvent()
        Opt('GUIOnEventMode', 1)
        Local $hGui = GUICreate('Test OnEvent')
        GUISetOnEvent(-3, _Exit)
        _MyButtonLabel($hGui, 'Button 1', 20, 20, 80, 30)
        _MyButtonLabel($hGui, 'Button 2', 120, 20, 80, 30)
        _MyButtonLabel($hGui, 'Button 3', 20, 60, 80, 30)
        _MyButtonLabel($hGui, 'Button 4', 120, 60, 80, 30)
    
        GUISetState()
    
        While True
            Sleep(50)
        WEnd
    EndFunc
    
    Func _Exit()
        Exit
    EndFunc
    Alles anzeigen
  • Wie markiere ich den ersten von mehreren identischen Begriffen in einer Excel- bzw. Textdatei - mit Regex, AutoIT?

    • BugFix
    • 31. August 2021 um 16:30

    Auch wenn wir jetzt etwas in OT abdriften (der TE möge es uns verzeihen) zeigt sich gerade bei großen Softwarepaketen die 80:20 Regel:

    80% der User nutzen nur 20% des Softwareumfangs - was i.d.R. aber daran liegt, dass das Können der Software nicht auf die Anforderungen der Firma abgestimmt ist (werden kann).

    Woraus aber auch der Umkehrschluss resultiert, dass die Programmierer 80% der Softwareleistung für'n Ar.. erstellen. Was für eine Verschwendung von Ressourcen. :Face:

    Darum Augen auf beim Softwarekauf!

    Unser Warenwirtschaftssystem (oder muss ich jetzt neudeutsch auch CRM sagen? <X ) habe ich selbst aussuchen dürfen. Es ist jetzt über 20 Jahre alt und läuft genauso frisch, wie am ersten Tag. Da gibt es keinen großen Schnickschnack. Nur die Basisfunktionen. Aber wenn ich was erweitern will, habe ich Zugriff auf ein internes Basic-System und natürlich auf die SQL-Schnittstelle. Der einzige Nachteil, ich muss eine Hardware vorhalten, die noch Windows 2000 Server kann. Aber das war bis jetzt kein größeres Hindernis. Und da das System in einem Intranet läuft, können mir zum Glück irgendwelche Sicherheitslücken der letzten 20 Jahre aber sowas von egal sein. :D

  • Rangierwagenheber kaufen?

    • BugFix
    • 30. August 2021 um 21:52
    Zitat von Xorianator

    In ein paar Tagen gibt's hier vielleicht auch Rangierwagenheber im Angebot :D

    Achja, die Rangierwagenheber-Lobby - wie konnte ich die vergessen. :D

  • Rangierwagenheber kaufen?

    • BugFix
    • 30. August 2021 um 21:14

    Ist ein Troll. Kein Mensch, der es schafft sich in einem Forum anzumelden, ist auf der anderen Seite unfähig herauszufinden, was man online wo kaufen kann und wo man Testberichte findet.

  • Dateipfad der im Windowsexplorer markierten Datei auslesen

    • BugFix
    • 28. August 2021 um 08:36
    Zitat von Schleifchen

    Danke, schau ich morgen an...

    Stefan

    Bitte beachten:

    Diese Funktion setzt voraus, dass der Datei Explorer im Moment der Abfrage das aktive Fenster ist. Den Aufruf müsstest Du dann z. B. auf einen Hotkey legen in einem AutoIt Skript, das im Hintergrund dümpelt. ;)

  • Dateipfad der im Windowsexplorer markierten Datei auslesen

    • BugFix
    • 27. August 2021 um 23:17

    Habe ich vor langer Zeit mal erstellt:

    AutoIt
    ;===============================================================================
    ; Function Name....: _ActiveExplorer_GetSelected
    ; Description......: Erstellt ein Array mit
    ;                    - Anzahl der markierten Dateien/Ordner
    ;                    - dem Pfad des aktiven Explorerfensters und
    ;                    - dem/den Pfad/en der markiert/en Datei/en /Ordner
    ; Parameter(s).....: keine
    ; Requirement(s)...: offenes Explorerfenster
    ; Return Value(s)..: Array mit den Daten, $a[0] = Anzahl, $a[1] = Ordnerpfad, $a[2..] = Datei/Ordnername
    ; .................: ACHTUNG! Letzter Index somit $a[0]+1 !!
    ; Author(s)........: BugFix ( bugfix@autoit.de )
    ;===============================================================================
    ;===============================================================================
    ; Function Name....: _ActiveExplorer_GetSelected
    ; Description......: Creates an array with
    ;                    - Count of selected files/folder
    ;                    - Path of active Explorer window and
    ;                    - the path/es of selected file/s /folder
    ; Requirement(s)...: Opened Explorer window
    ; Return Value(s)..: Array with data, $a[0] = Count, $a[1] = Folderpath, $a[2..] = File/Foldername
    ; .................: ATTENTION! Last index $a[0]+1 !!
    ; Author(s)........: BugFix ( AutoIt@bug-fix.info )
    ;===============================================================================
    Func _ActiveExplorer_GetSelected()
        Local $oShell = ObjCreate("Shell.Application")
        Local $oExplorer, $sPath, $oFolderView, $iCount = 0, $sSelectedFiles = '', $n = 2
        Local $oShellWindows = $oShell.Windows
        For $i = 0 To $oShellWindows.Count -1
            $oExplorer = $oShellWindows($i)
            $sPath = StringReplace(StringReplace(StringTrimLeft($oExplorer.LocationURL, 8), '%20', ' '), '/', '\')
            If WinGetTitle('[ACTIVE]') = $sPath Then ExitLoop
        Next
        $oFolderView = $oExplorer.Document.SelectedItems()
        $iCount = $oFolderView.Count
        Local $aOut[$iCount +2]
        $aOut[0] = $iCount
        $aOut[1] = $sPath
        If $iCount = 0 Then
            Return ''
        Else
            For $oFolderItem In $oFolderView
                $aOut[$n] = $oFolderItem.Name
                $n += 1
            Next
            Return $aOut
        EndIf
    EndFunc  ; ==>_ActiveExplorer_GetSelected
    Alles anzeigen
  • Denkanstoß gesucht.

    • BugFix
    • 25. August 2021 um 17:46
    Zitat von Jos

    Haben Sie ein Beispiel für ein Codenippet, das zeigt, was Sie möchten?

    I have written this code:

    AutoIt
    Global $bla = 6
    If $bla = 5 Then _
        Exit

    If you run Tidy, it adds one more TAB:

    AutoIt
    Global $bla = 6
    If $bla = 5 Then _
            Exit

    Or it kills leading spaces,

    before Tidy:

    AutoIt
    _FunctionCall()
        ; Comment with indentation for better visibility

    after:

    AutoIt
    _FunctionCall()
    ; Comment with indentation for better visibility

    There may be some Tidy settings to change this behavior. But I didn't search extra, because it's no extra effort for me to write correctly formatted right away.

  • Denkanstoß gesucht.

    • BugFix
    • 25. August 2021 um 15:38
    Zitat von Concara

    Was mich auch immer wieder erstaunt, dass das Tool "Tidy AutoIT Source" so wenig benützt wird. Sofern man den offiziellen SciTE Editor als Programmierumgebung verwendet.

    Dieses Tool find ich einfach nur mega und schaft auf Knopfdruck schön struktuierten Code.

    Nun ja,

    ich gehe mal davon aus, dass die Mehrzahl der User bereits beim Schreiben des Codes sauber strukturiert.

    Wenn ich Tidy auf meinen Code anwende, ist das eher zum Nachteil.

    Meine GEWOLLTE Struktur für z. B.:

    - einzeiliges If-Statement auf zwei Zeilen mit zusätzlichem Einzug - wird umformatiert

    - ab und zu habe ich eigene Formatierungswünsche, die in Tidy nicht vorgesehen sind

    usw.

    Aber wer es mag... ;)

  • ConsoleWrite funktioniert mit ​#RequireAdmin nicht

    • BugFix
    • 21. August 2021 um 16:32
    Zitat von Tweaky

    hast du eine Erklärung warum es funktioniert, wenn z. B. <GuiListView.au3 inkludiert wird?

    Habe gerade bemerkt, dass das bei mir keine Rolle spielt. Ich habe immer eine Konsolenausgabe. War mir nie bewusst, ich dachte das hat nie geklappt.

    Ich verwende ja eine alte Version von SciTE (3.7.3.0), in der require noch mit Dll's funktioniert.

  • Mehrere Windows Programme ausführen

    • BugFix
    • 19. August 2021 um 11:25
    Zitat von diebratwurst

    Sollte mein Script nicht prinzipiell funktionieren?

    Nein. Du musst das Fenster abfragen, das zum gestarteten Prozess gehört. Das hatte doch Moombas hier erklärt.

    So gehts:

    AutoIt
    Global $ProgName = 'notepad.exe'
    Global $PID, $hWnd
    
    For $i = 1 To 5
        $PID = Run($ProgName)
        ; PID existiert sofort, das Fenster etwas später, hier ist ein kurzes Sleep sinnvoll
        Sleep(100)
        $hWnd = WinWaitActive(_WinGetByPID($PID))
        ConsoleWrite(StringFormat('Notepad, Instanz %d, PID: %d, hWnd: %d', $i, $PID, $hWnd) & @CRLF)
    Next
    
    
    ;from https://www.autoitscript.com/forum/topic/136271-solved-wingethandle-from-wingetprocess/
    Func _WinGetByPID($iPID, $iArray = 1) ; 0 Will Return 1 Base Array & 1 Will Return The First Window.
        Local $aError[1] = [0], $aWinList, $sReturn
        If IsString($iPID) Then
            $iPID = ProcessExists($iPID)
        EndIf
        $aWinList = WinList()
        For $A = 1 To $aWinList[0][0]
            If WinGetProcess($aWinList[$A][1]) = $iPID And BitAND(WinGetState($aWinList[$A][1]), 2) Then
                If $iArray Then
                    Return $aWinList[$A][1]
                EndIf
                $sReturn &= $aWinList[$A][1] & Chr(1)
            EndIf
        Next
        If $sReturn Then
            Return StringSplit(StringTrimRight($sReturn, 1), Chr(1))
        EndIf
        Return SetError(1, 0, $aError)
    EndFunc   ;==>_WinGetByPID
    Alles anzeigen

    EDIT:

    Die Verwendung von Send() ist suboptimal. Lies, sofern möglich, die Informationen zu den Eingabefeldern für User und PW mit dem WindowInfoTool aus und schreibe deine Daten direkt in diese Felder mit

    ControlSetText() oder

    ControlSend()

  • Array ByRef in SubSkript registrieren?

    • BugFix
    • 18. August 2021 um 11:06

    Ich habe mich jetzt anders entschieden.

    Da das Hauptprogramm sowieso irgendeine Funktion am Laufen hat, die die Daten in das Array speichert, ist es doch auch kein Problem eine Funktion aufzurufen um das fertige Array zum Subskript zu kopieren. Dort wird einfach regelmäßig abgefragt, ob was Neues da ist, wenn ja wird es verarbeitet. Anhand meines obigen Bsp. könnte man das dann so machen:

    AutoIt: main.au3
    #include "sub.au3"
    
    HotKeySet("^!x", '_Exit')
    
    Global $aData[3]
    _FillArray($aData)
    
    ; aktiviere Datenaustausch
    _Sub_DataExchangeOnOff()
    ; sende Array
    _Sub_DataExchange($aData)
    
    
    While True
        Sleep(50)
        _FillArray($aData)
        _Sub_DataExchange($aData)
    WEnd
    
    
    
    Func _Exit()
        _Sub_DataExchangeOnOff(False)
        Exit
    EndFunc
    
    Func _FillArray(ByRef $a)
        For $i = 0 To UBound($a) -1
            $a[$i] = Int(Random(1,50,1))
        Next
    EndFunc
    Alles anzeigen
    AutoIt: sub.au3
    Global $g_bDataExchangeMode = False      ; ist Datenaustausch aktiv
    Global $g_aUpdateValues                    ; bei neuen Daten wird Array aus Hauptanwendung hierhin kopiert
    Global $g_iCounterNewData = -2147483648 ; Zähler für Updateaktionen (bis 2.147.483.647)
    
    ; De-/Aktivieren des Datenaustausches
    Func _Sub_DataExchangeOnOff($_bOn=True)
        $g_bDataExchangeMode = $_bOn
        If $_bOn Then
            AdlibRegister(_Calculation, 50)
        Else
            AdlibUnRegister(_Calculation)
        EndIf
    EndFunc
    
    ; Nach neuer Datenzusammenstellung sendet das Main- diese an das Subskript
    Func _Sub_DataExchange($_aData)
        $g_aUpdateValues = $_aData
        $g_iCounterNewData += 1
    EndFunc
    
    
    ; Verarbeitung
    Func _Calculation()
        Local Static $iUpdateCounter = -2147483648
        If $g_iCounterNewData > $iUpdateCounter Then
            $iUpdateCounter = $g_iCounterNewData
            AdlibUnRegister(_Calculation)
            For $i = 0 To UBound($g_aUpdateValues) -1
                ConsoleWrite('Verarbeite ' & $g_aUpdateValues[$i] & @CRLF)
            Next
            ConsoleWrite('-----------------------' & @CRLF)
            AdlibRegister(_Calculation, 50)
        EndIf
    EndFunc
    Alles anzeigen

    P.S.

    Das ist jetzt nur ein funktionales Bsp. Natürlich muss man berücksichtigen, dass evtl. Zeitdifferenzen auftreten in Zusammenstellung und/oder Verarbeitung. Insofern würde ich neue Daten sinnvollerweise in einem Puffer sammeln und von dort abarbeiten.

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™