私はすでにここで尋ねられた(そして答えられた)質問をしています: なぜコントロールを受け入れないテキストボックスがあるのですか?デフォルトですべてを選択するショートカット
しかし、その答えは私にはうまくいきません。私はこのコードを持っています:
public class LoginForm : Form
{
private TextBox tbUsername;
public LoginForm()
{
tbUsername = new TextBox();
tbUsername.ShortcutsEnabled = true;
tbUsername.Multiline = false;
Controls.Add(tbUsername);
}
}
テキストボックスが表示され、書き込み、問題なくテキストの切り取り、コピー、貼り付けができます。しかし、私が押すと Ctrl+A 空のテキストボックスからテキストを消去しようとした場合に聞こえるキラキラ音に似た「キラキラ」だけが聞こえます(ブラウザのアドレスバーで試してみてください)。
他の回答が示すように、Application.EnableVisualStyles()
を呼び出す必要があります。また、TextBox.ShortcutsEnabled
はtrue
に設定する必要があります。ただし、TextBox.Multiline
が有効になっている Ctrl+A 動作しません( MSDNのドキュメントを参照 )。代わりにRichTextBox
を使用すると、問題を回避できます。
問題のTextBoxのキーダウンイベントを作成し、次のコードを含めるだけです。
private void tbUsername_KeyDown(object sender, KeyEventArgs e)
{
if (e.Control && e.KeyCode == Keys.A)
{
if (sender != null)
((TextBox)sender).SelectAll();
}
}
いつでもプロセスコマンドキーをオーバーライドして、目的の結果を得ることができます。
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
const int WM_KEYDOWN = 0x100;
var keyCode = (Keys) (msg.WParam.ToInt32() &
Convert.ToInt32(Keys.KeyCode));
if ((msg.Msg == WM_KEYDOWN && keyCode == Keys.A)
&& (ModifierKeys == Keys.Control)
&& tbUsername.Focused)
{
tbUsername.SelectAll();
return true;
}
return base.ProcessCmdKey(ref msg, keyData);
}
簡単な答えは、複数行のtrueを使用している場合は、select allを明示的に呼び出す必要があるということです。
private void tbUsername_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.A && e.Control)
{
tbUsername.SelectAll();
}
}
これは私にも一度起こりました、あなたはあなたのプログラムからApplication.EnableVisualStyles();
の呼び出しを削除したと思いますか?それをMain()
関数に追加すると、すべてが正常に機能するはずです。
TextboxにはSelectAll()
メソッドがあり、うまく機能しました。 (.net 4.5)
私の2セントで投げます。これをキー押下で呼び出すことは、もう1つのオプションです。
private void TxtBox_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == '\x1')
{
TxtBox.SelectAll();
e.Handled = true;
}
}
WM_KEYDOWNを処理する必要はありません!ここのほとんどの例(およびCodeProjectや他の多くの場所)にはすべてがあると書かれていますが、処理されないWM_CHARが発生するたびに生じるビープ音は治しません。
代わりに、これを試してください:
LRESULT CALLBACK Edit_Prc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam){
if(msg==WM_CHAR&&wParam==1){SendMessage(hwnd,EM_SETSEL,0,-1); return 1;}
else return CallWindowProc((void*)WPA,hwnd,msg,wParam,lParam);
}
WPA = SetWindowLong(...)を使用して、このEdit_Prc()にEDITコントロールをサブクラス化することを忘れないでください。ここでWPAはCallWindowProc(...)のウィンドウプロシージャアドレスです。
オンラインで見つけたすべての回答が、GetKeyState()を使用してWM_KEYDOWNを処理することを要求していることに気付いた後、実験でこれを見つけました。
この答えはドットネットを扱っていませんが、このような場合は、大規模なコードラッパーシステムのどのバージョンで苦労するのではなく、追跡したり解決したりする方が通常は良いでしょう、特にあなたが望むなら作り付けの行動と戦うリスクを避けるため。