C#: Shortcuts überall abfangen

Gast #2103658
Lesenswert?

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
#2103669
Lesenswert?

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
Gast #2103684
Lesenswert?

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
Gast #2103737
Lesenswert?

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
Gast #2103780
Lesenswert?

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....
#2103971
Lesenswert?

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren