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

Beiträge von Moombas

  • Mehrere Windows Programme ausführen

    • Moombas
    • 19. August 2021 um 08:58

    Und wie gesagt schaue dir meine anderen erwähnten Tipps an.

    Die anderen hier haben sicher noch mehr :)

    Tipp wegen des Handles:

    Code
    ;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
  • Mehrere Windows Programme ausführen

    • Moombas
    • 19. August 2021 um 08:50

    Ich habe oben mal etwas geändert im Post aber:

    Der Titel ist bei 2 Fenstern (MFC & CPS) gleich?

    Das wird zu Problemen führen bei deinen Abfragen!

    Dann musst du über RunWait die PID holen und das Handle des Fensters suchen und aktivieren.

  • Mehrere Windows Programme ausführen

    • Moombas
    • 19. August 2021 um 08:31

    Tipp 1: Bei MFC hast du schon mal einen Copy Paste Fehler beim letzen winwaitactive, denke ich.

    Tipp 2: Auch fehlt ein Wend und ein Endswitch ein include.

    Tipp 3: Wiederkehrende Aufgaben in eine Funktion auslagern

    Tipp 4: Sleeps nach Möglichkeit durch sinnvolle Schleifen ersetzen

    Tipp 5: Prüfen ob der Aufruf des Programms überhaupt erfolgreich war.

    Ich habe dir mal deinen Code grob umgebaut. Prüfen und verstehen musst du selber und es geht mit Sicherheit noch besser:

    AutoIt
    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <MsGBoxConstants.au3>
    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Witron-Start", 245, 140, 339, 192)
    
    $Input1 = GUICtrlCreateInput("Benutzername", 24, 16, 193, 21)
    $Input2 = GUICtrlCreateInput("Passwort", 24, 40, 193, 21)
    
    
    $Button1 = GUICtrlCreateButton("Start", 24, 64, 193, 33)
    $Beenden = GUICtrlCreateButton("Beenden", 24, 104, 193, 17)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###
    
    While 1
        $nMsg = GUIGetMsg()
        Switch $nMsg
            Case $GUI_EVENT_CLOSE
                Exit
            Case $Beenden
                Exit
            Case $Button1
                $user = GUICtrlRead($Input1)
                $pwd  = GUICtrlRead($Input2)
                if ($user <> '') and ($pwd <> '') Then
                    if not RunProg("X:\bin\wvs.exe", "Welcome to", "WVS") Then MsgBox(1, 'Fehler', 'Das Programm WVS konnte nicht gestartet werden oder das Fenster wurde nicht gefunden!')
                    if not RunProg("X:\bin\cps.exe", "Welcome to", "Car Picking System - CPS Administration 2.1.0") Then MsgBox(1, 'Fehler', 'Das Programm CPS konnte nicht gestartet werden oder das Fenster wurde nicht gefunden!')
                    if not RunProg("X:\bin\lbs.exe", "Welcome to", "Logistic Bus System - LBS Administration 3.2.121") Then MsgBox(1, 'Fehler', 'Das Programm LBS konnte nicht gestartet werden oder das Fenster wurde nicht gefunden!')
                    if not RunProg("X:\bin\.pcoview", "PCO View Login", "bwms-app") Then MsgBox(1, 'Fehler', 'Das Programm PCO View konnte nicht gestartet werden oder das Fenster wurde nicht gefunden!')
                    if not RunProg("X:\bin\pro_vb32.exe", "Welcome to", "Protocol-Diagnosis-Information-System - Administration") Then MsgBox(1, 'Fehler', 'Das Programm PDIS konnte nicht gestartet werden oder das Fenster wurde nicht gefunden!')
                    if not RunProg("X:\bin\qfiview.exe", "QFI View Login", "QFIView") Then MsgBox(1, 'Fehler', 'Das Programm QFI View konnte nicht gestartet werden oder das Fenster wurde nicht gefunden!')
    
                    if not RunProg("X:\bin\mfc.exe", "Welcome to", "Car Picking System - CPS Administration 2.1.0") Then MsgBox(1, 'Fehler', 'Das Programm MFC konnte nicht gestartet werden oder das Fenster wurde nicht gefunden!')
    
                    if not RunProg("X:\bin\AMS.exe", "Log on AMS", "AMS V2.10.7") Then MsgBox(1, 'Fehler', 'Das Programm AMS konnte nicht gestartet werden oder das Fenster wurde nicht gefunden!')
                    if not RunProg("X:\bin\BMIS.exe", "Log on BMIS", "BMIS V2.15.0") Then MsgBox(1, 'Fehler', 'Das Programm BMIS konnte nicht gestartet werden oder das Fenster wurde nicht gefunden!')
                    if not RunProg("X:\bin\AMdiShell.exe", "Login", "*MdiShell V2.1.485.0") Then MsgBox(1, 'Fehler', 'Das Programm AMDiShell konnte nicht gestartet werden oder das Fenster wurde nicht gefunden!')
                    MsgBox($MB_SYSTEMMODAL, "Autostart", "Fertig!", 5)
                Else
                    MsgBox(1, 'Falsche Eingabe', 'Benutzername oder Passwort war leer!')
                EndIf
        EndSwitch
    WEnd
    
    ;------------------------------------------------------
    
    Func RunProg($Prog, $TitleLogin, $TitleRun); normalerweise würde ich $user und $pwd mit übergeben lassen, da dies hier aber (unschöner weise) eine globale variable ist lasse ich das
    Local $break = 0
    
        Run($Prog)
        if @error then 
            MsgBox(1, 'Fehler', _WinAPI_GetLastErrorMessage())
            Return False
        EndIf
    
        while Not WinExists($TitleLogin)
            if $break > 100 then Return False    ;maximal 10Sekunden warten
            sleep(100)
            $break += 1
        WEnd
    
        $break = 0
        while Not WinActive($TitleLogin)
            if $break > 100 then Return False    ;maximal 10Sekunden warten
            WinActivate($TitleLogin)
            sleep(100)
            $break += 1
        WEnd
    
        send($user)
        send("{TAB}")
        Send($pwd)
        Sleep(1000)                             ;ich hätte hier 500 gewählt kann das aber nicht einschätzen da ich die Programme etc. nicht kenne
        Send("{ENTER}")
    
        $break = 0
        while Not WinExists($TitleRun)
            if $break > 100 then Return False    ;maximal 10Sekunden warten
            sleep(100)
            $break += 1
        WEnd
    
        Return True
    EndFunc
    Alles anzeigen
  • _Excel_RangeRead, _ArrayDisplay; Daten im Skript verwenden; Schleife mit Array

    • Moombas
    • 18. August 2021 um 15:59

    Wie gesagt, ich würde an deiner Stelle überlegen, ob der Aufbau deiner Exceltabelle so wie sie jetzt ist Sinn ergibt (Erklärung in meinem vorigen Post) oder anders besser wäre und somit leichter zu verarbeiten (siehe hier).

    Aus meiner Sicht ändert sich nur der Wert in der Zelle 1, 13, ?17?, ?18?

    Den Rest schleifst du von vorne durch und könnte als Konstante direkt am Anfang eingelesen werden.

    Dann würde ich anstatt das in Spalten zu packen, es in Zeilen umpacken, womit deine Tabelle schmaler wird (evtl. 1 Spalte als counter + 2-4 Spalten mit Variablen + 1-2 Spalten oben mit Konstanten; ohne sie durch zu schleifen!) dafür aber länger.

    Vorteil ist dann weniger Handhabung mit den Spaltenbeschriftungen und höchstwahrscheinlich schnellere/einfachere Abfragen, da die die Zeilen einfach durchläufst ohne die Werte in "AB" etc. umwandeln zu müssen.

    In der aktuellen Verison:

    Wegen deinem "HQ" Problem, kann ich mir vorstellen, das es zu viele Zellen sind, die in A:HQ enthalten sind. Evtl. versuch dies mal zu begrenzen. Z.B. mit "A1:ZZ100" und shcaue nach ob das dann geht.

  • _Excel_RangeRead, _ArrayDisplay; Daten im Skript verwenden; Schleife mit Array

    • Moombas
    • 18. August 2021 um 11:52

    Zumal die Inhalte der Zellen (also die Bezugsangaben, naja... Fragwürdig sind) Du schleifst einen Wert scheinbar vom Anfang bis zum Ende durch ("=HM86";"=HN86";...), richtig wäre: "=$A$86". (A86 hier als Beispiel, wäre die Quell-Zelle)

    Bei so vielen gleichen Werten stelle ich deine Exceltabelle mal grundsätzlich in Frage (Sinnhaftigkeit), da sich nur 1-2 Zellen vom Wert her wirklich sich zu ändern scheinen.

    Evtl. solltest du diese nach Möglichkeit überarbeiten und dadurch dann auch eine bessere Abfrage erhalten können.

  • Ich möchte mein acc löschen lassen

    • Moombas
    • 17. August 2021 um 08:17

    Dennoch existiert dieser Menüpunkt auch bei mir nicht und normalerweise läuft bei Forensoftware das über die Rechteverwaltung, wer was darf, so zumindest meine Erfahrungen hierzu. Da kann es schon sein das du als "Poweruser" andere Rechte hast aber wirklich beantworten können das nur die Admins und da ich hier ja auch nicht kündigen möchte, ists mir wurscht^^

  • Ich möchte mein acc löschen lassen

    • Moombas
    • 16. August 2021 um 07:56

    Bitnugger: Ist das etwas was ggf. auf Rechten basiert. Denn bei mir gibt es die Option ebenfalls nicht, darf man das ggf. erst ab Administrator oder so!?

    Haudiweg Mal nebenbei: Alle deine Beiträge sollen gelöscht werden...

    1. Warum? Die waren seit du sie erstellt hast für alle Sichtbar, warum ist dies nun so schlimm das das weiterhin (alleine für die Nachvollziehbarkeit) so bleibt?

    und

    2. bei ganzen "2" Stück (wovon einer dieser hier ist) kannst du das im Zweifel nicht selber?

  • Problem mit "ProcessWaitClose"

    • Moombas
    • 6. August 2021 um 11:45

    Hast du mal geschaut ob es ggf. mehrere Prozesse von StarMoney.exe gibt?

    Ein wenig Quellcode ist zudem nie verkehrt um Fehler zu suchen und zu Helfen :D

  • Denkanstoß gesucht.

    • Moombas
    • 6. Juli 2021 um 14:57

    Du musst also eine GUI erstellen und das dann dort umsetzen.

  • Solange sleep bis die eine Bestimmte Farbe an einer Position auftritt

    • Moombas
    • 23. Juni 2021 um 11:52

    hatte sich Yjuq nicht mal damit beschäftigt wegen einem Thread eines anderen TE's: Rat gesucht. Autoit für automatisierte Uploadprozesse?

    Evtl. kann er weiter helfen. Nur eine Idee.

  • Solange sleep bis die eine Bestimmte Farbe an einer Position auftritt

    • Moombas
    • 23. Juni 2021 um 10:16

    Oops, Post #5 habe ich wohl überlesen^^

    Warum wird nicht die API genutzt Bernd Albrecht : https://www.spreadshirt.de/blog/2010/10/2…st-da-und-beta/

  • Solange sleep bis die eine Bestimmte Farbe an einer Position auftritt

    • Moombas
    • 23. Juni 2021 um 09:32

    Oder anders betrachtet: Kann man das ggf. anders lösen als einen Pixel abzufragen?

    Bernd Albrecht Ggf. kannst du uns sagen bei welchem Programm du was abfragen willst.

  • Select Funktion mit einem Wert von der Excel Tabelle von einer bestimmten Schleife

    • Moombas
    • 23. Juni 2021 um 08:19

    Am besten Code immer Code Tag einbauen und formatieren, das ist so kaum lesbar.

    Auch deine Umschreibung finde ich etwas wirr.

    Kannst du daraus eine Bedingung schreiben? Also z.B.: mit if then else

    Dann kann man das leichter in eine Case Anweisung umwandeln.

    Aktuell würde ich es so verstehen:

    AutoIt
    Schleife $i = 25
    Select
        Case $_readR = 1
             if $i = 25 then
                MouseClick("left" , 417,527, 1)
                sleep(3000)
             endif
        Case $_readR = 2 ; Englisch
             MouseClick("left" , 408,555, 1)
             sleep(3000)
        Case Else
             sleep(300)
    EndSelect
    Alles anzeigen
  • Zahlen trennen

    • Moombas
    • 22. Juni 2021 um 07:56

    MojoeB Wegen der Namen war gemeint das ein START() reichen würde anstatt ________START_________() Weil das die Aufrufe nur verkompliziert und unnötig lang macht. Füge in solchen Fällen lieber eine Kommentarzeile darüber ein.

    Generell solltest du deinen Programmierstil etwas überdenken. innerhalb einer Func() deklariert man keine globalen Variablen, nur Lokale! Nu ein Beispiel.

  • Virtuelle Webcam

    • Moombas
    • 16. Juni 2021 um 15:41

    Ist der Vortragende nicht normalerweise/Idealerweise der Präsenter?

    Wäre es nicht einfacher wie folgt vorzugehen:

    1. Der Päsentierende Teilt das Präsentationsprogramm (nicht den ganzen Bildschirm, nur das jeweilige Fenster).
    2. Der Präsenter hat eine Uhr im "Stay on top" laufen (das könntest du selber mit autoit programmieren) wo er die Zeit sieht und was über der Präsentation angezeigt wird (die anderen können diese dann nicht sehen, was das ganze etwas professioneller macht)

    Dann braucht es keinen der über OBS kompliziert über eine "virtuelle Webcam" die Uhr für alle teilt.

  • Wie kann ich alle laufenden Tasks "chrome.exe" beenden?

    • Moombas
    • 14. Juni 2021 um 13:40

    Die höchste PID ist ja auch eher unwahrscheinlich für den Ursprungsprozess. Daher prüfe ich darauf, ob ein Fenstertitel existiert.

  • Run und ShellExecute starten das Programm nicht. Warum nicht?

    • Moombas
    • 14. Juni 2021 um 12:02

    Du hast die Leerzeichen zwischen den Parametern vergessen.

    Ansonsten ist es generell nicht gut, wenn man nicht mal weiß wie man ein Programm ausführen muss, das solltest du als erstes in Erfahrung bringen.

  • Wie kann ich alle laufenden Tasks "chrome.exe" beenden?

    • Moombas
    • 14. Juni 2021 um 11:55

    Hi Musashi,

    das habe ich persönlich noch nie getestet, da ich bei mir immer nur 1 Instanz laufen habe und nur für das Sortieren der Fenster bei Arbeitsplatzwechsel (Büro <-> Laptop <-> Zuhause) nutze.

    Aber theoretisch müsste das, wenn man das Exitloop raus nimmt auch bei mehreren Instanzen funktionieren (würde dann alle beenden).

    Ist auch nur einkleiner Ausschnitt. Das ganze sieht bei mir im Original so aus, da noch ein wenig mehr Funktionen aufgerufen werden:

    AutoIt
    Func WorkingArea($ExeName)
    Local $i, $PID, $hWnd
    Local Const $ProcessList = ProcessList()
    Local Const $Space = 0 ;Pixelfreiraum zwischen den Fenstern
    
        if not ProcessExists($ExeName & '.exe') then Return -1
        For $i = 1 to $ProcessList[0][0]
            if StringInStr($ProcessList[$i][0], $ExeName) Then
                $PID = $ProcessList[$i][1]
                $hWnd = _WinGetByPID($PID, 1)
                if WinGetTitle($hWnd) <> "" then ExitLoop
            EndIf
        Next
        if ($PID = "") or ($hWnd = "") then Return -1
        if WinGetTitle($hWnd) = '' then Return -2
    
        ;Arbeitsplatzerkennung und anpassen der Fenster
        ;...    
    
        Return 1
    EndFunc
    Alles anzeigen

    Für Mehrere Instanzen müsste das dann wohl ungefähr so aussehen:

    AutoIt
    Func WorkingArea($ExeName, $Monitor)
    Local $i, $PID, $hWnd
    Local Const $ProcessList = ProcessList()
    Local Const $Space = 0 ;Pixelfreiraum zwischen den Fenstern
    
        if not ProcessExists($ExeName & '.exe') then Return -1
        For $i = 1 to $ProcessList[0][0]
            if StringInStr($ProcessList[$i][0], $ExeName) Then
                $PID = $ProcessList[$i][1]
                $hWnd = _WinGetByPID($PID, 1)
                if (WinGetTitle($hWnd) <> "") and ($PID <> "") and ($hWnd <> "") then 
                    ProcessClose($PID)
                Endif
            EndIf
        Next
    
        Return 1
    EndFunc
    Alles anzeigen
  • Wie kann ich alle laufenden Tasks "chrome.exe" beenden?

    • Moombas
    • 14. Juni 2021 um 11:05

    Hallo 32vroni , ich mache es bei mir so:

    AutoIt
    $ExeName = 'chrome'
    For $i = 1 to $ProcessList[0][0]
        if StringInStr($ProcessList[$i][0], $ExeName) Then
            $PID = $ProcessList[$i][1]
            $hWnd = _WinGetByPID($PID, 1)
            If BitAND(WinGetState($hWnd), $WIN_STATE_EXISTS) then 
                ProcessClose($PID)
                Exitloop
            Endif
        EndIf
    Next
    Alles anzeigen

    Grund: Die einzelnen Einträge sind die Tabs, du musst aber das Hauptfenster schließen.

    Das kann man daran erkennen, das es z.B. einen Fenstertitel hat.

  • OL Wrapper mit Fehler 6002

    • Moombas
    • 10. Juni 2021 um 14:55

    Wie gesagt dort sollte man die oben genannte Ausgabe dann mal prüfen.

    Das kann sowohl ein Ini Problem sein (falsche/nicht vorhandene Werte) als auch ein Rechte Problem (kein Zugriff auf die Ini/ ini nicht vorhanden).

    Und wenn du die "default" ini neu schreibst, musst du ja wissen was dort stehen müsste.

    Und auf den PC's wo es Probleme gibt kannst du es dann easy nachprüfen.

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™