60

ここで既に尋ねられた(そして回答さえされた)質問をしています: Why are some textboxes not accept Control + A Shortcut to select all by default

しかし、その答えは私にはうまくいきません。私はこのコードを持っています:

public class LoginForm : Form
{
    private TextBox tbUsername;

    public LoginForm()
    {
        tbUsername = new TextBox();
        tbUsername.ShortcutsEnabled = true;
        tbUsername.Multiline = false;
        Controls.Add(tbUsername);
    }
}

テキストボックスが表示され、そこに書き込むことができ、問題なくテキストを切り取り、コピー、貼り付けることができます。しかし、Ctrl+Aを押そうとすると、空のテキスト ボックスからテキストを消去しようとした場合に聞こえるブリングに似た「ブリング」しか聞こえません (ブラウザーのアドレス バーで試してください)。

4

9 に答える 9

76

他の回答が示すように、Application.EnableVisualStyles()呼び出す必要があります。また、TextBox.ShortcutsEnabledを に設定する必要がありますtrue。ただしTextBox.Multilineが有効になっ Ctrlている場合、 +A は機能しません( MSDN のドキュメントを参照してください)。RichTextBox代わりに使用すると、問題を回避できます。

于 2015-04-30T01:09:05.760 に答える
42

問題の TextBox のキーダウン イベントを作成し、次のコードを含めるだけです。

private void tbUsername_KeyDown(object sender, KeyEventArgs e)
{
    if (e.Control && e.KeyCode == Keys.A)
    {
        if (sender != null)
            ((TextBox)sender).SelectAll();
    }
}
于 2015-01-01T07:41:16.277 に答える
24

プロセスコマンドキーをいつでもオーバーライドして、目的の結果を得ることができます

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);
}
于 2013-04-25T12:30:07.877 に答える
6

簡単な答えは、複数行の true を使用している場合は、select all を明示的に呼び出す必要があるということです。

private void tbUsername_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.A && e.Control)
    {
        tbUsername.SelectAll();
    }
}
于 2016-08-18T21:50:09.247 に答える
1

Textbox にはメソッドがSelectAll()あり、私にとってはうまくいきました。(.net 4.5)

于 2014-12-08T20:40:18.133 に答える
0

私の2セントを投げます。キープレスの下でこれを呼び出すことは、単なる別のオプションです。

private void TxtBox_KeyPress(object sender, KeyPressEventArgs e)
{
    if (e.KeyChar == '\x1')
    {
        TxtBox.SelectAll();
        e.Handled = true;
    }
}
于 2016-09-07T07:27:34.667 に答える
0

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 コントロールをこの Edit_Prc() にサブクラス化することを忘れないでください。ここで、WPA は CallWindowProc(...) のウィンドウ プロシージャ アドレスです。

私がオンラインで見つけたすべての回答が GetKeyState() を使用して WM_KEYDOWN を処理することを主張し、その厄介なビープ音を止めることができなかったより大きなコードになってしまったことがわかった後、私は実験によってこれを理解しました!

この回答は dotnet を扱っていませんが、このような場合は、通常、大規模なコード ラッパー システムのどのバージョンがそれを実行できるかできないかについて悩むよりも、追跡して解決することをお勧めします。組み込みの行動と戦うリスクを回避するため。

于 2014-08-18T03:38:51.020 に答える