2012-03-07 3 views
1

MSDN의 this page에 따르면 Key Value은 왼쪽 컨트롤입니다. 코드에서이 키가 눌러져 있는지 어떻게 알 수 있습니까? 현재 키 누르기를 시도 할 때마다 일반 제어 키인 17 값을 얻습니다. 두 가지를 구별 할 수있는 방법이 있습니까? ProcessCmdKey을 무시하고 Textbox의 PreviewKeyDown을 처리하려고 시도했지만 둘 다 162 대신 172를 반환합니다. 모든 수정 자 키에 대해이 작업을 수행해야하며 값을 하드 코드하기 전에 더 나은 방법으로 코드를 캡처하는 것이 좋습니다. ?특정 수정 자 키 캡처

편집 : 코드가 추가되었습니다. 명확히하기 위해 나는 수식어를 구별하는 다른 방법을 찾지 않고 162 숫자를 검색하려고합니다.

private void PortfolioNameTextBox_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e) 
{ 
    var val = e.KeyValue; //17 when control is pressed and not 162 

} 

protected override bool ProcessCmdKey(ref Message msg, Keys keyData) 
{ 
    //msg.Wparam = 17 
    return base.ProcessCmdKey(ref msg, keyData); 
} 
+0

귀하의 양식 내에서 그리고 전 세계적으로)? –

+0

코드를 추가했습니다. 양식 만 추가했습니다. – XSL

+0

WinForms에서는 운이 나쁘다고 생각합니다. 응용 프로그램으로 전달되는 키 코드 만 처리 할 수 ​​있습니다. 잠재적 인 해결 방법은 전역 키 후크를 설정하고 현재 응용 프로그램이 자신의 것인지 확인하는 것입니다. –

답변

2

Messr Passant answered이 많은 달 전입니다. KeyEventArgs가 포함 된 경우

좋은 것입니다,하지만 그럼에도 불구하고,이 같은 그것을 달성 할 수

당신은 키 누름 (나는 당신이 그것을 캡처 할 가정을 캡처하는 데 사용하는 코드를 제공 할 수
[DllImport("user32.dll")] 
    private static extern short GetAsyncKeyState(Keys key); 

    private void textBox1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e) 
    { 
     Console.WriteLine("Ctrl:{0}, LCtrl:{1}, RCtrl:{2}", 
     GetAsyncKeyState(Keys.ControlKey) < 0, 
     GetAsyncKeyState(Keys.LControlKey) < 0, 
     GetAsyncKeyState(Keys.RControlKey) < 0); 
    } 
+0

아, 그냥 당신의 의견을 읽고 ... 당신은 무력으로 그 접근 방식을 사용하여 마법 162를 얻을 수 있어야합니다. 예 : GetAsyncKeyState (Keys.LControlKey) <0)가 Keys.LControlKey를 반환하지만 이상적인 것은 아닙니다. –