LoginSignup
1
2

More than 5 years have passed since last update.

【C#】フォーム上のテキストボックスのショートカットキー処理を追加する

Last updated at Posted at 2018-11-15

フォーム上のテキストボックスのショートカットキー処理を追加する

ContainerControlExtension.cs

using System;
using System.Windows.Forms;

namespace ExtensionsLibrary.Extensions {
    /// <summary>
    /// ContainerControl を拡張するメソッドを提供します。
    /// </summary>
    public static partial class ContainerControlExtension {
        /// <summary>
        /// アクティブコントロールを取得する
        /// </summary>
        /// <param name="this">アクティブコントロールを探す元のコンテナコントロール</param>
        /// <returns>アクティブコントロール</returns>
        /// <example>
        /// 自分自身のフォームのアクティブコントロールを取得する例
        /// <code>
        /// var c = this.GetRealActiveControl();
        /// </code>
        /// </example>
        public static Control GetActiveControl(this ContainerControl @this) {
            // ActiveControlプロパティを取得
            var ac = @this.ActiveControl;

            if (ac == null) {
                // ActiveControlがNULLの時は、コンテナコントロールを返す
                return @this;
            }

            if (ac is ContainerControl) {// 再帰処理
                // ActiveControlがコンテナコントロールの場合は、さらにActiveControlを取得
                return (ac as ContainerControl).GetActiveControl();
            }

            return ac;
        }
    }
}

FormEditText.cs

using System.Windows.Forms;
using ExtensionsLibrary.Extensions;

namespace TestProject {
    public partial class FormEditText : Form {
        public FormEditText() {
            InitializeComponent();
        }

        /// <summary>
        /// コマンド キーを処理します。(オーバーライド)
        /// </summary>
        /// <param name="msg">処理する Win32 メッセージを表す、参照渡しされた <see cref="T:System.Windows.Forms.Message" />。</param>
        /// <param name="keyData">処理するキーを表す <see cref="T:System.Windows.Forms.Keys" /> 値の 1 つ。</param>
        /// <returns>
        /// キーストロークがコントロールによって処理および使用された場合は true。キーストロークをさらに処理できるようにする場合は false。
        /// </returns>
        protected override bool ProcessCmdKey(ref Message msg, Keys keyData) {
            var tbx = this.GetActiveControl() as TextBoxBase;
            if (tbx != null) {
                switch (keyData) {
                case Keys.Control | Keys.A:// Ctrl + A
                    tbx.SelectAll();
                    return true;
                case Keys.Control | Keys.C:// Ctrl + C
                    tbx.Copy();
                    return true;
                case Keys.Control | Keys.X:// Ctrl + X
                    tbx.Cut();
                    return true;
                case Keys.Control | Keys.V:// Ctrl + V
                    tbx.Paste();
                    return true;
                case Keys.Control | Keys.Z:// Ctrl + Z
                    tbx.Undo();
                    return true;
                default:
                    break;
                }
            }

            return base.ProcessCmdKey(ref msg, keyData);
        }
    }
}
1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2