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

Beiträge von KloMeister

  • Markierten Text 'speichern'

    • KloMeister
    • 10. November 2014 um 10:26

    Mit der Zwischenablage wird es auf jeden Fall am einfachsten. Andernfalls müsstest du deine Funktion auf die verschiedensten Steuerelemente anpassen. Bei gezeichneten Steuerelementen, die kein eindeutiges Handle haben, würde es dann nochmals schwerer werden.

    Also bevorzuge ich definitiv die Zwischenablagen-Variante.

    Mit _ClipBoard_GetData und _ClipBoard_SetData, kannst du nicht nur Text auslesen und zwischenspeichern, sondern auch Bilder & co. Damit solltest du deine Funktion umsetzen können.
    Sicher ist es nur dann zwischengespeichert, solange dein Programm während der Funktion stabil läuft..

  • GUICtrlCreateListViewItem ist zu langsam? -> Problem gelöst, aber Warum ist das so?

    • KloMeister
    • 4. November 2014 um 11:46

    Damit das ganze nicht so "merkwürdig" aussieht, könnte man ja vorher ein Screencapture der Form machen und als Hintergrund setzen oder die versteckten Steuerelemente kurzzeitig durch neu erstellte Steuerelement-Attrappen ersetzen.

  • Forum-Umstellung Problemsammlung

    • KloMeister
    • 16. Oktober 2014 um 22:18

    Nochmal zum AutoIt-Code:

    Vielleicht macht es auch Sinn, da wieder eine Funktion einzubauen, die es ermöglicht den Code in die Zwischenablage zu kopieren.
    Wählt man Beispielsweise AutoIt-Code mit dem Internet Explorer (11) aus, dann kopiert man auch die Zeilennummerierungen mit. Bei Crome und Firefox hingegen ist das nicht der Fall.

  • Forum-Umstellung Problemsammlung

    • KloMeister
    • 16. Oktober 2014 um 10:22

    Fehler im AutoIt Code

    Beispiel:

    msgbox(0,"Doppelklick","Hallo: " & _GUICtrlListBox_GetText($List1, $aItem))

    [autoit]

    msgbox(0,"Doppelklick","Hallo: " & _GUICtrlListBox_GetText($List1, $aItem))

    [/autoit]

    Vor dem _GUICtrlListBox_GetText, wird sobald es AutoIt Code ist, automatisch ein ";" eingebaut

  • GUICtrlCreateList mit Doppelklick

    • KloMeister
    • 16. Oktober 2014 um 09:21

    Man kann das z.B. so realisieren, hier ein Beispiel Code mit Form:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <GUIListBox.au3>
    #include <WindowsConstants.au3>

    [/autoit] [autoit][/autoit] [autoit]

    GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")

    [/autoit] [autoit][/autoit] [autoit]

    $Form1_1 = GUICreate("Listbox_Test", 320, 320, 78, 100)
    $List1 = GUICtrlCreateList("", 45, 10, 220, 300)
    GUISetOnEvent($GUI_EVENT_CLOSE, "Close")

    [/autoit] [autoit][/autoit] [autoit]

    _GUICtrlListBox_AddString($List1, "Test1")
    _GUICtrlListBox_AddString($List1, "Test2")
    _GUICtrlListBox_AddString($List1, "Test3")

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState(@SW_SHOW)
    Opt("GUIOnEventMode", 1)

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    EndSwitch
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func Close()
    Exit
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    ;Eigentliche Funktion #############
    Func WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)
    Local $iIDFrom, $iCode
    $iIDFrom = BitAND($iwParam, 0xFFFF) ; Low Word
    $iCode = BitShift($iwParam, 16) ; Hi Word
    $hlistbox = GUICtrlGetHandle($List1)
    Switch $ilParam
    Case $List1, $hlistbox
    Switch $iCode
    Case 2 ;Doppelklick
    local $aItem
    $aItem = _GUICtrlListBox_GetCurSel($List1) ;Eintrags Position bekommen
    msgbox(0,"Doppelklick","Es wurde folgender Eintrag doppelt geklickt: " & _GUICtrlListBox_GetText($List1, $aItem)) ; Eintrag auslesen
    EndSwitch
    EndSwitch
    EndFunc
    ;#################################

    [/autoit]

    Komisch der AutoIt Code Erzeuger des Forums, fügt mir hier teilweise ";" in den Code ein, wo eigentlich garkeins ist (z.B. bei der MsgBox), daher nochmal als Anhang:

  • Befehl aus batch Datei für Autoit konvertieren

    • KloMeister
    • 6. Oktober 2014 um 13:53
    Zitat

    könnte meinen Allerwertesten verwetten, das ich bei allen meinen Versuchen das auch dabei hatte....

    Sofern man Anführungszeichen(") in einem Syntax nutzen möchte, muss man den gesamten Syntax mit einem Apostrophe(') starten und beenden, oder man nutzt 2 Anführungszeichen("") an der entsprechenden Stelle, wo ein " dargestellt werden soll.

    Wenn man das erst einmal weiß, dann braucht man garnichtmehr soviel versuchen ;)

  • Maus DPI abfragen

    • KloMeister
    • 2. Oktober 2014 um 21:33

    Ich habe ihm nun über Teamviewer geholfen.

    Wir haben herausgefunden, dass es sich um eine Speicheradresse handelt die "variabel" ist. Wir haben auch keinen passenden Pointer gefunden.

    Allerdings haben wir herausgefunden, dass die Adresse wahrscheinlich nur um "256" Zustände variabel ist und haben daher eine "Prüffunktion" eingebaut.

    Wir haben die Speicheradresse gesplittet, an der variablen Stelle eine Schleife eingebaut die die 256 Zustände durchzählt, dort fügen wir den momentanen Schleifen-Wert wieder als HEX ein.
    In einer zweiten Schleife die in der ersten Schleife eingebaut ist, fragen wir ab, ob die Speicheradresse einen Wert hat, der für DPI in Frage kommen würde. Eine Schleife von "100 bis 8200 step 100". Da der DPI Wert von 100 bis 8200 an der Maus einstellbar ist.
    Wurde so ein Wert in der Speicheradresse gefunden, dann geht das Programm davon aus, dass es sich um die DPI-Zahl der Maus handelt und gibt den aktuellen Wert wieder.


    Als nächstes sind wir nun bei dem Punkt, wo wir den ausgelesenen Wert auf dem Bildschirm "zeichnen" müssen. Darum habe ich mich noch nicht gekümmert. Wie ich bereits sagte, könnte man versuchen mit GDI+ auf dem gerade aktiven Bildschirm zu zeichnen.

  • Maus DPI abfragen

    • KloMeister
    • 2. Oktober 2014 um 20:03

    Du machst es mir hier nicht leicht :D

    Hier erstmal, damit du eigentlich weißt was du so macht:
    http://de.wikipedia.org/wiki/Zeiger_(Informatik))

    Es gibt quasi eine Speicheradresse, die den Wert deiner gesuchten immer neu zugeordneten Adresse trägt (Bzw. einen Wert der eine bestimmten Anzahl darüber oder darunter liegt). Manchmal muss man auch noch ein paar Bytes dazu addieren / subtrahieren.

    Wie findet man jetzt den Pointer?
    Ganz einfach, indem man seine gefundene HEX-Adresse (Die ja jedes mal anders ist) in Dezimal umwandelt und sucht ob es diesen Wert in einer anderen Adresse gespeichert gibt bzw. ob es einen ähnlichen Wert der in der nähe dieser Adresse liegt gibt, der aber immer die gleiche Logik besitzt.

  • Maus DPI abfragen

    • KloMeister
    • 2. Oktober 2014 um 11:58

    Kann ich gerne mal machen:

    Ich vermute mal im Internet gibt es da einige Tutorials, aber ich erkläre trotzdem mal, wie ich vorgegangen bin:

    1--> Programm starten


    2.-> Gewünschten Prozess mit dem Programm öffnen dazu -> "File" -> "Open Process" (Zu Welchem Process das Widget gehört müsstest du noch vorher herausfinden)

    3.->
    [Blockierte Grafik: http://www65.zippyshare.com/thumb/72962003/file.html]

    Wenn du den exakten Wert kennst, versuch es mit der DPI Zahl die in dem Widget steht, tippe ihn dort ein und drücke "OK"
    Nun hast du alle Adressen im Speicher dieses Prozesses gefunden, welche Momentan den Wert der Zahl haben die du eingegeben hast. Da der Prozesspeicher groß ist, gibt es mehrere. Nun musst du filtern.


    4.-> Filterung des Wertes:

    [Blockierte Grafik: http://www65.zippyshare.com/thumb/1974947/file.html]

    Du veränderst nun den DPI Wert so, dass er anders ist als er davor war und filterst den Wert wie im Bild (4.) gezeigt.
    Das machst du solange bis im Idealfall nurnoch 1 Wert überbleibt, der den entsprechenden Wert deiner DPI Zahl beinhaltet.

    Grüne Speicheradresse, sind diejenigen die "Fest" im Speicher zugeordnet sind, Schwarze Speicherwerte benötigen noch einen zusätzlichen Pointer, da diese Speicheradressen bei jedem Programmstart neu zugeordnet werden.
    Hoffen wir das du am Ende einen grünen Wert hast.


    Eventuell können wir das auch heute Abend oder an einem anderen Tag über Teamviewer machen, das scheint mir zeitsparender und effektiver zu sein.

  • Maus DPI abfragen

    • KloMeister
    • 2. Oktober 2014 um 10:01

    Hallo nochmal,

    Ich habe dir mal ein Beispiel zusammen gesucht und gebastelt, dass aus Winamp die aktuelle "Trackzeit" über ReadProcessMemory ausließt (Funktioniert vermutlich nur mit Winamp Version 5.666 Build 3516):

    [autoit][/autoit][autoit][/autoit][autoit]

    #include <WinAPI.au3>
    #include <MsgBoxConstants.au3>
    #include <Constants.au3>

    [/autoit][autoit][/autoit][autoit]

    Global $Process="Winamp.exe";Ersetze mit deinem Prozess
    Global $Pointer = 0x004B5E54; Ersetze mit deiner Adresse
    $handle=_WinAPI_OpenProcess(BitOR($PROCESS_VM_OPERATION,$PROCESS_VM_READ),False,ProcessExists($Process))
    $s=DllStructCreate("int")
    Local $read
    _WinAPI_ReadProcessMemory($handle,$Pointer,DllStructGetPtr($s),DllStructGetSize($s),$read)
    MsgBox(0,"Gelesener Wert",DllStructGetData($s,1))

    [/autoit]

    Wenn du wirklich die richtige Adresse hast, den Prozessnamen kennst und deine ermittelte Speicher-Adresse eine feste Adresse ist und somit keinen zusätzlichen Pointer benötigt, dann sollte alles laufen, wenn du die Daten entsprechend ersetzt.

    Bei weiteren Problemen kann ich notfalls auch mal mit Teamviewer drüber schauen.

  • Maus DPI abfragen

    • KloMeister
    • 1. Oktober 2014 um 21:07

    Ich vermute das ist eine Sache in der Maus-Hardware. Wenn du die DPI-Anzeige auf dem Desktop siehst, dann wird diese DPI Zahl vermutlich auch über einen Treiber ausgelesen.

    Die Mausgeschwindigkeit der Windows-Einstellung wäre leicht auszulesen und zu ändern, da dies über Windows geschieht. In deinem Fall wird die DPI-Zahl aber über die Maus geregelt, da ist es schwieriger.


    Einfachste Möglichkeit meinerseits, wäre es, die auf dem Desktop befindliche DPI-Zahl auszulesen. Da es sich vermutlich um kein auslesbares Steuerelement handelt, schlage ich "_WinAPI_ReadProcessMemory" vor.

    Ich schlage vor mit einem Memory-Searcher Tool (wie z.B. http://memoryhacking.com/download.php ) nach der Speicheradresse zu suchen.

    Dann kannst du mit Hilfe des Handle's und der Speicheradresse, den Wert auslesen und diesen hoffentlich über GDI+ in der aktuellen Anwendung auf dem Bildschirm zeichnen.


    Das hört sich jetzt erst mal sehr schwer an.
    So schwer ist es nicht, wenn man sich damit schonmal beschäftigt hat, aber als Anfänger wirst du vermutlich Probleme bekommen.
    Ich würde dir gerne einen Beispiel-Code schreiben, aber ich habe leider keinen Zugriff auf deine Maus sowie auf dein DPI-Desktop-Widget, um mir einen Eindruck über die Lage zu verschaffen.

    Du könntest Testweise erstmal versuchen ob du mit dem "Au3Info" Informationen bekommst, wenn du dieses auf das DPI-Anzeige-Widget ziehst. Falls nein, weißt du zumindest schon mal, dass du meinen genannten weg gehen musst.

  • Bitte um Hilfe Script zu berichtigen

    • KloMeister
    • 1. Oktober 2014 um 13:37
    Zitat

    Wie funzt den WINWAITACTIVE?

    Theoretisch kannst du folgenden Code:

    [autoit]

    if WinActive("[TITLE:dBase-Datenbank ausgeben;CLASS:#32770]") then ;Winactive geht nicht!
    ...

    [/autoit]

    Durch folgenden ersetzen:

    [autoit]

    WinWaitActive("[TITLE:dBase-Datenbank ausgeben;CLASS:#32770]")

    [/autoit]

    Und das EndIf, muss dann natürlich auch raus.

    Der Aufbau ist der selbe wie bei WinActive, nur dass die Schleife bzw. deine IF-Abfrage wegfällt .
    Siehe auch in der Hilfe: https://www.autoitscript.com/autoit3/docs/f…nWaitActive.htm

    Schnitzel, ja da stimme ich dir zu, dass in manchen Fällen auch ein Loop gebraucht wird. Hier allerdings (Auch gerade für Anfänger) ist WinWaitActive vermutlich etwas einfacher und übersichtlicher.

  • Bitte um Hilfe Script zu berichtigen

    • KloMeister
    • 1. Oktober 2014 um 12:43

    Wozu eine "WinActive"-Schleife erzeugen, wenn es bereits einen Befehl gibt, der diese Funktion übernimmt.

    Der Befehl dafür lautet: "WinWaitActive"

  • Link finden, der eine bestimmte class hat

    • KloMeister
    • 30. September 2014 um 11:32

    Also du könntest theoretisch den gesamten Quellcode der Seite herunterladen und mit Hilfe der "StringSplit"-Funktion oder der "StringInStr"-Funktion den Quellcode auf Vorhandensein von "class="weiter"" prüfen.

    Von der gefunden Position aus kannst du dann den Bereich in dem sich der eigentliche Link befindet zurückrechnen. Da muss man eben etwas filtern und splitten.

  • Button Aktion abfangen oder mit lesen.

    • KloMeister
    • 30. September 2014 um 11:01

    Also wenn ich jetzt dein Beispiel benutze (Habe Windows 7), dann wird der Klick bei dem Rechner trotzdem durchgeführt.
    Bei mir ist es komischerweise auch die * Taste die die "Instance 21" hat und nicht die = Taste (Aber das ist ja nebensächlich).

    Ich hatte das so verstanden, dass du einen Klick in einer fremden Anwendung abfangen willst und stattdessen deine Funktion aus dem eigenen Programm ausführen wolltest. Währenddessen ist die Funktion aus dem fremden Programm geblockt und deine Funktion wird bevorzugt dazwischen geschoben, erst dann wird der Cancel im eigentlichen Programm fortgeführt.


    Wenn es wirklich nur darum ging eine Aktion auszuführen nachdem der Chat geschlossen wurde, wären da noch wesentlich einfachere Möglichkeiten gewesen:

    Überwachung von Fenstern... Einfach in einer Schleife bzw. mit einem Timer abfragen ob eine Anwendung als Prozess oder als Fenstername noch existiert und falls nein, dann deinen Code ausführen.

    Das hätte ich dann Vorgeschlagen

    [autoit]

    ShellExecute("Calc")
    WinWait("[CLASS:CalcFrame]", "", 10)

    [/autoit][autoit][/autoit][autoit]

    ;Die Eigentliche Funktion, wenn Schleife nicht möglich eventuell Timer nutzen
    Do
    local $hCalc = WinGetHandle("[CLASS:CalcFrame]")
    until $hCalc ="0x00000000"
    msgbox(0,"","Rechner wurde geschlossen")

    [/autoit]


    Wenn bei dir alles funktioniert, dann ist die Sache ja gegessen.

  • Button Aktion abfangen oder mit lesen.

    • KloMeister
    • 29. September 2014 um 12:40

    Hallo

    Du brauchst dafür einen sogenannten "Hook". Damit kannst du Aktionen abfangen, bevor sie Windows ausführt, anders kommst du da nicht weiter.:
    http://msdn.microsoft.com/en-us/library/…9(v=vs.85).aspx

    Du kannst damit dann die "Cancel Notification" abfangen und deinem Programm sagen, was es machen soll, bevor der Cancel in dem eigentlichen Programm ausgeführt wird.

    Ich habe jetzt für AutoIT keine Beispiele parat, ich habe soetwas ähnliches damals mal mit Visual Basic 6.0 gebastelt (Alt + F4 systemweit abfangen und abblocken und darauffolgend eine andere Aktion ausführen).

    Aber vielleicht kannst du hier ein paar Infos entnehmen:
    http://www.autoitscript.com/forum/topic/12…twindowshookex/
    https://www.autoitscript.com/autoit3/docs/l…ndowsHookEx.htm


    Dein Workarround bringt ja in dem Fall eigentlich garnichts du hast folgendes geschrieben:

    Zitat

    Ich denke das muss doch irgendwie umzusetzen sein, dass ich den Klick auf den Button abfange und zu erst meine Ausführungen durchführe...

    Eine Funktion einer fremden Anwendungen abzufangen, bevor sie ausgeführt wird, geht nur mit einem "Hook". Mit deinem Workarround geht das leider nicht.

    Edit:
    Hier habe ich nochmal durch Suchen ein Script gefunden, welches fremde Fensteraktivitäten erkennt:
    http://www.autoitscript.com/forum/topic/81…rk/#entry584458

    Wenn du daraus die notwendigen Informationen entnimmst, solltest du eigentlich weiterkommen.

  • Aus Excel abgeleitet Dateistrukturen anlegen....

    • KloMeister
    • 25. September 2014 um 12:28

    Ich schätze mal du hast in der Schule kein Excel oder eine alte bzw. inkompatible Version, dann tritt dieser "Error" auf.

  • Dateipfad per StringRegExpReplace verändern

    • KloMeister
    • 22. September 2014 um 16:12

    Leichter ist das, aber er sagte ja:

    Zitat

    "StringTrim wäre eine Idee, aber der Pfad ist nicht immer gleich."

  • Lange Texte einlesen und in ComboBox ausgeben.

    • KloMeister
    • 20. September 2014 um 11:55

    Naja man könnte auch eine Art weitere "intelligente-Funktion" einbauen, die bevor die E-Mail rausgeht, nochmal die EditBox auf ihre Zeilenumbrüche prüft und dann automatisch vorm Absenden als E-Mail, die entsprechenden "<br>" hinzufügt.

    Es gibt sicher eine Möglichkeit ein EditControl auf vorhandene Zeilenumbrüche zu überprüfen. Am Ende werden dann eben soviele <br> eingebaut, dass es in der E-Mail so ausschaut wie im EditControl bzw. im Textdokument.

    Das ganze speicherst du dann eben in einer Variable und übergibst es dann mit deiner UDF als E-Mail.

    Dann sieht es für den User des Programs auch übersichtlicher aus, wenn dort nicht von vornherein die "<br>" drinstehen, sondern dies erst nachträglich für den User unsichtbar, in einer Variable geschieht.

  • Lange Texte einlesen und in ComboBox ausgeben.

    • KloMeister
    • 19. September 2014 um 13:36

    Du könntest für deine Textvorlage eine extern gelagerte Datei einlesen. Dann kannst du im nachhinein einfach die Textdatei bearbeiten und das Programm muss nicht neu kompiliert werden

    Damit du deine Variablen weiterhin hast, könntest du z.B. gewisse "KeyWörter" mit der Funktion "StringReplace" ersetzen.

    Beispielsweise:

    "Hallo Peter es ist gerade %Uhrzeit"

    Dann nimmst du die Replace Funktion:

    [autoit]

    local $Nachricht
    $Nachricht = stringreplace("Hallo Peter es ist gerade %Uhrzeit Uhr","%Uhrzeit",@HOUR & ":"& @MIN)
    msgbox(0,"",$Nachricht)

    [/autoit]

    Also einfach gewisse Keywörter aus der eingelesenen Textdatei, die du vorher definiert hast, mit dem Inhalt deiner Variablen in AutoIT ersetzen. Dann kannst du den Text in deiner externen Datei wie gewünscht verändern und deine "Variablen" beliebig einfügen.


    Edit: 14:30
    Ich habe dir nochmal ein größeres Beispiel vorbereitet mit Text - Ladefunktion, das sollte deinen Wünschen schon relativ nahe kommen, siehe die .zip im Dateianhang!

    Dateien

    Replace_Beispiel.zip 1,25 kB – 346 Downloads

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™