2013-06-30 3 views
3

나는 무엇을 의미하는지 더 잘 설명하려고 노력할 것이고, 나는 또한 언어에서 자유로운 질문을 유지하려고 노력할 것이다. 비록 내가 C#에서 원하는 것을 할 수있는 방법이 있다면, 아무 것도 언급하지 않고도 좋을 것이다. . 어쨌든 .Shift 키를 누른 상태에서 char을 얻으려면 어떻게해야합니까?

키보드 입력을 처리하고이를 문자열로 변환하고 있습니다. 괜찮아. Shift 및 CapsLock 키의 상태를 얻고 EXOR 키를 사용하여 결과 문자열의 대소 문자를 알아낼 수 있습니다.

bool shift = KeyDown(SHIFT_KEY) 
bool capslock = KeyToggled(CAPSLOCK) 
bool stringCasing = shift^capslock //if both are true/false, the string will be lowercase. Otherwise uppercase. 

foreach Key k in [list of keys passed as parameter] 
    char c = (char)k 
    if stringCasing 
      c = Char.ToUpper(c) 
    else 
      c = Char.ToLower(c) 
end foreach 

그리고 지금은 문제가 없습니다. 사용자가 시프트를 유지하거나 캡슐 잠금을 전환 한 상태에서 "a"를 입력하면 "A"가됩니다.

그러나 "1"대문자가 여전히 "1"이기 때문에 사용자가 "1"과 시프트를 입력하는 "!"을 입력하면 1을 얻습니다.

이 질문을하기 전에 웹에서 약간 보였지만 "지도를 직접 작성"하는 것이 전부였습니다. 그게 유일한 대답입니까? 또한 키를 매핑 한 다음 다른 키보드 레이아웃을 가진 사용자가 응용 프로그램을 사용하려고하면 어떻게됩니까? 미리 감사드립니다.

+0

어떻게 키보드 입력을 처리합니까? 이벤트 핸들러에서 KeyCode를 사용할 수 없습니까? –

+0

PInvoking GetKeyState와 다소 비슷하게 XNA의 입력 클래스를 구축하고 있습니다. 기본적으로, 내가 접근 할 수있는 것은 모든 가상 키와 그 상대적인 상태의 목록입니다. 예를 들어, 1을위한 KeyCode가 있지만 for가 아닙니다! (그것이 VK로 존재한다는 것을 인정합니다.) – KappaG3

+1

그건 힘들어요.이 스레드는 도움이 될지 모르지만 근본적으로 당신이 말한 것은 당신 질문에 해당 할 것입니다. 당신은 스스로해야합니다.다른 키보드/레이아웃을 처리하는 방법을 모릅니다. http://www.gamedev.net/topic/457783-xna-getting-text-from-keyboard/#entry4040153 –

답변

7

이것은 Win32 ToAscii 함수 (MSDN reference)를 통해 수행 할 수 있습니다. 필자는 이러한 함수를 래핑하는 .NET 프레임 워크 메서드를 모릅니다. 따라서 P/Invoke를 사용해야 할 수도 있습니다.

ToAscii과 함께 virtual key code으로 키를 번역하려면 VkKeyScan에 대한 참조가 필요할 수 있습니다. 이 키 코드는 ToAscii의 매개 변수로 사용됩니다. 간단한 P/이러한 메소드 호출 선언 따르

[DllImport("user32.dll")] 
    static extern short VkKeyScan(char c); 

    [DllImport("user32.dll", SetLastError=true)] 
    static extern int ToAscii(
     uint uVirtKey, 
     uint uScanCode, 
     byte[] lpKeyState, 
     out uint lpChar, 
     uint flags 
     ); 

ToAscii에 세번째 파라미터는 각각의 키의 상태를 참조하는 256 소자 어레이이다; 0x80 (상위 비트 세트)의 값은 키가 설정되었음을 나타냅니다. 요소 0x10 (Shift의 가상 키 코드)을 설정하면 시프트을 누 릅니 다.

public static char GetModifiedKey(char c) 
{ 
    short vkKeyScanResult = VkKeyScan(c); 

    // a result of -1 indicates no key translates to input character 
    if (vkKeyScanResult == -1) 
     throw new ArgumentException("No key mapping for " + c); 

    // vkKeyScanResult & 0xff is the base key, without any modifiers 
    uint code = (uint)vkKeyScanResult & 0xff; 

    // set shift key pressed 
    byte[] b = new byte[256]; 
    b[0x10] = 0x80; 

    uint r; 
    // return value of 1 expected (1 character copied to r) 
    if (1 != ToAscii(code, code, b, out r, 0)) 
     throw new ApplicationException("Could not translate modified state"); 

    return (char)r; 
} 

Shift 키와 관련된 문자를 반환이 메서드를 호출 :

우리는 우울 시프트와 헬퍼 매개 변수로 키를 나타내는 문자를 취 방법, 출력 키를 정의 할 수 있습니다 + 입력 문자의 기본 키 (기본 키는 문자를 입력하기 위해 눌러 진 물리적 키입니다. 예 : 은 !의 기본 키입니다). 예를 들어 미국 키보드의 경우 GetModifiedKey('7')GetModifiedKey('&')은 모두 '&'을 반환합니다. 반환 값은로드 된 키보드 레이아웃을 사용합니다. 예를 들어, 독일 키보드 (Shift + 이 / 인 경우)에서이 메서드는 /을 대신 반환합니다.

+0

아, 정말 고마워! 그게 내가 필요로하는 것이고, 당신은 그것을 잘 설명해주었습니다. 편집 : 내가 unsigned int casted -1에 explaination을 얻을 수 있을까? 물론 컴파일되지 않지만 어쩌면 내가 알지 못하는 무언가가있을 수 있습니다. – KappaG3

+0

오류에 대한 사과 - 오류 검사를 명확하게하기 위해 코드의 첫 번째 부분을 리팩터링했습니다. 'VkKeyScan'은 제공된 문자 (예 : 미국 키보드의 'ü')로 변환되는 키가 없으면 -1 (0xffff)을 반환합니다. – drf

+0

네, 그렇게 생각했습니다. 답변을 주셔서 다시 한 번 감사드립니다! – KappaG3

관련 문제