簡體   English   中英

如何在 winform 中允許 ctrl+a 與 TextBox 一起使用?

[英]How can I allow ctrl+a with TextBox in winform?

我在這里問已經問過(甚至回答過)的問題: 為什么有些文本框不接受 Control + A 快捷方式來默認選擇全部

但那個答案對我不起作用。 我有這個代碼:

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 創建一個 keydown 事件並包含以下代碼:

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,則必須明確調用全選。

private void tbUsername_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.A && e.Control)
    {
        tbUsername.SelectAll();
    }
}

這也發生在我身上,我假設您刪除了對Application.EnableVisualStyles();的調用Application.EnableVisualStyles(); 從你的程序? 將其添加回Main()函數,一切正常。

Textbox 有一個SelectAll()方法,對我來說效果很好。 (.net 4.5)

無需處理 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,但在這種情況下,通常最好切入正題並解決它,而不是為大型代碼包裝系統的哪個版本可能會或可能不會為你做這件事而苦惱,尤其是如果你想要以避免對抗內在行為的風險。

投入我的兩分錢。 在按鍵下調用它只是另一種選擇。

private void TxtBox_KeyPress(object sender, KeyPressEventArgs e)
{
    if (e.KeyChar == '\x1')
    {
        TxtBox.SelectAll();
        e.Handled = true;
    }
}

這是我的代碼,它工作正常

private void mainSimPlus_KeyDown(object sender, KeyEventArgs e)
            {
                e.Handled = true;
                if (e.Control == true && e.KeyCode == Keys.A)
                {
                    if (SelectAllTextBox(txt1))
                        return;
                    if (SelectAllTextBox(txt2))
                        return;
                }
            }
            private bool SelectAllTextBox(TextBox txt)
            {
                if (txt.Focused)
                {
                    txt.SelectAll();
                    return true;
                }
                else
                    return false;
            }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM