Forum: PC-Programmierung C#: Shortcuts überall abfangen


von Apfelkern (Gast)


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

von Jürgen G. (jrgen_g)


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

von Apfelkern (Gast)


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

von Apfelkern (Gast)


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

von Apfelkern (Gast)


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....

von Arc N. (arc)


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

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
Noch kein Account? Hier anmelden.