c#で半角数値しか入力できない(クリップボード貼り付けも不可)テキストボックスを作るコード。
class NumericTextBox : TextBox
{
/// <summary>
/// Windowsメッセージ処理のための定数
/// </summary>
private const int WM_PASTE = 0x302;
private const int WM_CHAR = 0x102;
/// <summary>
/// 全角入力禁止のために、デフォルトIMEモードは無効にする
/// </summary>
protected override ImeMode DefaultImeMode
{
get { return ImeMode.Disable; }
}
/// <summary>
/// 数値以外禁止
/// </summary>
/// <param name="m"></param>
[System.Security.Permissions.SecurityPermission(
System.Security.Permissions.SecurityAction.LinkDemand,
Flags = System.Security.Permissions.SecurityPermissionFlag.UnmanagedCode)]
protected override void WndProc(ref Message m)
{
switch (m.Msg)
{
case WM_PASTE:
//数値以外の貼り付けを禁止する
IDataObject iData = Clipboard.GetDataObject();
if (iData != null && iData.GetDataPresent(DataFormats.Text))
{
string sClipStr = (string)iData.GetData(DataFormats.Text);
//クリップボードの文字列が数字か調べる
if (!System.Text.RegularExpressions.Regex.IsMatch(
sClipStr,
@"^[0-9]+$"))
return;
}
break;
case WM_CHAR:
// 数値以外の入力を禁止する
char sKeyChar = (char)(m.WParam.ToInt32());
// 制御文字の時は処理しない
if (!char.IsControl(sKeyChar))
{
// 数値(0-9)以外は、メッセージを破棄する
if (!('0' <= sKeyChar & sKeyChar <= '9'))
{
return;
}
}
break;
}
base.WndProc(ref m);
}
}