Entwickler-Ecke
WinForms - C# WinForm - Doppel-Drücken einer Taste abfangen
Baenky - Mo 14.07.08 13:30
Titel: C# WinForm - Doppel-Drücken einer Taste abfangen
Hallo zusammen,
ich möchte mein Formular, das im System-Tray liegt, gerne auf Doppel-Druck von Alt GR oder einer anderen Taste anzeigen lassen.
Mit generellen Tastenkombinationen wie z.B. Strg + Shift + A ist es kein Problem - das klappt... aber ich hätte das gerne auch bei doppeltem Drücken einer Taste, damit man nicht mehrere Tasten nacheinander - womöglich noch mit zwei Händen - drücken muss...
Ist das überhaupt möglich?
Würde mich freuen, wenn jmd. hierzu eine Idee hat;-)
Gruß
Nadine
bakachan - Mo 14.07.08 13:55
Naja da du ja das abfragen von gedrückten Tasten schon hast musst du ja nur noch das doppelt drücken umsetzen, z.B. indem du immer wenn die Taste gedrückt wird Zählvariable erhöst und von einem Timer nach einem bestimmten Intervall wieder auf 0 setzten lässt. (Wenn die Taste zum zweiten mal gedrückt wird bevor das Intervall abgelaufen ist erkennst du das an deiner Zählvariablen.)
Kha - Mo 14.07.08 13:58
Ich würde beim Tastendruck einfach DateTime.Now in einem Feld speichern und damit überprüfen, wie viel Zeit seit dem letzten Aufruf vergangen ist.
Baenky - Mo 14.07.08 14:00
Hallo,
vielen Dank für die Anregungen.
Werde ich mal ausprobieren!
Gruß
Nadine
Baenky - Mi 16.07.08 12:53
Ich habe nun leider folgende zusätzliche Problematik:
Da meine Form-Anwendung im SysTray liegt, kann ich keine normalen KeyEvents verwenden - diese werden nicht registriert, da das Form nicht aktiv ist.
Wie bereits erwähnt, hatte ich hierfür eine Lösung.
Uns zwar habe ich eine Funktion register Hotkey verwendet:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| [DllImport("user32.dll")] [return: MarshalAs(UnmanagedType.Bool)] static extern bool RegisterHotKey(IntPtr hWnd, int id, uint fsModifiers, uint vk); ... if (RegisterHotKey(this.Handle, HOTKEY_ID, (uint)(Modifiers.Shift | Modifiers.Control), (uint)Keys.A) == false) |
Funktioniert prinzipiell gut. Leider unterstützt die Funktion aber nur min. 2 Tasten für eine Kombination, nicht weniger - was ich brauche, wäre aber eine Reaktion auf eine Taste!
Sehe ich das so richtig?
Falls ja, wie reagiere ich in einer SysTray-Anwendung auf eine Taste? Evtl. ist es ja auch viel einfacher, als ich denke?
Gruß
Nadine
bakachan - Mi 16.07.08 13:33
Dein RegisterHotkey funktioniert über die WinAPI und darüber müsste es auch eine KeyDown oder KeyPress Variante geben, musst im Internet mal ein bischen suchen. (Stichwörter z.B. WinAPI+KeyPress)
Baenky - Mi 16.07.08 14:01
Ok... dann suche ich mal.
Wäre ja super, wenn es da was gibt!
Gruß
Nadine
Kha - Mi 16.07.08 18:28
Mit einem Hotkey kommst du hier nicht weiter, das nächstmächtigere Werkzeug wäre ein Journal Hook, mit dem du jeden Tastendruck im gesamten System abfangen kannst.
Baenky - Do 17.07.08 14:19
Hallo,
also etwas vergleichbares wie KeyPress scheint es in der win32Api nicht zu geben. Ihc kann höchstens einen Key-Status abfragen, was mir aber für meine Tray-Applikation nichts bringt.
Auf Hooks bin ich jetzt schon mehrmals gestoßen... damit muss ich mich aber erstmal auseinander setzen - da gibt es einiges zu beachten.
Würde es mir etwas bringen, wenn ich einen Dienst schreibe, der dann auf Tastendruck mein Form aufruft und es auf Esc wieder ausblendet?
Könnte ich den Tastendruck in einem Dienst irgendwie besser/einfacher abfangen und müsste so keine Tray-App verwenden?
Gruß
Nadine
Baenky - Do 17.07.08 15:09
Vielen Dank für die Links/den Link (war der selbe)!
Werde ich mir zu Gemüte ziehen...
Ich denke, ich stelle mir das ganze einfach mal wieder viel zu kompliziert vor und habe mich einfach mit Hooks noch nie auseinandergesetzt bisher - also, wenn das so einfach wie das Arbeiten mit Hotkeys ist, sollte ich das wohl irgenwie hingebkommen :wink:
Gruß
Nadine
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!