Laden...

Autoklicken bei MouseDown

Letzter Beitrag vor 11 Jahren 9 Posts 1.757 Views
Autoklicken bei MouseDown

Hallo,
ich möchte, wenn ich die Maustaste gedrückt halte ein Dauerklicken an das Programm senden.
Für den MouseHook benutze ich den GlobalMouseKeyHook.
Allerdings weißt ich jetzt nicht wie ich das löse, dass nur bei gedrückter Maustaste Klicks gesendet werden.
Kann mir da jemand einen Tipp geben?

Gruß
Let it Burn

Hallo Let it Burn,

starte im MouseDown einen Timer, dessen EventHandler dann die gewünschten Events auslöst. Im MouseUp stoppst du den Timer wieder.

herbivore

Danke für deine Antwort 👍.
Werd ich gleich mal ausprobieren 😁

Ich sende die Mausklicks mit der mouse_event Funktion aus der WinApi. Wird das vom Hook auch als Klick abgefangen?

Hallo Let it Burn,

da du das leicht ausprobieren kannst, ist das keine Frage fürs Forum. Jetzt wo du aber schon gefragt hast, solltest du nach dem Ausprobieren die Antwort hier posten.

herbivore

Ok, das war wirklich nicht weit gedacht, Entschuldigung...

Ich habe es ausprobiert und festgestellt, dass mouse_event auch die vom Hook abgefangen wird.

Das bedeutet leider, dass mein Timer schon gestoppt wird, wenn ich MouseUp für die simulierten Klicks auslöse.
Dann muss ich irgendwie noch was einbauen, um zu prüfen, ob MouseUp vom Programm ausgelöst wird. Kann ich das vielleicht mit einem Bool Wert machen, oder würde das zu Verzögerungen führen?
Ich weiß, dass ich auch noch an die Threadsicherheit denken muss.

Wenn noch jemand Ideen hat, würde ich mich über Anregungen freuen =)

Grüße
Let it Burn

Edit: Ich möchte, wenn AutoKlicken deaktiviert ist, bei Mausklick ein gedrückte Taste simulieren.
dazu benutze ich im MouseDown Event die SendMessage Funktion, allerdings wird die Taste nicht mehr losgelassen:

        void m_MouseHookManager_MouseUp(object sender, MouseEventArgs e)
        {
            [...]
            else if (e.Button == System.Windows.Forms.MouseButtons.Left)
            {
                SendMessage(mainhandle, WM_KEYUP, (int)Keys.P, 0);
            }
        }


        void m_MouseHookManager_MouseDown(object sender, MouseEventArgs e)
        {
           [...]
            else if (e.Button == System.Windows.Forms.MouseButtons.Left)
            {
                SendMessage(mainhandle, WM_KEYDOWN, (int)Keys.P, 0);
            }
        }

Hallo Let it Burn,
hast Du versucht vom Timer einfach die EventMethode aufzurufen?
Quasi das Event zu simulieren statt auszulösen?

Viele Grüße,
telfa

Hallo telfa,

ich bin kein Fan davon, EventHandler direkt aufzurufen. Dann besser die eigentliche Logik in eine extra Methode mit "vernünftigen" Parametern packen und diese aus dem EventHandler und der anderen Stelle aufrufen.

Hallo Let it Burn,

Dann muss ich irgendwie noch was einbauen, um zu prüfen, ob MouseUp vom Programm ausgelöst wird.

siehe [FAQ] Event nur bei Benutzeraktion auslösen, nicht bei programmtechnischer Änderung.

herbivore

Danke für den Link herbivore. Da war ich mit den Bool Variable schonmal richtig.

Hat jemand noch eine Lösung für mein zweites Problem?

Hallo herbivore,

da stimme ich Dir gerne zu. Ein Aufruf von Event-Methoden ist nicht sehr sauber.

Hallo Let it Burn,
zum zweiten Problem habe ich im Augenblick leider keine Idee.

Viele Grüße,
telfa