2012-09-17 16 views
1

나는 사용자로부터 입력 된 값을 가져 와서 char 변수에 저장하려고 시도하고 있지만 문제는 아무 것도 발생하지 않는다는 것인데, 과 나는이 문제가 폼 포커스과 함께 있다고 생각한다. 나는 아무런 에러도 발생시키지 않고 아무런 일도 일어나지 않는다. 내가 뭘 잘못 했니?양식에 초점을 맞추는 방법?

 char keyPressed; 

     public FrmZigndSC() 
     { 
      InitializeComponent(); 
      this.Focus(); 
     } 

     private void FrmZigndSC_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e) 
     { 
      keyPressed = e.KeyChar; 

      LblResult.Text += Convert.ToString(keyPressed); 
     } 

답변

2

이 코드를 시도 할 수 있습니다 - 나는 Forms 프로젝트를 빈 작은 Windows에서 재현하려고 KeyPressEventHandler

public FrmZigndSC() 
{ 
     InitializeComponent(); 
     this.Focus(); 

     //Subscribe to event 
     this.KeyPress += new KeyPressEventHandler(FrmZigndSC_KeyPress); 
} 


private void FrmZigndSC_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e) 
{ 
     keyPressed = e.KeyChar; 
     LblResult.Text += Convert.ToString(keyPressed); 


     // Indicate the event is handled. 
     e.Handled = true; 
} 
+0

응용 프로그램에서 코드를 실행할 때이 오류가 발생하는 이유는 무엇입니까? 'Error \t 비 정적 필드, 메서드 또는 속성 'System.Windows.Forms.Control.KeyPress''에 객체 참조가 필요합니다. – Zignd

+0

Zignd 대신 this.KeyPress 대신 FrmZigndSC.KeyPress를 사용합니다. 하지만 내 코드가 정확하다, 그는 KeyPress를 기반으로합니다. –

+0

오 예. 이제 작동 중입니다. 감사합니다. @Aghilas – Zignd

1

기준으로합니다. 이 코드는 Shown 이벤트 핸들러없이 잘 작동 :

public partial class FrmZigndSC : Form 
{ 
    public FrmZigndSC() 
    { 
     InitializeComponent(); 

     this.KeyPress += (s, e) => this.LblResult.Text += e.KeyChar.ToString(); 

     // this might be a solution, but i did not need it 
     this.Shown += (s, e) => this.Activate(); 
    } 
} 

당신은 어쨌든 this.Activate()를 사용하고 도움이 있는지 확인하기 위해 시도 할 수 있습니다. 텍스트 상자과 같은 다른 입력 컨트롤이 양식에있는 경우 양식의 KeyPreview 속성을 true로 설정하십시오.

0

나는 그 문제가 당신의 양식에 ketpressed 잡는 differenct 컨트롤이 있다고 생각합니다. 내 컨트롤에 DateTimePicker를 사용하여 동일한 문제가 발생했습니다.

모두 삭제하고 시도해보십시오. 작동합니다. 그리고 그 시점에서 컨트롤을 다시 추가하여 문제가 무엇인지 확인하십시오.

1

응용 프로그램의 메시징 파이프 라인에서 키 알림을 수신하려면 요소의 포커스를 중계하십시오 (이 경우에는 아키텍처가 취약 해집니다). 당신은 앱의 다른 형태에서 초점을 맞출 것이라는 것을 보증 할 수 없으며, 그 형태는 그 사건을 흡수하는 어떤 통제에 의해 덮여있다. 초점이있는 양식으로 구별 할 수 없으므로 UX 설계가 완전히 엉망입니다 (100 % 작동 방식으로 구현할 수 있음에도 확실하지 않음).

당신 는 대신, 클래스는 IMessageFilter에서 파생 된 선언입니다 수행

public class MessageFilter : IMessageFilter 
{ 
     const int WM_KEYDOWN = 0x100; 
     const int WM_KEYUP = 0x101; 

     public bool PreFilterMessage(ref Message m) 
     { 
      // Intercept KEY down message 
      Keys keyCode = (Keys)(int)m.WParam & Keys.KeyCode; 

      if ((m.Msg == WM_KEYDOWN) 
      { 
       //get key pressed 

       return true; 
      }   
      else 
      { 
       return false; 
      } 


     } 
} 

과 응용 프로그램 내 등록후 :

MessageFilter filter = new MessageFilter(); //init somewhere 


Application.AddMessageFilter(filter); // add 

..... 

//on application end don't forget to remove it 
Application.RemoveMessageFilter(filter); 
0

당신이 준 코드 나를 위해 잘 작동합니다. 시작 페이지를 FrmZigndSC로 설정하고 다시 시도하십시오.

관련 문제