Strg, Strg -> Doppelklick

  • Hallo Leute,
    ein Kollege von mir möchte gerne ein "Makro", das im Hintergrund läuft, wenig Ressourcen verbraucht und bei zweimaligem Strg-Klick an der Stelle des Cursors in einem Editor eine Maus-Doppelklick ausführt.
    Nach einiger Bastelei bin ich auf u.g. Versuch gekommen; allerdings ist die Lösung alles andere als stabil; meist hängt sich die Strg-Abfrage auf und blockiert die Strg-Eingabe, wie wenn dauernd die Taste gedrückt wäre.
    Wie kann ich die Aufgabe lösen? Ich müsste ja irgendwie vorgeben, in welchem Zeitraum nochmal die Strg-Taste gedrückt werden muss, damit die Funktion nicht wieder abfällt. Außerdem: Habt ihr Erfahrungen mit dem Feststellen von Cursorpositionen in Editoren oder probiert ihr einfach den "Versatz" aus?

    Danke für eure Antworten.

    [autoit]

    #include <Misc.au3>
    AutoItSetOption("OnExitFunc","Terminate")
    HotKeySet("^+{F9}","Terminate")

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

    Local $dll = DllOpen("user32.dll")

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

    Local $a = 0
    Local $b[2]

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

    While 1
    $restart = 0
    If _IsPressed("A2", $dll) Then
    While 1
    If $Restart == 1 Then ExitLoop
    Sleep(10)

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

    If Not _IsPressed("A2", $dll) Then
    While 1
    If $Restart == 1 Then ExitLoop
    Sleep(10)

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

    If _IsPressed("A2", $dll) Then
    Sleep(20)
    $b = _CaretPos()
    If Not @error Then
    Blockinput(1)
    MouseClick("left",$b[0], $b[1],2)
    Blockinput(0)
    EndIf
    $Restart = 1
    EndIf
    $a = $a + 1
    If $a = 100 Then
    $Restart = 1
    $a = 0
    EndIf
    WEnd
    EndIf
    Sleep(10)
    $a = $a + 1
    If $a = 100 Then
    $Restart = 1
    $a = 0
    EndIf
    WEnd
    EndIf
    WEnd

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

    ; More reliable method to get caret coords in MDI text editors.
    Func _CaretPos()
    Local $x_adjust = 0
    Local $y_adjust = 5

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

    Opt("CaretCoordMode", 0) ;relative mode
    Local $c = WinGetCaretPos() ;relative caret coords
    Local $w = WinGetPos("") ;window's coords
    Local $f = ControlGetFocus("","") ;text region "handle"
    Local $e = ControlGetPos("", "", $f) ;text region coords

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

    Local $t[2]
    If IsArray($c) and IsArray($w) and IsArray($e) Then
    $t[0] = $c[0] + $w[0] + $e[0] + $x_adjust
    $t[1] = $c[1] + $w[1] + $e[1] + $y_adjust
    Return $t ;absolute screen coords of caret cursor
    Else
    SetError(1)
    EndIf
    EndFunc

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

    Func Terminate()
    DllClose($dll)
    Exit 0
    EndFunc

    [/autoit]
  • Für die Mausposition, gibt es den Befehl "MouseGetPos".
    Also wenn du an der Cursorposition einen Doppelklick ausführen willst, dann geht das ganz einfach so.

    Spoiler anzeigen
    [autoit]


    $MausPos = MouseGetPos() ; Mit dieser Funktion wird ein Array erzeugt, in $MausPos[0] wird die X-Position und in $MausPos[1] wird die Y-Position des Cursors gespeichert.
    MouseClick("left", $MausPos[0], $MausPos[1], 2)

    [/autoit]

    Aber einfach mal in die AutoIt Hilf gucken, da gibt es auch meistens Hilfe.
    Ich hoffe ich konnte dir einmal helfen.

    [EDIT]
    Kann die Tastenkombination(Strg, Strg) für den Doppelklick nicht einfach anderst sein, weil ich schätze mal, dass das Überprüfen von den Steurungstasten hintereinander nicht recht einfach werden wird.

    2 Mal editiert, zuletzt von morfi93 (3. Juli 2008 um 21:56)

  • Hi morphi93,
    das mit MouseGetPos ist klar. Ich hole allerdings hier die CURSOR-Position, also dort wo der blinkende Strich im Editor steht ab. Parallel dazu wäre WinGetCaretPos() möglich, was aber laut Hilfe meist nicht so gut ist; dort wird die Funktion _CaretPos() siehe unten vorgeschlagen.
    Andere Tastenkombi als Strg, Strg wäre natürlich einfacher, könnte ich natürlich leicht selber machen aber ich bin gerne anspruchsvoll und lerne mit euren Vorschlägen dazu ;) . Wenn ich immer den einfachsten Weg suchen würde, bliebe ich ja auf nem niedriegen Stand... ;(

  • Ok, sorry für meinen dummen Post, habe es dann auch selbst mitbekommen ^^

    Stimmt auch wieder mit der Beanspruchung ^^

    Achja: Mich schreibt man mit f (morfi93) und nicht mit ph (morphi93), sollte nur ein kleiner Hinweis gewesen sein^^

  • Hey,
    sorry; bin heut abend bissl verplant, hab deinen Namen 3mal falsch geschrieben und immer wieder editiert...naja, jetzt hab ichs:

    morfi93

  • Ach, wegen meinem Namen brauchst du dir keine Sorge nicht machen. ^^
    War ja nur ein kleiner Hinweis

  • Hallo Leute,

    ein Kollege empfahl mir die Verwendung von AdlibEnable() bzw. AdlibDisable(). Allerdings weiß ich nicht, wie ich das in meinem Fall am Besten anwenden soll, im Prinzip deckt eine "While 1"-Schleife mit "Sleep(250)" ja das gleiche ab wie ein "AdlibEnable()" oder liege ich da falsch? Kann ich mit der AdlibEnable()-Funktion mehr anfangen, was mich weiterbringen könnte?