さて、これには主に2つのアプローチがあります。
- System.Windows.Forms.TextBox から継承して独自のテキスト ボックス コントロールを作成し、ショートカットを有効にして KeyDown の独自の実装を追加します (引き続き base.KeyDown() を呼び出します)。
- フォーム上のすべてのコントロールを反復処理し、ハンドラーをコードに追加する、各フォームの Load でも呼び出すヘルパー クラスを作成します。
オプション 1 は次のようになります。
public class ShortcutTextBox : TextBox
{
protected override void OnKeyDown(KeyEventArgs e)
{
if (e.Control && e.KeyCode == Keys.A)
{
SelectAll();
e.SuppressKeyPress = true;
}
else if (e.Control && e.KeyCode == Keys.C)
{
Copy();
e.SuppressKeyPress = true;
}
else if (e.Control && e.KeyCode == Keys.V)
{
Text = Clipboard.GetText();
e.SuppressKeyPress = true;
}
base.OnKeyDown(e);
}
}
これには、TextBox のすべてのインスタンスを ShortcutTextBox に置き換える必要があるという警告が伴います。
オプション 2 にはリファクタリングが含まれますが、フォームごとに 1 回のオプションです。次のようなヘルパー クラスを作成します。
public abstract class ControlUtilities
{
public static void AddTextBoxShortcuts(Control.ControlCollection controls)
{
foreach (Control c in controls)
{
if (c is TextBox)
{
TextBox txt = (TextBox)c;
txt.KeyDown += textBox_KeyDown;
}
else if (c.Controls != null && c.Controls.Count > 0)
{
// recursively look for text boxes
AddTextBoxShortcuts(c.Controls);
}
}
}
private static void textBox_KeyDown(object sender, KeyEventArgs e)
{
TextBox txt = (TextBox)sender;
if (e.Control && e.KeyCode == Keys.A)
{
txt.SelectAll();
e.SuppressKeyPress = true;
}
else if (e.Control && e.KeyCode == Keys.C)
{
txt.Copy();
e.SuppressKeyPress = true;
}
else if (e.Control && e.KeyCode == Keys.V)
{
txt.Text = Clipboard.GetText();
e.SuppressKeyPress = true;
}
}
}
フォームの Load イベントで次のように呼び出します。
private void Form1_Load(object sender, EventArgs e)
{
ControlUtilities.AddTextBoxShortcuts(this.Controls);
}