it-swarm.com.de

Wie erkennt man die aktuell gedrückte Taste?

In Windows Forms können Sie dank der Cursors -Klasse jederzeit die aktuelle Position des Cursors ermitteln.

Dasselbe scheint für die Tastatur nicht verfügbar zu sein. Ist es möglich zu wissen, ob zum Beispiel die Shift Taste gedrückt?

Ist es unbedingt erforderlich, jede Tastaturbenachrichtigung (KeyDown- und KeyUp-Ereignisse) aufzuspüren?

121
NorthWind
if ((Control.ModifierKeys & Keys.Shift) != 0) 

Dies gilt auch dann, wenn Ctrl+Shift ist unten. Wenn Sie überprüfen möchten, ob die Umschalttaste gedrückt ist,

if (Control.ModifierKeys == Keys.Shift)

Wenn Sie sich in einer Klasse befinden, die Control erbt (z. B. ein Formular), können Sie das Control.

160
SLaks

Mit dem folgenden Code können Sie fast alle aktuell gedrückten Tasten erkennen, nicht nur die Shift Schlüssel.

private KeyMessageFilter m_filter = new KeyMessageFilter();

private void Form1_Load(object sender, EventArgs e)
{
    Application.AddMessageFilter(m_filter);
}


public class KeyMessageFilter : IMessageFilter
{
    private const int WM_KEYDOWN = 0x0100;
    private const int WM_KEYUP = 0x0101;
    private bool m_keyPressed = false;

    private Dictionary<Keys, bool> m_keyTable = new Dictionary<Keys, bool>();

    public Dictionary<Keys, bool> KeyTable
    {
        get { return m_keyTable; }
        private set { m_keyTable = value; }
    }

    public bool IsKeyPressed()
    {
        return m_keyPressed;
    }

    public bool IsKeyPressed(Keys k)
    {
        bool pressed = false;

        if (KeyTable.TryGetValue(k, out pressed))
        {
            return pressed;
        }

        return false;
    }

    public bool PreFilterMessage(ref Message m)
    {
        if (m.Msg == WM_KEYDOWN)
        {
            KeyTable[(Keys)m.WParam] = true;

            m_keyPressed = true;
        }

        if (m.Msg == WM_KEYUP)
        {
            KeyTable[(Keys)m.WParam] = false;

            m_keyPressed = false;
        }

        return false;
    }
}
55
Ash

Sie können auch Folgendes überprüfen, wenn Sie auf System.Windows.Input verweisen

if (Keyboard.Modifiers == ModifierKeys.Shift)

Der Keyboard-Namespace kann auch verwendet werden, um den gedrückten Zustand anderer Tasten mit Keyboard.IsKeyDown (Key) zu überprüfen. Wenn Sie ein KeyDownEvent-Ereignis oder ein ähnliches Ereignis abonnieren, enthalten die Ereignisargumente eine Liste der aktuell gedrückten Tasten.

23
Jeff Wain

Die meisten dieser Antworten sind entweder viel zu kompliziert oder scheinen für mich nicht zu funktionieren (z. B. System.Windows.Input scheint nicht zu existieren). Dann habe ich einen Beispielcode gefunden, der gut funktioniert: http://www.switchonthecode.com/tutorials/winforms-accessing-mouse-and-keyboard-state

Für den Fall, dass die Seite in der Zukunft verschwindet, veröffentliche ich den entsprechenden Quellcode unten:

using System;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace MouseKeyboardStateTest
{
  public abstract class Keyboard
  {
    [Flags]
    private enum KeyStates
    {
      None = 0,
      Down = 1,
      Toggled = 2
    }

    [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
    private static extern short GetKeyState(int keyCode);

    private static KeyStates GetKeyState(Keys key)
    {
      KeyStates state = KeyStates.None;

      short retVal = GetKeyState((int)key);

      //If the high-order bit is 1, the key is down
      //otherwise, it is up.
      if ((retVal & 0x8000) == 0x8000)
        state |= KeyStates.Down;

      //If the low-order bit is 1, the key is toggled.
      if ((retVal & 1) == 1)
        state |= KeyStates.Toggled;

      return state;
    }

    public static bool IsKeyDown(Keys key)
    { 
      return KeyStates.Down == (GetKeyState(key) & KeyStates.Down);
    }

    public static bool IsKeyToggled(Keys key)
    { 
      return KeyStates.Toggled == (GetKeyState(key) & KeyStates.Toggled);
    }
  }
}
17
parsley72

Seit .NET Framework Version 3.0 ist es möglich, das Keyboard.IsKeyDown Methode aus dem neuen System.Windows.Input Namespace. Zum Beispiel:

if (((Keyboard.IsKeyDown(Key.LeftCtrl) || Keyboard.IsKeyDown(Key.RightCtrl)) && Keyboard.IsKeyDown(Key.F))
{
    // CTRL + F is currently pressed
}

Obwohl es Teil von WPF ist, funktioniert diese Methode problemlos für WinForm-Anwendungen (vorausgesetzt, Sie fügen Verweise auf PresentationCore.dll und WindowsBase.dll hinzu). Leider sind jedoch die Versionen 3.0 und 3.5 des Keyboard.IsKeyDown Methode funktionierte nicht für WinForm-Anwendungen. Wenn Sie es daher in einer WinForm-Anwendung verwenden möchten, müssen Sie .NET Framework 4.0 oder höher als Ziel festlegen, damit es funktioniert.

10
Steven Doggart

Sie können P/Invoke bis zum Win32 GetAsyncKeyState eine beliebige Taste auf der Tastatur testen.

Sie können Werte aus der Keys-Enumeration (z. B. Keys.Shift) an diese Funktion übergeben, sodass zum Hinzufügen nur einige Codezeilen erforderlich sind.

8
Jason Williams
if ((ModifierKeys == Keys.Control) && ((e.KeyChar & (char)Keys.F) != 0))
{
     // CTRL+F pressed !
}
5
Mahdi

Die beste Möglichkeit, Tastatureingaben in einem Windows Forms-Formular zu verwalten, besteht darin, sie nach dem Tastendruck und vor dem Empfang des Ereignisses durch das fokussierte Steuerelement zu verarbeiten. Microsoft unterhält eine integrierte Eigenschaft auf Form-Ebene mit dem Namen . KeyPreview , um genau dies zu ermöglichen:

public frmForm()
{
    // ...
    frmForm.KeyPreview = true;
    // ...
}

Anschließend können die _KeyDown-, _KeyPress- und/oder _KeyUp-Ereignisse des Formulars gemarshallt werden, um auf Eingabeereignisse zuzugreifen, bevor sie vom fokussierten Formularsteuerelement jemals gesehen werden. Sie können eine Handlerlogik anwenden, um das Ereignis dort zu erfassen oder es an das fokussierte Formularsteuerelement weiterzuleiten .

Obwohl dies strukturell nicht so sinnvoll ist wie die Event-Routing-Architektur XAMLs , vereinfacht sie die Verwaltung von Funktionen auf Formularebene in Winforms erheblich. Weitere Informationen finden Sie in den MSDN-Hinweisen zu KeyPreview .

3
Hardryv
if (Form.ModifierKeys == Keys.Shift)

funktioniert für ein Textfeld, wenn sich der obige Code im Keydown-Ereignis des Formulars befindet und kein anderes Steuerelement das Keydown-Ereignis für den Keydown erfasst.

Auch kann man die weitere Schlüsselverarbeitung einstellen mit:

e.Handled = true;
2
g.g
if (Control.ModifierKeys == Keys.Shift)
    //Shift is pressed

Die x/y-Position des Cursors ist eine Eigenschaft, und ein Tastendruck (wie ein Mausklick/eine Mausbewegung) ist ein Ereignis. In der Regel wird empfohlen, die Schnittstelle ereignisgesteuert zu gestalten. Ungefähr das einzige Mal, dass Sie das oben Genannte benötigen, ist, wenn Sie versuchen, eine Shift + Mausklick-Aktion auszuführen.

2
Rob Elliott

In WinForms:

if( Form.ModifierKeys == Keys.Shift )

Es klingt wie ein Duplikat der Stapelüberlauf-Frage Die Umschalttaste wird gedrückt, ohne Ereignisse in Windows Forms zu verwenden?.

0
Will Eddins