Autor |
Beitrag |
markusmayer123
Beiträge: 18
|
Verfasst: 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:
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 Th69: C#-Tags hinzugefügtModeriert von Th69: Topic aus C# - Die Sprache verschoben am Fr 23.02.2018 um 09:10
|
|
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Fr 23.02.18 00:56
- Nachträglich durch die Entwickler-Ecke gelöscht -
|
|
markusmayer123
Beiträge: 18
|
Verfasst: Fr 23.02.18 01:07
Hi, vielen Dank für deine Antwort.
Ja, du meinst vermutlich das hier:
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 Th69: C#-Tags hinzugefügt
Moderiert von Th69: Vollzitat entfernt
|
|
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Fr 23.02.18 01:25
- Nachträglich durch die Entwickler-Ecke gelöscht -
|
|
markusmayer123
Beiträge: 18
|
Verfasst: 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 Th69: Vollzitat entfernt.
|
|
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Fr 23.02.18 13:25
- Nachträglich durch die Entwickler-Ecke gelöscht -
|
|
markusmayer123
Beiträge: 18
|
Verfasst: 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.
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 Th69: Vollzitat entfernt.
Moderiert von Th69: C#-Tags hinzugefügt
|
|
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Fr 23.02.18 13:58
- Nachträglich durch die Entwickler-Ecke gelöscht -
|
|
markusmayer123
Beiträge: 18
|
Verfasst: 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.
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 Th69: Vollzitat entfernt.
|
|
Ralf Jansen
Beiträge: 4701
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: 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
Beiträge: 18
|
Verfasst: 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()
C#-Quelltext 1:
| actHook.OnMouseActivity += new MouseEventHandler(MouseMoved); |
Moderiert von Th69: Vollzitat entfernt.
|
|
Th69
Beiträge: 4764
Erhaltene Danke: 1052
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: 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
Beiträge: 4701
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: 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
Beiträge: 18
|
Verfasst: Fr 23.02.18 16:55
|
|
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Fr 23.02.18 21:21
- Nachträglich durch die Entwickler-Ecke gelöscht -
Für diesen Beitrag haben gedankt: markusmayer123
|
|
markusmayer123
Beiträge: 18
|
Verfasst: Fr 23.02.18 22:40
Frühlingsrolle hat folgendes geschrieben : | 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?
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
|
Verfasst: Fr 23.02.18 23:35
- Nachträglich durch die Entwickler-Ecke gelöscht -
Für diesen Beitrag haben gedankt: markusmayer123
|
|
markusmayer123
Beiträge: 18
|
Verfasst: 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
C#-Quelltext 1:
| Cursor.Position = new Point(Cursor.Position.X, Cursor.Position.Y + 15); |
mit verschiedenen Y Koordinaten also zum Beispiel
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 Th69: C#-Tags hinzugefügt
Moderiert von Th69: Zitat entfernt.
|
|
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Sa 24.02.18 15:00
- Nachträglich durch die Entwickler-Ecke gelöscht -
Für diesen Beitrag haben gedankt: markusmayer123
|
|
markusmayer123
Beiträge: 18
|
Verfasst: 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#
LG
Moderiert von Narses: Komplettzitat des letzten Beitrags entfernt.
|
|