Autor Beitrag
markusmayer123
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18



BeitragVerfasst: Fr 23.02.18 00:15 
Hallo,

ich bin neu in dem Forum und entschuldige mich vorab, wenn ich in einer falschen Sektion poste:D


Ich beschäftige mich aktuell mit folgender Bibliothek: archive.codeplex.com/?p=keyboardmousehooks

Hierbei stehe ich vor folgendem Problem:

Ich würde gerne eine Schleife programmieren, welche solange ich die linke Maustaste gedrückt halte,
eine einfache Konsolenausgabe ausgibt.

Die folgende While-Schleife funktioniert natürlich nicht:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
private void MouseHook_LeftButtonUp(RamGecTools.MouseHook.MSLLHOOKSTRUCT mouseStruct)
{
     gedrückt = false;
}

private void MouseHook_LeftButtonDown(RamGecTools.MouseHook.MSLLHOOKSTRUCT mouseStruct)
{
    gedrückt = true;
}

public void MouseMoved(object sender, MouseEventArgs e)
{
    while(gedrückt == true)
    {
        Console.Writeline("abc");
    }
}


Moderiert von user profile iconTh69: C#-Tags hinzugefügt
Moderiert von user profile iconTh69: Topic aus C# - Die Sprache verschoben am Fr 23.02.2018 um 09:10
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 23.02.18 00:56 
- Nachträglich durch die Entwickler-Ecke gelöscht -
markusmayer123 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18



BeitragVerfasst: Fr 23.02.18 01:07 
Hi, vielen Dank für deine Antwort.

Ja, du meinst vermutlich das hier:
ausblenden C#-Quelltext
1:
2:
3:
mouseHook.LeftButtonDown += new RamGecTools.MouseHook.MouseHookCallback(MouseHook_LeftButtonDown);
mouseHook.LeftButtonUp += new RamGecTools.MouseHook.MouseHookCallback(MouseHook_LeftButtonUp);
mouseHook.Install();

Das habe ich in Form1_Load geschrieben.

Ich könnte also mit GetAsyncKeyState() einfach direkt abfragen, ob die Taste aktuell gedrückt wird und sobald sie losgelassen wird, aus der Schleife springen?

LG

Moderiert von user profile iconTh69: C#-Tags hinzugefügt
Moderiert von user profile iconTh69: Vollzitat entfernt
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 23.02.18 01:25 
- Nachträglich durch die Entwickler-Ecke gelöscht -
markusmayer123 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18



BeitragVerfasst: Fr 23.02.18 12:37 
Also die Ausgabe an sich funktioniert ja wunderbar.

Ich würde nur gerne ausgeben, während die linke Maustaste gedrückt ist. Sobald die nicht mehr gedrückt wird, wird ein Wert auf False gesetzt und die Ausgabe wird gestoppt.

Leider hat das mit While-Schleife nicht wirklich funktioniert.

Moderiert von user profile iconTh69: Vollzitat entfernt.
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 23.02.18 13:25 
- Nachträglich durch die Entwickler-Ecke gelöscht -
markusmayer123 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18



BeitragVerfasst: Fr 23.02.18 13:40 
Verzeihung, ich habe mich nicht klar ausgedrückt.

Das hier zum Beispiel funktioniert mit der Konsolenausgabe wunderbar. Allerdings nur einmalig bei einem Linksklick.
Jetzt will ich es irgendwie schaffen im MouseMoved Block eine Schleife zu schreiben, die solange eine Konsolenausgabe wie z.B. Console.WriteLine("taste wird gedrückt"); ausgibt, solange die linke Maustaste gedrückt gehalten wird.
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
private void MouseHook_LeftButtonUp(RamGecTools.MouseHook.MSLLHOOKSTRUCT mouseStruct)
{
    gedrückt = false;
}

private void MouseHook_LeftButtonDown(RamGecTools.MouseHook.MSLLHOOKSTRUCT mouseStruct)
{
    gedrückt = true;
}
     
public void MouseMoved(object sender, MouseEventArgs e)
{
    if (gedrückt == true)
    {
        Console.WriteLine("taste wird gedrückt");
    }
}


Moderiert von user profile iconTh69: Vollzitat entfernt.
Moderiert von user profile iconTh69: C#-Tags hinzugefügt
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 23.02.18 13:58 
- Nachträglich durch die Entwickler-Ecke gelöscht -
markusmayer123 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18



BeitragVerfasst: Fr 23.02.18 14:22 
-Ich habe mir überlegt im MouseMoved Block eine While-Schleife einzubauen, um zu überprüfen, ob die Linke Maustaste noch immer gedrückt ist und wenn ja, dass eine Konsolenausgabe erfolgt, solange der Wert true ist. Dafür habe ich den Wert "gedrückt" als boolean deklariert und setzte sie mit mouseup/mousedown auf false/true.

-Das Ereignis MouseMoved soll später dafür verwendet werden, um den Cursor zu einem bestimmten Punkt zu bewegen, während die Linke Maustaste gedrückt wird.
Zum Beispiel soll das Ereignis das hier ausführen:
Allerdings nicht die ganze Zeit, sondern wirklich nur während die Maustaste gedrückt wird.
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
while(gedrückt == true)
{
    Cursor.Position = new Point(Cursor.Position.X, Cursor.Position.Y + 15);
    System.Threading.Thread.Sleep(25);
}


-Ich benötige die MouseHook-Klasse, damit ich außerhalb der Form prüfen kann, ob eine Maustaste gedrückt wird.

-Das Konsolenfenster habe ich nur als Testmittel genutzt. Ich wollte dadurch schauen, ob ich solange ich die linke Maustaste gedrückt halte eine Konsolenausgabe machen kann.


Ich hoffe ich konnte deine Fragen einigermaßen beantworten.

Vielen Dank für deine Hilfe!


LG

Moderiert von user profile iconTh69: Vollzitat entfernt.
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4464
Erhaltene Danke: 919


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Fr 23.02.18 14:33 
Zitat:
Ich benötige die MouseHook-Klasse, damit ich außerhalb der Form prüfen kann, ob eine Maustaste gedrückt wird.


Dir ist aber bewußt das der MouseMove Event den du scheinbar benutzt nur dann feuert wenn das Control an dem du den Event verdrahtet hast auch das Control ist über dem sich der Mouse Cursor gerade befindet?
markusmayer123 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18



BeitragVerfasst: Fr 23.02.18 14:54 
Hi, erstmal Danke für deine Antwort.

Sorry hätte vielleicht noch hinzufügen sollen, dass MouseMoved ebenfalls von einer MouseHook-Klasse verwendet wird.
Hier wird die Methode MouseMoved registriert in der Main()
ausblenden C#-Quelltext
1:
actHook.OnMouseActivity += new MouseEventHandler(MouseMoved);					


Moderiert von user profile iconTh69: Vollzitat entfernt.
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4259
Erhaltene Danke: 911

Win10
C#, C++ (VS 2015/17)
BeitragVerfasst: Fr 23.02.18 14:56 
Für wiederholende Aufgaben benutze einen Timer (ansonsten blockierst du mit der Schleife alle weiteren UI- bzw. MouseHook-Aktivitäten).

PS: Bitte keine ganzen Beiträge zitieren.

Für diesen Beitrag haben gedankt: markusmayer123
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4464
Erhaltene Danke: 919


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Fr 23.02.18 16:41 
Zitat:
Sorry hätte vielleicht noch hinzufügen sollen, dass MouseMoved ebenfalls von einer MouseHook-Klasse verwendet wird.


Meine Nase sagt mir das da was stinkt ;)
Ich bezweifle das der Move Event eine winformstypische Sender,EventArgs-Signatur hat die anderen Events der Klasse aber mit einem eigenen struct arbeiten.
Das klingt total sinnfrei da die interna bei den Hooks die gleichen sind. Da macht mann die Eventsignaturen nicht einfach so unterschiedlich.
markusmayer123 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18



BeitragVerfasst: Fr 23.02.18 16:55 
user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
Für wiederholende Aufgaben benutze einen Timer (ansonsten blockierst du mit der Schleife alle weiteren UI- bzw. MouseHook-Aktivitäten).

Hi, vielen Dank für deine Antwort.

Ich werde es mal versuchen.

user profile iconRalf Jansen hat folgendes geschrieben Zum zitierten Posting springen:
Ich bezweifle das der Move Event eine winformstypische Sender,EventArgs-Signatur hat die anderen Events der Klasse aber mit einem eigenen struct arbeiten.
Das klingt total sinnfrei da die interna bei den Hooks die gleichen sind. Da macht mann die Eventsignaturen nicht einfach so unterschiedlich.

Ich hatte 2 verschiedene Klassen, da ich zuerst einmal eine andere benutzt habe und dann dort festgestellt habe, dass die kein MouseUp/MouseDown implementiert hatten. Daraufhin benutzte ich für MouseDown/MouseUp eine neue Klasse und behielt die alte Klasse für MouseMove.

Hab das jetzt mal geändert, damit es nicht für Verwirrung sorgt.
ausblenden C#-Quelltext
1:
mouseHook.MouseMove += new RamGecTools.MouseHook.MouseHookCallback(mouseHook_MouseMove);					

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
void mouseHook_MouseMove(RamGecTools.MouseHook.MSLLHOOKSTRUCT mouseStruct)
{
    if (gedrückt == true)
    {
        Console.WriteLine("taste wird gedrückt");
    }
}
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 23.02.18 21:21 
- Nachträglich durch die Entwickler-Ecke gelöscht -

Für diesen Beitrag haben gedankt: markusmayer123
markusmayer123 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18



BeitragVerfasst: Fr 23.02.18 22:40 
user profile iconFrühlingsrolle hat folgendes geschrieben Zum zitierten Posting springen:
Es funktioniert schon, wie es soll:


Vielen Dank!
Hast du eine Idee, wie ich das hier umsetzen könnte?

Wenn _pressed = true und ich eben keine Mausbewegung mache? Also die MouseMoved Funktion ganz weglasse?

ausblenden C#-Quelltext
1:
2:
    Cursor.Position = new Point(Cursor.Position.X, Cursor.Position.Y + 15);
    System.Threading.Thread.Sleep(25);


Das soll immer wieder aufgerufen werden, solange die linke Maustaste gedrückt gehalten wird.



LG
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 23.02.18 23:35 
- Nachträglich durch die Entwickler-Ecke gelöscht -

Für diesen Beitrag haben gedankt: markusmayer123
markusmayer123 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18



BeitragVerfasst: Sa 24.02.18 13:23 
Cool, vielen Dank! Es funktioniert wunderbar mit dem Timer :)

Eine kleine Frage noch:
Wenn ich jetzt beispielsweise im Timer Block den Befehl
ausblenden C#-Quelltext
1:
Cursor.Position = new Point(Cursor.Position.X, Cursor.Position.Y + 15);					

mit verschiedenen Y Koordinaten also zum Beispiel

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
private void timer1_Tick(object sender, EventArgs e)
{
    Cursor.Position = new Point(Cursor.Position.X, Cursor.Position.Y + 15);
    Cursor.Position = new Point(Cursor.Position.X, Cursor.Position.Y + 21);
    Cursor.Position = new Point(Cursor.Position.X, Cursor.Position.Y + 22);
    Cursor.Position = new Point(Cursor.Position.X, Cursor.Position.Y + 22);
    Cursor.Position = new Point(Cursor.Position.X, Cursor.Position.Y + 24);
}


Das hier ausführen will, aber nicht direkt nacheinander, sondern mit einer Art Thread.Sleep dazwischen, wie kann ich das elegant lösen in dem Fall?
Es sollen später ca. 30 solcher Befehle nacheinander folgen.

LG

Moderiert von user profile iconTh69: C#-Tags hinzugefügt
Moderiert von user profile iconTh69: Zitat entfernt.
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Sa 24.02.18 15:00 
- Nachträglich durch die Entwickler-Ecke gelöscht -

Für diesen Beitrag haben gedankt: markusmayer123
markusmayer123 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18



BeitragVerfasst: Sa 24.02.18 16:38 
Hi, danke.
Aber ist es möglich, dass die Anweisungen nicht direkt nacheinander aufgerufen werden? Also ein Sleep dazwischen einzubauen?
Gibt es da möglicherweiße eine Funktion die man über den Timer aufrufen kann?

Sorry bin noch ganz neu in C# :D


LG

Moderiert von user profile iconNarses: Komplettzitat des letzten Beitrags entfernt.