フォーム上のテキストボックスのショートカットキー処理を追加する
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);
}
}
}