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")
Local $dll = DllOpen("user32.dll")
[/autoit][autoit][/autoit][autoit]Local $a = 0
Local $b[2]
While 1
$restart = 0
If _IsPressed("A2", $dll) Then
While 1
If $Restart == 1 Then ExitLoop
Sleep(10)
If Not _IsPressed("A2", $dll) Then
While 1
If $Restart == 1 Then ExitLoop
Sleep(10)
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
; More reliable method to get caret coords in MDI text editors.
Func _CaretPos()
Local $x_adjust = 0
Local $y_adjust = 5
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
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
Func Terminate()
DllClose($dll)
Exit 0
EndFunc