2010-05-29 2 views
4

으로 변환합니다. 현재 문자를 가상 키 코드로 변환하기 위해 Win32 API에서 VkKeyScan 메서드를 사용하고 있습니다. 하지만이 문제는 내가 작은 알파벳을 전달할 때 대문자로 전달할 때 적절한 키 코드를 반환하지 않고 "("또는 "}와 같은 특수 문자를 반환하는 것과는 다르게 작동합니다. ".이 내가 어떻게해야합니까문자를 해당 가상 키 코드

? 내가 직접이 대문자 나 특수 문자가 포함되어 있는지 여부를 고려하지 않고 가상 해당 문자열을 변환 할 수 어쨌든 있나요?

감사

+0

아니 당신은 할 수 없습니다를, 수식 키가 중요하다, 특히 시프트. 그리고 키보드 레이아웃 "}"은 독일어 키보드에서 죽은 키가 필요합니다 (제 생각 엔). –

답변

7
당신은에서 명확해야한다

귀하의 요구 사항, 구체적으로 당신이 적절한 키 코드로 생각하는 것입니다. documentation에 지정된 VkKeyScan은 virtua를 반환합니다 낮은 우선 순위 바이트의 l 키 코드와 반환 값의 상위 바이트의 시프트 상태를 나타냅니다.

이 코드는 VkKeyScan 메서드의 입력으로 '(' 문자를 사용하는 코드 조각에서 설명합니다.

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

static void Main(string[] args) 
{ 
    var helper = new Helper { Value = VkKeyScan('(') }; 

    byte virtualKeyCode = helper.Low; 
    byte shiftState = helper.High; 

    Console.WriteLine("{0}|{1}", virtualKeyCode, (Keys)virtualKeyCode); 
    Console.WriteLine("SHIFT pressed: {0}", (shiftState & 1) != 0); 
    Console.WriteLine("CTRL pressed: {0}", (shiftState & 2) != 0); 
    Console.WriteLine("ALT pressed: {0}", (shiftState & 4) != 0); 
    Console.WriteLine(); 

    Keys key = (Keys)virtualKeyCode; 

    key |= (shiftState & 1) != 0 ? Keys.Shift : Keys.None; 
    key |= (shiftState & 2) != 0 ? Keys.Control : Keys.None; 
    key |= (shiftState & 4) != 0 ? Keys.Alt : Keys.None; 

    Console.WriteLine(key); 
    Console.WriteLine(new KeysConverter().ConvertToString(key)); 
} 

[StructLayout(LayoutKind.Explicit)] 
struct Helper 
{ 
    [FieldOffset(0)]public short Value; 
    [FieldOffset(0)]public byte Low; 
    [FieldOffset(1)]public byte High; 
} 

이 코드는 다음과 같은 결과가 발생합니다 실행하지 :

// 56|D8 
// SHIFT pressed: True 
// CTRL pressed: False 
// ALT pressed: False 
// 
// D8, Shift 
// Shift+8 
+0

고맙습니다. 그건 아름답게 작동하고 내 문제를 해결! – kambamsu