Laden...

Autoklicken bei MouseDown

Erstellt von Let it Burn vor 10 Jahren Letzter Beitrag vor 10 Jahren 1.628 Views
L
Let it Burn Themenstarter:in
21 Beiträge seit 2013
vor 10 Jahren
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

49.485 Beiträge seit 2005
vor 10 Jahren

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

L
Let it Burn Themenstarter:in
21 Beiträge seit 2013
vor 10 Jahren

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?

49.485 Beiträge seit 2005
vor 10 Jahren

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

L
Let it Burn Themenstarter:in
21 Beiträge seit 2013
vor 10 Jahren

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);
            }
        }

T
156 Beiträge seit 2012
vor 10 Jahren

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

49.485 Beiträge seit 2005
vor 10 Jahren

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

L
Let it Burn Themenstarter:in
21 Beiträge seit 2013
vor 10 Jahren

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?

T
156 Beiträge seit 2012
vor 10 Jahren

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