Winform에서 TextBox로 Ctrl + A를 허용하려면 어떻게해야합니까?
나는 이미 질문하고 대답했습니다. 일부 텍스트 상자가 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
IS 후 사용할 수 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();
당신의 프로그램에서에 대한 호출을 제거했다고 가정합니다 . Main()
함수에 다시 추가하면 모든 것이 잘 작동합니다.
Textbox에는 방법이 SelectAll()
있으며 잘 작동했습니다. (.net 4.5)
No need to handle WM_KEYDOWN! I know that most examples here (and CodeProject and many other places) all say there is, but it does not cure the beep that results whenever a WM_CHAR arises that is not handled.
Instead, try this:
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);
}
Remember to subclass the EDIT control to this Edit_Prc() using WPA=SetWindowLong(...) where WPA is the window procedure address for CallWindowProc(...)
I figured this out by experiment, after finding that all the answers I found online insisted on handling WM_KEYDOWN, using GetKeyState(), and ended up with bigger code that failed to stop that annoying beep!
While this answer doesn't deal with dotnet, in cases like this it's usually better to cut to the chase and solve it rather than agonise over which version of a large code wrapper system may or may not do it for you, especially if you want to avoid the risk of fighting against inbuilt behaviour.
Throwing in my two cents. Calling this under keypress is just another option.
private void TxtBox_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == '\x1')
{
TxtBox.SelectAll();
e.Handled = true;
}
}
ReferenceURL : https://stackoverflow.com/questions/16197915/how-can-i-allow-ctrla-with-textbox-in-winform
'IT TIP' 카테고리의 다른 글
레지스터 대 스택 (0) | 2021.01.06 |
---|---|
설정 HTTP는 PHP 및 Apache를 사용하여 헤더를 만료합니다. (0) | 2021.01.06 |
Firebase에서 push () 사용할 때 고유 ID를 가져 오는 방법 (0) | 2021.01.05 |
ngRepeat에서 선택한 행을 강조 표시하는 방법은 무엇입니까? (0) | 2021.01.05 |
C ++에서 bool을 재정의하는 C 헤더를 모방 할 수 있습니까? (0) | 2021.01.05 |