Beiträge von Kanashius

    Ich hab das ganze mal etwas robuster gegen andere Fenster gemacht, die zum gleichen Zeitpunkt auftauchen... Nur den Titel bekomme ich nicht wieder zurückgesetzt -.-

    Da hab ich grad glaub ich ne Denkblockade...

    Aber schau dir den Code unten gern an. Ich habe die Informationen von der Win_Api: https://docs.microsoft.com/de-…p/legacy/ms644977(v=vs.85) genommen und daraus die Strukturen,... gebastelt. :)

    Ich würde vorschlagen, dass wir das etwas abändern. Momentan wird beim ersetzen jede Zeile ersetzt, sofern es ein error/warning/==> ist. Stattdessen würde ich es mit nem If machen. Wir haben ja schon die Erkennung, ob es error, warning oder ==> ist und können dort nur bei dem ==> eine Ersetzung vornehmen, dann wird der Ausdruck zum ersetzen deutlich einfacher als jetzt.

    Die Änderung mit dem error würde es nur noch komplexer machen und die Methode ist auch was Performance angeht nicht sehr schnell. Meistens wird man zwar vorher schon rausgeworfen, da die ", der Pfad, die Klammern,... nicht stimmen, aber das muss je nach Ausgabe des Programmes nicht immer der Fall sein. Mit viel Pech könnten wir die Kommandozeilenausgabe ziemlich verlangsamen. Ich "missbrauche" ein forward lookahead um das ",1" ,welches ans Ende angefügt wird zu finden und zu matchen und als Gruppe anzuzeigen. Dabei wird der gesamte String 1x extra durchsucht. Für das error müsste ich was ähnliches machen,...

    Ich hab das ganze jetzt mal mit einem regulären ausdruck erledigt:

    Einmal wird gesucht und der Dateiname, die Zeile und Spalte sowie der Typ in ein Array gespeichert und dann wird auch mit nem StringRegExpReplace die Zeile ersetzt, so wie du sie haben möchtest :)

    Ausgabe:

    Code
    1. "D:\test files\FileQuantityLimit (Testdatei).au3"(112,16) : warning: $iTest possibly not declared/created yet
    2. FOUND: D:\test files\FileQuantityLimit (Testdatei).au3 -> (112,16) -> warning
    3. "D:\test files\FileQuantityLimit (Testdatei).au3" (112,16): warning: $iTest possibly not declared/created yet
    4. "D:\test files\FileQuantityLimit (Testdatei).au3"(131,11) : error: zzzz(): undefined function.
    5. FOUND: D:\test files\FileQuantityLimit (Testdatei).au3 -> (131,11) -> error
    6. "D:\test files\FileQuantityLimit (Testdatei).au3" (131,11): error: zzzz(): undefined function.
    7. "D:\test files\FileQuantityLimit (Testdatei).au3" (163) : ==> Array variable has incorrect number of subscripts or subscript dimension range exceeded.:
    8. FOUND: D:\test files\FileQuantityLimit (Testdatei).au3 -> (163) -> ==>
    9. "D:\test files\FileQuantityLimit (Testdatei).au3" (163,1): ==> Array variable has incorrect number of subscripts or subscript dimension range exceeded.:

    Wobei die for Schleife mit $j nicht notwendig sein sollte und stattdessen nen ConsoleWrite(@TAB&"FOUND: "&$arResult[0]&" -> "&$arResult[1]&" -> "&$arResult[2]&@crlf) ausreichen sollte :)


    MfG Kanashius

    Naja, (?m)^(\r\n|\n)=(\r\n|\n)(\r\n|\n), wenn ich mich nicht täusche solltest du dann das gleiche Problem haben wie am Anfang. (?m) macht ja nichts anderes als dafür zu sorgen, dass ^ einen Zeilenumbruch matcht.

    Tatsächlich wäre es vermutlich performanter, wenn ich nicht einen einzelnen Zeilenumbruch mit nem Zeilenumbruch ersetzen würde, also so: (\r\n|\n){2,} statt mit dem +

    Du ersetzt 2 aufeinanderfolgende Zeilenumbrüche mit einem. Wenn du 3 aufeinanderfolgende Zeilenumbrüche hast ersetzt du 2 mit 1 und hast also noch 2 dort stehen. StringReplace geht den String nur einmal durch und macht somit hinter dem eingefügten Zeilenumbruch weiter. Nehmen wir an, dass U ein Zeilenumbruch darstellt und ^ die Position des ersetzers, wird das so verarbeitet:

    In deinem Fall wäre ein regulärere Ausdruck sinnvoller. Das würde so aussehen und dann werden alle Zeilenumbrüche ersetzt (auch unix/linux).

    StringRegExpReplace($inhalt,"(\r\n|\n)+","\r\n")

    Hallo Bernd :)


    Ich bin im moment eher lesend aktiv und schau mir fast jeden Thread an, schreibe aber nicht sehr viel, hauptsächlich, weil ich meistens zu spät bin und schon fast alles wichtige gesagt wurde :D


    _WinAPI_GetParentProcess ( [$iPID = 0] ) zusammen mit ProcessList gibt dir die Möglichkeit, alle Prozesse zu finden, die ein Childprozess von dem sind, den du gestartet hast. Vielleicht kannst du das in Zukunft mal benötigen.

    Generell ist es sehr Sinnvoll, bei diesem Themenbereich mal einen Blick in die WinAPI zu werfen. Sehr viele Funktionalitäten, die nicht mit direkten AutoIT-Aufrufen umgesetzt werden können finden sich dort wieder. Halt alle, die Windows so anbietet :)


    MfG Kanashius

    Naja, für das WinWait brauchst du ja dann den Handle, den du eigentlich von der Funktion bekommen möchtest, oder du kannst gleich komplett auf das GetHwndFromPID verzichten und warten, bis ein Fenster mit dem Titel existiert. Wobei WinWait im Hintergrund vermutlich ebenfalls die WinList-Funktion benutzt und nach Titeln durchsucht.

    Dort hast du dann die gleiche Schleife, wie in dem Code oben. Wobei die WinWait nen optionalen Timeout dabei hat um abzubrechen. Den kannst du bei der GetHwndFromPID natürlich auch hinzufügen.

    Der einzige Unterschied zwischen den beiden Methoden ist in diesem Fall eigentlich, dass bei WinWait der Titel/Handle des Fensters bekannt ist und du auf diese Weise darauf wartest, bis es erstellt wurde. (Wobei der Handle hier keinen Sinn macht... Wenn du den Handle kennst, existiert es ja definitiv schon.)

    Bei der GetHwndFromPID kennst du die Prozess-ID und möchtest damit ein Fenster bekommen, dass von dem Prozess erstellt wurde.

    Somit brauchst du den Titel nicht und kannst auch nicht ausversehen mit dem Titel das Fenster eines anderen Prozesses abfragen. Fenstertitel sind ja kein eindeutiges Erkennungsmerkmal. Es könnte ja immer ein anderes Fenster mit dem Titel existieren oder erstellt werden. Wenn du auf die Prozess-ID schaust, kannst du dir zumindest sicher sein, dass du kein "zufälliges" anderes Fenster änderst, was nichts mit dem von dir gestarteten Prozess zu tun hat.

    Natürlich solltest du überprüfen, dass der Prozess auch wirklich das von dir gewollte Fenster gestartet hat. Es könnte ja auch passieren, dass du den Prozess startest und der ne Fehlermeldung anzeigt. Da würdest du dann mit dem GetHwndFromPID das Handle des Fehlermeldungsfensters bekommen.


    Du kannst also mit nem WinWait warten, bis ein Fenster mit dem gewollten Titel existiert und prüfst dann, ob der Prozess dazu passt (WinGetProcess), könntest aber auch gleich ne Schleife bauen über WinGetProcess("TITEL"), solange dort -1 zurückkommt wartest du halt (ggf. mit Timeout).

    Du kannst aber auch die GetHwndFromPID nutzen und prüfst dann, dass der Titel passt, oder falls du den nicht kennst, ob die Controls die du steuern willst auch in dem zurückgegebenen Fenster existieren,... ggf. erstellt dein Prozess ja mehrere Fenster, die du mit WinList holen könntest (also so umbauen, dass du nicht nur einen Windowhandle, sondern nen Array von WindowHandles bekommst)m...


    Also du solltest auf jedenfall überprüfen, dass du das richtige Fenster bekommst. Welche der Methoden, die ich oben genannt habe, du nutzt hängt von den Infos ab, die du hast und wie genau du das gestartete Programm kennst,... es gibt auch noch andere Wege, aber die gibt es ja immer ;)

    Wenn du nen Prozess startest muss er nicht direkt das Fenster öffnen. Du könntest ja auch ein AutoIT-Script schreiben, nen Sleep(50000) nach ganz oben setzen und es dauert 50 Sekunden bis dein Fenster weiter unten erstellt wird.

    Deshalb kann es passieren, dass, je nachdem, was der Prozess vor dem erstellen des Fensters alles macht, deine Abfrage nach dem windowhandle läuft, bevor das Fenster erstellt wurde.

    Das ist ein typisches Problem, was bei paralleler Ausführung von Code passieren kann (Bei Multithreading,... muss man oft auf solche Dinge aufpassen, wobei man das Problem in AutoIT ja normal nicht bekommt).


    Bisher hattest du also nur immer das Glück, dass der gestartete Prozess das Fenster schneller erzeugt hat, als du es in AutoIT abgefragt hast.

    Ich verwende bei solche Projekten meistens SQLite. Man muss SQL können, aber dafür kann man alle Daten gut strukturiert ablegen und auch sehr gut Suchfunktionen umsetzen. Insbesondere verschachteltere Strukturen, wenn z.B. eine Datei zu mehreren Kategorien passen würde (z.B. passt das Schnitzel mit Pilzen sowohl zu Rezepten mit Pilzen als auch mit Schnitzel,...) lassen sich dabei sehr gut umsetzen.


    Je nach Menge an Schlagwörtern empfiehlt sich für die Darstellung der Kategorien vermutlich am ehesten eine Kombination aus Treeview und Listview. Du machst auf der einen Seite eine Treeview in der man die Kategorien verschachtelt darstellt und bei der Auswahl werden die Dateien in der Listview angezeigt. Je nach Verschachtelungstiefe der Kategorien/der Länge der Kategorienamen würde ich sie vielleicht auch vertical untereinander anordnen.


    Mit SQLite habe ich auch schonmal eine Live-Suchfunktion gebaut, bei der man in ein Inputfeld tippt und nach jedem Buchstaben direkt die ersten Suchergebnisse angezeigt wurden. (In dem Fall tausend+ Musikdateien durchsuchen nach name.)

    Das würde dir ermöglichen, dass du nach Kategorien, Dateinamen,.... suchen kannst und den Dateien ggf. noch Zusatzinformationen geben kannst.


    Mit freundlichen Grüßen,

    Kanashius :)

    Sieh dir mal bei GuiGetMsg die Hilfe an und dort den advanced mode (GuiGetMsg(1)).

    Wenn du den nutzt, kannst du eine Schleife haben und dort alle Fenster abarbeiten.

    Die Variablen müssen natürlich vorher declared werden.

    allerdings wenn ich weitere funktionionen mit ctrl+v habe dann triggert es auch und hält die strg taste runter bis ich dann strg einmal drücke um zu lösen


    Wie kann ich das ganze dann in WinWaitActive packen - bei mir triggert das trotzdem also ob es im falschen bereich wirkt ?!

    Kommt drauf an, wie du es implemetierst. Momentan wird ja STRG links verwendet. In dem Fall würde ich tatsächlich STRG rechts verwenden zum blockieren.

    WinWaitActive hat damit garnichts zu tun, da müsste ich den Code sehen.

    Die Funktion die ich verwendet habe ist ein KeyboardHook. Das bedeutet, dass sich das Programm beim Betriebssystem registriert, damit es bei jedem Event (Tastendruck) von der Tastatur aufgerufen wird. Dementsprechend wird die _KeyProc jedesmal aufgerufen, wenn irgendein Tastaturevent eintritt.

    Das bedeutet es wird IMMER aufgerufen, egal, was dein Programm sonst gerade macht (Deshalb funktioniert WinWaitActive nicht). Die Funktion wird immer aufgerufen bei dem KeyDownEvent oder KeyUpEvent, welches die Tastatur auslöst.

    Wenn du weitere Funktionalität implementieren möchtest, z.B. dass ein bestimmtes Fenster aktiv sein muss, musst du Bool-Variablen, o.ä. einführen. Das Bedeutet, dass du ne Variable auf true änderst, wenn dein Fenster aktiv ist, sonst ist sie false. In der KeyUp-Funktion schreibst du dann nen IF mit der Variable und schon wird das ganze nur aufgerufen, wenn die Variable gesetzt ist. Du musst halt deine Denkweise des Programmierens hierbei umstellen. Deshalb würd ich sagen gehört das auch schon zu etwas fortgeschrittener Programmierung.
    Mit dem WindowInfoTool kann man viel auslesen, wenn es native Windowsfenster sind, bei anderen wird es schwerer bis unmöglich, da brauchen wir schon mehr Informationen.


    MfG Kanashius

    Ich hab aber eine Möglichkeit über Keyboard hooks gefunden, mit der bei einem Klick auf LCTRL die Taste solange gedrückt gehalten wird, bis sie erneut gedrückt wird.

    Funktionsweise: 250ms nachdem LCTRL losgelassen wird, wird LCTRL gedrückt gehalten, bis LCTRL erneut (gedrückt und) losgelassen wird. Wird die 162 in Zeile 19 durch eine 163 ersetzt, löst die rechte CTRL Taste das gedrückt halten aus.

    Ich hoffe, dass erfüllt jetzt deine Bedinungen :)


    MfG Kanashius.

    kann ich eine combination von ctrl und z.b. f10 hotkeyset nehmen oder geht das da dann auch nicht mit ctrl bzw einen andere combination aus zwei sachen ( weil doppel belegung)?


    , sofern STRG nicht genutzt wird, da HotKeySet alle Tasten, die in der Kombination sind, blockiert

    Es wäre echt angenehm, wenn du die Beiträge gründlicher lesen würdest. Ich hab in dem Thread nichts geschrieben, weil Alpines dir eigentlich genügend tipps gegeben hat.

    Ich hab mich erst am Ende gemeldet, damit du nicht das komplexe Script nimmst, einfach weil es funktioniert.


    MfG Kanashius.

    Bevor das Script von xSunLighTx3 noch zum Einsatz kommt, hier eine Lösung, die weniger CPU-auslastung hervorbringt, sauberer/kürzer ist,...


    Der Hotkey für _down (F10) kann frei gesetzt werden, sofern STRG nicht genutzt wird, da HotKeySet alle Tasten, die in der Kombination sind, blockiert.

    Der Hotkey für _up (F11) kann auch weggelassen werden, da es reicht erneut LSTRG auf der Tastatur zu drücken um das gedrückt halten aufzuheben. Die Funktion kann dann natürlich auch entfernt werden.


    PlayOnLinux ist ebenfalls "nur" wine, mit dem unterschied, dass es wine für dich konfiguriert ;)

    Zitat


    PlayOnLinux basiert auf Wine und profitiert von all seinen Funktionen, wobei es dessen Komplexität vom Benutzer fernhält.

    Es ist also definitiv kein wine Ersatz. Es ist nur dazu da, die Nutzung von Wine zu vereinfachen, indem andere User die richtige Wine-Konfiguration, die am besten funktioniert herausfinden und bei PlayOnLinux hochladen.