당신은에서 명확해야한다
귀하의 요구 사항, 구체적으로 당신이 적절한 키 코드로 생각하는 것입니다. 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
아니 당신은 할 수 없습니다를, 수식 키가 중요하다, 특히 시프트. 그리고 키보드 레이아웃 "}"은 독일어 키보드에서 죽은 키가 필요합니다 (제 생각 엔). –