www.mikrocontroller.net

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


Autor: Apfelkern (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jürgen Gehrig (jrgen_g)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Apfelkern (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Apfelkern (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Apfelkern (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok hab's:
if((Control.ModifierKeys & Keys.Control) > 0)
{
  key |= Keys.Control;
}

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

Autor: Arc Net (arc)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Apfelkern schrieb:
> Ok hab's:
>
if((Control.ModifierKeys & Keys.Control) > 0)
> {
>   key |= Keys.Control;
> }
>
> 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...
public partial class AForm : Form {
        Dictionary<Keys, EventHandler> mDict = new Dictionary<Keys, EventHandler>();

        protected override bool ProcessCmdKey(ref Message msg, Keys keyData) {
            if (mDict.ContainsKey(keyData)) {
                if (mDict[keyData] != null) {
                    mDict[keyData](null, new EventArgs());
                    return true;
                }
            }
            return base.ProcessCmdKey(ref msg, keyData);
        }
        ...
WPF -> InputBinding(s), CommandBinding

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.