0

하나의 양식, 사용자 정의 도면, 컨트롤이 없습니다.WinForms, 모든 키 처리 = OnKeyPress + OnKeyDown,하지만 어떻게?

사용자로부터 입력을 받아야 할 때 OnKeyDown 이벤트로 이동 한 다음 이벤트의 KeyData를 문자열 **에 매핑하면 사용자가 "ctrl X"등을 눌렀 음을 인식 할 수 있으므로 거의 모든 것이 가능합니다. 확인 ... 문제는 다른 키보드 설정 및 언어 특정 문자로입니다 - 그래서 오늘 내 사용자

는 GET - 그래서 바로 KeyPress 이벤트가 필요합니다>

O를 ->를

ó? 하지만 사용자가 'ł'을 입력하고 alt + L을 입력하지 않았다는 것을 어떻게 알 수 있습니까? 나는 잠시 동안 그 주위에 내 머리를 얻을 수 없다. ...

** - 사용자가 바로 가기를 구성하고 .ToString()을 사용하여 사용자 친화적 인 텍스트를 생성하지 않도록하므로 그렇게해야한다. "OemPeriod, Control"또는 "ControlKey, Control"

답변

2

예, KeyPress 이벤트가 필요합니다. 오히려 OnKeyPress를 재정의하십시오. KeyDown 이벤트의 가상 키 코드를 키 스트로크에 매핑하는 것은 매우 어렵습니다. 현재 키보드 레이아웃을 알고 있어야합니다. MSDN docs for ToUnicodeEx()을 방문하여 자신이 어떤 행동을했는지 확인하십시오.

Alt + L과 같은 키 입력 조합에 대해 걱정할 필요가 없습니다. 그들은 KeyPress 이벤트를 생성하지 않습니다.

다음은 예입니다. 내가 알고 필요에서 KeyDown에서 ... 내가 틀렸다 만에서 KeyDown이 KeyPress 이벤트 전의 경우는

using System; 
using System.Drawing; 
using System.Text; 
using System.Windows.Forms; 

namespace WindowsFormsApplication1 { 
    public partial class Form1 : Form { 
    public Form1() { 
     InitializeComponent(); 
    } 
    StringBuilder mText = new StringBuilder(); 

    protected override void OnKeyPress(KeyPressEventArgs e) { 
     if (e.KeyChar == '\b') { 
     if (mText.Length > 0) mText.Remove(mText.Length - 1, 1); 
     } 
     else mText.Append(e.KeyChar); 
     Invalidate(); 
    } 

    protected override void OnPaint(PaintEventArgs e) { 
     TextFormatFlags fmt = TextFormatFlags.Left; 
     TextRenderer.DrawText(e.Graphics, mText.ToString(), this.Font, this.ClientRectangle, Color.Black, fmt); 
    } 
    } 
} 
+0

흠, 저를 수정, 그래서 : 새 Windows Forms 프로젝트를 시작하고 같은 코드 모양을 만들 눌려진 키는 KeyPress에 의해 처리 될 것입니다 ... 그래서 나는 ToUnicodeEx를 사용할 것입니다, 맞습니까? 하지만 ToUnicodeEx를 사용한다면 KeyPress 이벤트가 필요하지 않습니다. 맞습니까? – argh

+0

아니요, 당신은 알 필요가 없습니다. KeyPress가 알려드립니다. ToUnicodeEx()를 사용하지 마십시오. –

+0

흠, 어쩌면 '잘못된 길'을하고있을 지 모르지만 KeyDown의 모든 것을 처리하면 모든 것이 잘 작동하는 것처럼 보입니다.하지만 솔루션이 보이는 의사 코드의 몇 줄에 나를 보여줄 수 있습니까? – argh

관련 문제