Hallo! Ich möchte gern in meiner Oberfläche Shortcuts verwenden. Habe dazu das KeyDown-Event angelegt und frage in dessen Event-Methode die Tastenkombination ab. Das Problem ist, dass das Event nie eintritt, weil hat immer irgendein Control aktiv ist. Wie kann ich denn die Tastenkürzel global abfangen? Gruß der Apfelkern
Hi, wenn Du es wirklich ganz global machen willst, wirst Du Dich wohl in die Message-Queue von Windows einhängen müssen. Stichwort : Application.AddMessageFilter. Nur so kannst Du an einer zentralen Stelle in Deinem Projekt alle Nachichten von Windows abfangen und auswerten, unter vielen, vielen anderen auch die Key-Messages. Einfacher geht es, wenn Du in Deinem Hauptformular die Eigenschaft 'KeyPreview' auf TRUE stellst, dann kommen Tastendrücke erst bei diesem Form an bevor sie an die Controls weitergeleitet werden. Leider funktioniert das nicht zu 100%, da ist probieren angesagt. Gruß Jürgen
Danke. Das mit dem KeyPreview scheint zu funktionieren. Der Nachteil ist halt, dass dann alles über meine Event-Methode geht, auch die Texteingabe in einer Textbox und das macht die Sache etwas träge. Habe beim Googeln diese Seiten gefunden: http://www.codeproject.com/KB/cs/CSLLKeyboardHook.aspx http://dotnet-snippets.de/dns/globale-keyhook-SID730.aspx http://www.codeproject.com/KB/cs/globalhook.aspx Werde diese Beispiele mal testen. gruß der Apfelkern
Mir gefällt eigentlich diese Implementierung am Besten: http://www.codeproject.com/KB/cs/CSLLKeyboardHook.aspx Das Problem ist, das ich nicht mitgeliefert bekommen, ob gleichzeitig eine Steuerungstaste gedrückt ist. Die KeyEventArgs haben zwar die Property Control, Alt, Shift, aber ich kann sie nicht setzen: [c]KeyEventArgs kea = new KeyEventArgs(key); kea.Control = (Control.ModifierKeys == Keys.Control);{/c] Was mache ich falsch? Gruß der Apfelkern
Ok hab's:
1 | if((Control.ModifierKeys & Keys.Control) > 0) |
2 | {
|
3 | key |= Keys.Control; |
4 | }
|
Musste jetzt aber feststellen, dass das Ganze nicht die optimale Lösung ist. Dieser KeyboardHook bewirkt, dass alle Tasten abgefangen werden, auch wenn man Fenster nicht aktiv ist....
Apfelkern schrieb: > Ok hab's: >
1 | if((Control.ModifierKeys & Keys.Control) > 0) |
2 | > { |
3 | > key |= Keys.Control; |
4 | > } |
> > Musste jetzt aber feststellen, dass das Ganze nicht die optimale Lösung > ist. > Dieser KeyboardHook bewirkt, dass alle Tasten abgefangen werden, auch > wenn man Fenster nicht aktiv ist.... ProcessCmdKey überschreiben...
1 | public partial class AForm : Form { |
2 | Dictionary<Keys, EventHandler> mDict = new Dictionary<Keys, EventHandler>(); |
3 | |
4 | protected override bool ProcessCmdKey(ref Message msg, Keys keyData) { |
5 | if (mDict.ContainsKey(keyData)) { |
6 | if (mDict[keyData] != null) { |
7 | mDict[keyData](null, new EventArgs()); |
8 | return true; |
9 | }
|
10 | }
|
11 | return base.ProcessCmdKey(ref msg, keyData); |
12 | }
|
13 | ...
|
WPF -> InputBinding(s), CommandBinding
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.