2012-01-11 2 views
1

현재 문자를 보내려고합니다. 따라서 user32.dll에있는 기본 메서드 GetKeyboardLayout 및 VkKeyScanExW를 사용하여 현재 키보드 레이아웃의 가상 키 코드 (및 시프트 및 컨트롤 상태)를 시스템에서 가져옵니다. 그 다음에이 가상 키 코드를 user32.dll의 원시 메소드 인 SendInput을 사용하여 애플리케이션에 보냅니다.유니 코드에 대한 VkKeyScanEx/Sendinput 대안?

유로화를 제외한 모든 작업이 정상적으로 작동합니다. 이 문자를 VkKeyScanExW에 매개 변수로 전달하면 -1을 반환하므로 찾을 수 없습니다. 내 키보드에서 Ctrl + Menu + E (독일어 레이아웃)를 사용하여 위치합니다.

이제 유로화 기호가 유니 코드 기호이고 ASCII 레이아웃에 매핑되지 않았기 때문에 이러한 상황이 발생한다고 가정합니다. Sendinput은 또한 하드웨어 스캔 코드를 사용하여 유니 코드 모드를 허용합니다. 그래서 SendInput의 유니 코드 모드를 사용하면 내 문제가 해결되기를 바랍니다. 하지만 내 가상 키 코드는 유니 코드 범위가 넓기 때문에 하드웨어 스캔 코드가 아닌 것 같습니다. 유니 코드 문자 (예 : €)를 SendInput을 통해 다른 컨트롤/창으로 보내는 방법에 대한 샘플은 어디에서 찾을 수 있습니까? MSDN과 pinvoke.net은 유용한 샘플을 제공하지 않습니다.

+0

키보드 레이아웃 문제를 우회하여 대상 애플리케이션에 직접'WM_CHAR '을 보내는 것을 고려해 보셨습니까? – CodesInChaos

답변

2

그동안 나는 SendInput의 유니 코드 매개 변수를 사용하여 문제를 해결했습니다. 이제 더 이상 VkKeyScan을 사용할 필요가 없습니다. 캐릭터 자체를 전달할 수 있습니다.

private static void SendUnicodeChar(char input) 
{ 
    var inputStruct = new NativeWinApi.Input(); 
    inputStruct.type = NativeWinApi.INPUT_KEYBOARD; 
    inputStruct.ki.wVk = 0; 
    inputStruct.ki.wScan = input; 
    inputStruct.ki.time = 0; 
    var flags = NativeWinApi.KEYEVENTF_UNICODE; 
    inputStruct.ki.dwFlags = flags; 
    inputStruct.ki.dwExtraInfo = NativeWinApi.GetMessageExtraInfo(); 

    NativeWinApi.Input[] ip = { inputStruct }; 
    NativeWinApi.SendInput(1, ip, Marshal.SizeOf(inputStruct)); 
} 

모두에게 감사드립니다.

+2

어쨌든 문자를 전송할 때이 솔루션이 가장 적합합니다. 미국 영어 키보드가 있더라도 작동합니다. 하지만 당신이 필요하다고 생각하지 않아 GetMessageExtraInfo - 나는 당신이 문서가 말하는 것을 잘못 읽은 것 같습니다; 요점은 당신이 거기에 무엇이든 둘 수 있고 수신하는 프로세스가 그것을 읽도록 GetMessageExtraInfo를 호출한다는 것입니다. – Random832