Return to Snippet

Revision: 49613
at July 26, 2011 21:43 by Currysuechtig


Initial Code
using System;
using System.Collections.Generic;
using System.Windows.Forms;

namespace Tools
{
    /// <summary>
    /// Tasten-Shortcut auf einem Control.
    /// </summary>
    public class Shortcut
    {
        /// <summary>
        /// Aktuell gedrückte Tasten.
        /// </summary>
        private List<Keys> _CurrentlyPressedKeys = new List<Keys>();

        private Control _Control;
        private List<Keys> _Keys = new List<Keys>();
        private Action _Action;

        /// <summary>
        /// Control, auf dem die Tastendrücke überwacht werden sollen.
        /// </summary>
        public Control Control
        {
            get { return _Control; }
            set
            {
                this.OnControlChanging();
                _Control = value;
                this.OnControlChanged();
            }
        }

        /// <summary>
        /// Keys, die gedrückt werden müssen, um die Aktion auszulösen.
        /// </summary>
        public List<Keys> Keys
        {
            get { return _Keys; }
        }

        /// <summary>
        /// Aktion, die ausgelöst werden soll.
        /// </summary>
        public Action Action
        {
            get { return _Action; }
            set { _Action = value; }
        }

        /// <summary>
        /// Initialisiert einen einen Tasten-Shortcut.
        /// </summary>
        public Shortcut()
        {
        }

        /// <summary>
        /// Initialisiert einen einen Tasten-Shortcut.
        /// </summary>
        /// <param name="control">Control, auf dem die Tastendrücke überwacht werden sollen.</param>
        public Shortcut(Control control)
        {
            this.Control = control;
        }

        /// <summary>
        /// Initialisiert einen einen Tasten-Shortcut.
        /// </summary>
        /// <param name="control">Control, auf dem die Tastendrücke überwacht werden sollen.</param>
        /// <param name="action">Aktion, die ausgelöst werden soll.</param>
        public Shortcut(Control control, Action action)
        {
            this.Control = control;
            this.Action = action;
        }

        /// <summary>
        /// Wird aufgerufen, wenn sich die Control-Eigenschaft gerade ändert.
        /// </summary>
        protected virtual void OnControlChanging()
        {
            // Abonnements der alten Key-Events entfernen
            if (this.Control != null)
            {
                this.Control.KeyDown -= new KeyEventHandler(Control_KeyDown);
                this.Control.KeyUp -= new KeyEventHandler(Control_KeyUp);
            }
        }

        /// <summary>
        /// Wird aufgerufen, wenn die Control-Eigenschaft geändert wurde.
        /// </summary>
        protected virtual void OnControlChanged()
        {
            // Neue Key-Events abonnieren
            if (this.Control != null)
            {
                this.Control.KeyDown += new KeyEventHandler(Control_KeyDown);
                this.Control.KeyUp += new KeyEventHandler(Control_KeyUp);
            }
        }

        /// <summary>
        /// Überprüft, ob die aktuell gedrückten Tasten dem Shortcut entsprechen.
        /// </summary>
        protected void CheckKeys()
        {
            bool flag = true;

            foreach (Keys key in this.Keys)
            {
                if (!_CurrentlyPressedKeys.Contains(key))
                    flag = false;
            }

            if (flag)
                this.Action();
        }

        /// <summary>
        /// Wird aufgerufen, wenn eine Taste auf dem Control gedrückt wurde.
        /// </summary>
        private void Control_KeyDown(object sender, KeyEventArgs e)
        {
            // Aktuell gedrückte Taste speichern
            _CurrentlyPressedKeys.Add(e.KeyCode);

            // Auf Shortcut überprüfen
            this.CheckKeys();
        }

        /// <summary>
        /// Wird aufgerufen, wenn eine Taste auf dem Control losgelassen wurde.
        /// </summary>
        private void Control_KeyUp(object sender, KeyEventArgs e)
        {
            // Losgelassene Taste entfernen
            _CurrentlyPressedKeys.Remove(e.KeyCode);
        }
    }
}

Initial URL


Initial Description
Easily create Windows Forms Shortcuts with this class.

For example: A shortcut to catch pasting via Ctrl + V.
Shortcut sc = new Shortcut(this, new Action(() => MessageBox.Show("Data pasted!")));
sc.Keys.Add(Keys.ControlKey);
sc.Keys.Add(Keys.V);

Initial Title
Windows Forms Keyboard Shortcut on Control

Initial Tags
forms, windows

Initial Language
C#