Nach drücken von STRG(rechts) eine bestimmte Mausposition anklicken

    • Offizieller Beitrag

    Hi!

    Das Problem ist, wie LANGE du die Taste drückst. Wenn es weniger als die Sleepzeit gedrückt bleibt, dann wird es nicht erfasst, es ist dann als hättest du die Taste nicht gedrückt.
    Sleep rausmachen ist keine gute Idee, dann hast du 100% (50% bei Dual-Core) Rechnerlast ;).
    Ich guck mal kurz nach der äquivalenten Lösung mit HotKeySet.

    Edit Code:

    [autoit]

    HotKeySet("{RCTRL}", "_move")

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

    While True
    Sleep(1000000)
    WEnd

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

    Func _move()
    $pos = MouseGetPos()
    MouseClick("left", 450, 800)
    MouseMove($pos[0], $pos[1])
    EndFunc ;==>_move

    [/autoit]

    So wäre es für Strg Rechts. Leider lässt sich das - wie oben bereits befürchtet - nicht als HotKey setzen, weil es ein Modifier Key ist.
    Alternativ mit einer anderen Taste:

    [autoit]

    HotKeySet("{F4}", "_move")
    HotKeySet("^w", "_move") ; Strg+w

    [/autoit]

    (Eines davon aussuchen und oben ersetzen.)

    peethebee

  • [autoit]

    #include <Misc.au3>

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

    HotKeySet("{esc}","_ende")

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

    while 1
    HotKeySet("{F4}", "_move")
    WEnd

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

    Func _move()
    $pos= MouseGetPos()
    MouseClick("left", 450, 800)
    MouseMove($pos[0],$pos[1])
    endfunc

    Func _ende()
    Exit

    endfunc

    [/autoit]

    das stimmt

    n bissi optimirt mit exit hotkey

  • Hallo zusammen!

    Vielen lieben Dank das ihr weiterhin versucht es zu verbessern! :D

    Also, ich hab jetzt ein paar Stunden mit gearbeitet (OHNE Sleep) und kann folgendes berichten:

    1. Es taugt und funktioniert in der Praxis einwandfrei!
    2. Klar, durch das entfernen von Sleep hämmert das Teil durch, wenn man mal länger als nen Bruchteil STRG drückt ;)
    3. Selbst bei 10 Sekunden dauerdrücken juckt das die CPU recht wenig (Q 6600 = 4x2,4 GHz) und bleibt im Schnitt bei 50-65%. Also Leistungstechnisch kein Problem aber sicherlich eine Verschwendung an Leistung und Strom.

    ---

    Danke vielmals an peethebee und die anderen die an einer HotKey Lösung arbeiten, aber das macht wenig Sinn da es fast zwingend die STRG rechts Taste sein muss die ich beim arbeiten und editieren der Videos zu 100% optimal erreiche - eine andere Taste kommt also nur unter Protest in Frage ;)

    ---

    Also wäre das vorhandene Script... vielleicht noch zu optimieren?!
    (das hier)

    [autoit]

    #include <Misc.au3>

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

    $dll = DllOpen("user32.dll")

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

    While 1
    If WinActive("MAGIX Video") Then
    If _IsPressed("A3", $dll) Then
    $pos = MouseGetPos()
    MouseClick("left", 1595, 390, 1, 0)
    MouseMove($pos[0], $pos[1], 0)
    EndIf
    EndIf
    WEnd

    [/autoit]

    Meine Idee wäre das Sleep wieder einzubauen, allerdings nicht VOR der Tastenabfrage, sondern danach!
    Und zwar für 500 ms - Also so:

    [autoit]

    #include <Misc.au3>

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

    $dll = DllOpen("user32.dll")

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

    While 1
    If WinActive("MAGIX Video") Then
    If _IsPressed("A3", $dll) Then
    $pos = MouseGetPos()
    MouseClick("left", 1595, 390, 1, 0)
    MouseMove($pos[0], $pos[1], 0)
    Sleep ( 500 )
    EndIf
    EndIf
    WEnd

    [/autoit]

    Warum? Um einfach eine hohe Auslastung und Dauernutzung zu verhindern, wenn man mal länger als einen Augenblick die Taste drückt.
    Ich hoffe ihr versteht was ich meine?! - Was meint ihr dazu?

    Denn wenn ich es richtig verstanden habe, passiert doch folgendes oder?

    Spoiler anzeigen

    1.
    Variante mit Sleep (500) vor If _IsPressed:
    Ich muss die STRG Taste mindestens 500 ms drücken, damit es loshämmert.
    2.
    Variante mit Sleep (500) nach MouseMove:
    Nachdem ich STRG gedrückt habe wäre die Taste für 500 ms "gesperrt", ein loshämmern würde also verhindert wenn ich die Taste nur kurz drücke.

    Richtig so?

    Liebe grüße

    Einmal editiert, zuletzt von eugen723674 (8. April 2009 um 19:57)

  • Ja, aber beide meiner Vorschläge sind doch in der while schleife peethebee :)

    Aber soweit ich das verstehe ist es doch so, dass ich verhindern will dass das Script losrennt wie blöd - also permanent klickt wenn ich länger als einen Bruchteil einer Sekunde die Taste drücke, richtig?

    Wenn ich also das Sleep am Anfang der Schleife habe, dann muss ich zum Beispiel 500 ms die Taste drücken bis es "auslöst", richtig? Wenn ich dann aber nicht sofort wieder nach 500-510 ms die taste loslasse raßt es trotzdem los, solange bis ich den Finger runternehme.

    Erste Variante
    Wenn ich dagegen jedoch das Sleep ans Ende der Schleife setze, dann sollte das doch wie eine kurze Blockade der Taste wirken, nachdem ich sie gedrückt habe. Oder sehe ich das falsch?

    Zweite Variante
    Ich drücke die Taste, es wird instant die Schleife aberbeitet und "geklickt". Sollte ich dann immer noch auf der Taste sein würde er 500ms nicht wieder ausführen, da eben im Sleep. Richtig?

    Extrembeispiel:
    Würde ich das Sleep ans Ende der Schleife hängen und z.b. mal 5000 ms angeben, dann würde das doch lapidar gesagt nichts anderes bedeuten als das ich alle 5 sekunden maximal einmal die taste drücken kann und das script abarbeitet wird, oder?

    Daher fragte ich ob die zweite Variante nicht logischer aka besser wäre.

  • Alkso, habs gerade mal so getestet:

    [autoit]


    #include <Misc.au3>

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

    $dll = DllOpen("user32.dll")

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

    While 1
    If WinActive("MAGIX Video") Then
    If _IsPressed("A3", $dll) Then
    $pos = MouseGetPos()
    MouseClick("left", 1595, 390, 1, 0)
    MouseMove($pos[0], $pos[1], 0)
    Sleep (5000)
    EndIf
    EndIf
    WEnd

    [/autoit]

    Wie ich sagte ... funktioniert prima. In diesem Fall wird die Taste 5 Sekunden gesperrt, nachdem ich sie gedrückt habe. Somit ist keine Endlosschleife möglich und das sollte doch ausreichend entlasten, auch wenn ich mal ne Sekunde vergesse die Taste loszulassen ;)

    Was meinste? ... Ok in der Praix reichen wahrscheinlich 500ms oder 1000ms ... war ja nur zum testen.

    • Offizieller Beitrag

    Das Zusatzproblem hatte ich gar nicht bedacht. Mein Problem ist, dass er jetzt immer _IsPressed checkt, dass macht Volllast (auf einem Core).

    Dazu muss noch ein Sleep her, das wiederum dafür sorgt, dass er Tastendrücke, die kürzer sind als dieses Sleep, nicht erfassen kann.

    peethebee

  • Du sprichst für mich in Rästeln :huh:

    Könntest du deine Aussagen etwas ausführlicher erläutern? Kann deinen Gedankengängen nicht ganz folgen ;)

    Und was meinste nun zu meinem Vorschlag bzw zur letzten aktuellen Version:

    [autoit]

    #include <Misc.au3>

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

    $dll = DllOpen("user32.dll")

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

    While 1
    If WinActive("MAGIX Video") Then
    If _IsPressed("A3", $dll) Then
    $pos = MouseGetPos()
    MouseClick("left", 1595, 390, 1, 0)
    MouseMove($pos[0], $pos[1], 0)
    Sleep (1000)
    EndIf
    EndIf
    WEnd

    [/autoit]

    Kann ich das so lassen oder noch ne Verbesserung parat? :)

    • Offizieller Beitrag

    Hallo,

    Welche Last erzeugt das bei dir?

    [autoit]

    #include <Misc.au3>

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

    $dll = DllOpen("user32.dll")

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

    While 1
    If WinActive("MAGIX Video") Then
    If _IsPressed("A3", $dll) Then
    $pos = MouseGetPos()
    MouseClick("left", 1595, 390, 1, 0)
    MouseMove($pos[0], $pos[1], 0)
    Sleep (1000)
    EndIf
    EndIf
    WEnd

    [/autoit]


    Es muss ein Core voll sein, weil permanent, ohne Pause, immer, dauernd, 24 Stunden am Tag, If WinActive("") bzw. (wenn das Fenster aktiv ist) If _IsPressed() ausgeführt wird. Pause ist ja nur dann, wenn du gerade eine Taste gedrückt hattest.

    Was tu tun musst, ist folgendes:

    [autoit]

    #include <Misc.au3>

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

    $dll = DllOpen("user32.dll")

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

    While 1
    If WinActive("MAGIX Video") Then
    If _IsPressed("A3", $dll) Then
    $pos = MouseGetPos()
    MouseClick("left", 1595, 390, 1, 0)
    MouseMove($pos[0], $pos[1], 0)
    Sleep (1000)
    EndIf
    EndIf
    Sleep(25)
    WEnd

    [/autoit]

    Dann macht er nach jedem Durchlauf (Zeitaufwand < 1ms, vermute ich) 25 ms Pause.
    Falls du allerdings genau in diesen 25ms Strg drückst und wieder loslässt, dann kommt das nie bei ihm an, weil er ja in der Zeit bei keinem _IsPressed-Test vorbeischaut. Daher ist die Abwägung zwischen Last und Genauigkeit schwierig. Dieses Polling der Tastendrücke ist nie optimal und sollte vermieden werden. Ein Notifying-System wie HotKeySet meldet sich, wenn es einen Tastendruck gibt, du musst nicht selbst (meistens erfolglos) nachgucken. Dadurch wird die Durchschnittslast deutlich reduziert und die Genauigkeit erhöht. Einziger Nachteil in deinem Fall ist eben, dass Strg nicht einzeln aufgefangen werden kann.

    Ich hoffe, dass es jetzt klar ist :).

    peethebee

  • Ohja, danke, das war sehr ausführlich und so das auch ich es verstehe als Laie :)

    Danke!

    Und oha, ja da haste recht, habe ich gar nicht drauf geachtet :(
    Ein Kern ist dann bei ca 70-80% perma belastung wenn aktiv.
    Nicht schlimm aber muss ja nicht sein, heizt nur die CPU auf und kostet Strom.
    Was mich allerdings wundert ist die Tatsache das ich beim testen überhaupt kein magix Video an hatte geschweige denn aktives Fenster auf hatte, wieso ist die Last trotzdem hoch gegangen? Er dürfte doch nur dann _IsPressed prüfen wenn das fenster aktiv ist .. mhhh.

    Ok, also nicht nicht so optimal meine Lösung ;(
    Ich verstehe auch das die Hotkey Lösung die besser wäre, gar keine Frage,
    aber ist halt total blöd das man die CTRL nicht ansteurn kann :(

    Zu deiner Idee:
    Ok, werde ich mal versuchen, aber verstehen tue ich es leider nicht. Denn selbst wenn er nach jedem Tastendruck dann 25 ms Pause macht (also NICHT überprüft ob die Taste gedrückt ist / also keine Last), dann macht er doch genau das NACH diesen 25ms wieder genau so lange bis ich mal wieder die Taste gedrückt habe, oder?

    Der Ablauf wäre dann also:
    Nur wenn das Fenster Magix Video aktiv ist -> prüfe permanent ob STRG rechts gedrückt ist -> wenn ja: "mach deinen job" und geh dann 1000ms schlafen -> Nachdem du 1s geschlafen hast mach nochmal 25ms pause und dann fang von vorne an.

    Das heisst die CPU hätte gerade mal 1000 + 25ms um Luft zu schnappen, denn danach würde er ja wieder permanent testen ob die Taste gedrückt ist.

    Oder sehe ich das falsch?

    2 Mal editiert, zuletzt von eugen723674 (9. April 2009 um 00:53)

  • Er läuft die schleife 1 mal durch, das dauert ca. 1ms oder weniger. dann die 25ms pause, dann läuft er wieder die schleife durch mit 1ms und dann die 25ms pause... das entlastet den cpu ungemein.

  • Ahhh, ok ich verstehe ... :D

    Also wäre der Wert (25ms) je höher, umso besser - jedoch auch je höher, umso anfälliger da er in der Zeit auf kein STRG Tastendruck reagiert :(
    Das ich echt blöd ... Da er bei 25 ms von jeder Sekunde fast 95% der zeit nicht auf tastendruck checken würde und man immer die eine ms treffen müsste die er gerade auf tastendruck überprüft ;( Ziemlich beschissene Trefferquote würde ich sagen .. lol.

    Da wäre eine Hotkey Lösung echt besser, da er dann ja einfach "schläft" und wartet bis jemand die Taste drückt.
    Hat nicht jemand ne Idee obs nicht vielleicht nen Trick gibt wie man sowas mit der STRG Taste machen könnte?

    Zur Not (aber nur wenns mit der STRG (rechts) echt nicht geht wäre als suboptimaler Ansatz noch die rechte Maustaste oder die Taste die auf der 0 des Ziffernblocks liegt möglich, glaube das ist Einfg (ist auf meiner Tastatur aktuell nicht aufgezeichnet - nur die Nummern).

    Oder ich muss zur Not eben damit Leben das ein Kern unter Dauerbelastung steht :( Dafür würde er dann aber auf jeden Tastendruck zu 100% reagieren.

    2 Mal editiert, zuletzt von eugen723674 (9. April 2009 um 01:11)

  • Du könntest den SLeep auf 10ms setzen ist der Minimalwert. Aber obs hilft weiss ich nicht.

  • Hallo, das ist so nicht ganz richtig.
    Wenn du die Taste während des sleeps von 50ms drückst, wird der Tastendruck im Regelfall trozdem erkannt, da du die Taste i.d.R. locker 50ms lange drückst. Wenn die Schleife also wieder das _IsPressed erreicht und du noch auf der Taste bist, wird diese als gedrückt erkannt. Im Regelfall sollte jeder Tastendruck bei 50ms erkannt werden. Es ist sogar z. T. fast das Gegenteil der Fall. Es kann passieren das er 2x den Tastendruck erkennt, du musst halt dafür sorgen das die _IsPressed Bedingung auch seine Zeit benötigt und nicht sofort wieder zu Ende ist. Hier mal ein Beispiel, beim Code immer rechtes ctrl drücken:

    Spoiler anzeigen
    [autoit]

    #include <Misc.au3>

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

    $dll = DllOpen("user32.dll")
    $a = 0
    ToolTip($a)
    While 1
    If _IsPressed("A3", $dll) Then
    $a += 1
    ToolTip($a)
    Sleep(50)
    EndIf
    Sleep(50)
    WEnd

    [/autoit]
  • Mhhh ok, das heisst ihr würdet mir doch raten meine aktuelle Lösung weiter zu nutzen aber die Pause von 50 ms am ende reinzunehmen, um die Last runterzufahren?

    Also so:

    [autoit]

    #include <Misc.au3>

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

    $dll = DllOpen("user32.dll")

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

    While 1
    If WinActive("MAGIX Video") Then
    If _IsPressed("A3", $dll) Then
    $pos = MouseGetPos()
    MouseClick("left", 1595, 390, 1, 0)
    MouseMove($pos[0], $pos[1], 0)
    Sleep (1000)
    EndIf
    EndIf
    Sleep (50)
    WEnd

    [/autoit]

    Mhhh, ich habs jetzt mal so komoiliert und teste es mal in der Praxis.
    Weitere Vorschläge (vor allem im Bezug auf eine pasable HotKey Lösung) werden natürlich weiterhin gerne angenommen ;)
    Melde mich nachher nochmal wie es in der Praxis mit der o.g. Lösung funktioniert und wie die Last ist.

    (Und wenn jemand Zeit und Lust hat kann er mir ja mal erklären wieso die Last hochgeht wenn ich das Script starte aber noch gar kein "MAGIX Video" Fenster offen geschweige denn aktiv ist - komisch oder?)