2010-01-30 5 views
6
void WriteChar(char c) 
{ 
    INPUT input = {0}; 
    input.type = INPUT_KEYBOARD; 
    input.ki.wVk= VkKeyScanEx(c, GetKeyboardLayout(0)) ; 
    SendInput(1,&input, sizeof(INPUT)); 
} 

VkKeyScanEx는 '/'및 '?'(동일한 키)에 대해 다른 키 코드를 반환하지만이 메서드를 사용하여 '?'가 포함 된 메시지를 작성하면 '/'만 쓸 것입니다. 나는 무슨 일이 일어나고 있는지 모른다. ';'와 같은 문제가 발생합니다. 및 ':'.SendInput()이 올바른 시프트 문자를 "보내지 않습니다"?

부분적으로 키 코드와 스캔 코드를 이해하지 못합니다. 대부분의 캐릭터는 가상 키 코드를 가지고 있지만, 물음표와 비슷한 것을 찾을 수 없습니다. 존재해야하지만 나열되어 있지 않습니까?

답변

1

이와 같이 시도해보십시오. KEYEVENTF_UNICODE을 사용하는 경우 호스트 플랫폼은 Windows 2000 또는 XP 이상이어야합니다. 당신이 올바르게 입력 구조를 작성하고 몇 가지 필요한 구성원이 초기화되지 않은 남아 있지 않은 사실에서 판단

INPUT input[ 2 ]; 

input[ 0 ].type = INPUT_KEYBOARD; 
input[ 0 ].ki.wVk = 0; 
input[ 0 ].ki.wScan = c; 
input[ 0 ].ki.dwFlags = KEYEVENTF_UNICODE; 
input[ 0 ].ki.time = 0; 
input[ 0 ].ki.dwExtraInfo = GetMessageExtraInfo(); 

input[ 1 ].type = INPUT_KEYBOARD; 
input[ 1 ].ki.wVk = 0; 
input[ 1 ].ki.wScan = c; 
input[ 1 ].ki.dwFlags = KEYEVENTF_UNICODE | KEYEVENTF_KEYUP; 
input[ 1 ].ki.time = 0; 
input[ 1 ].ki.dwExtraInfo = GetMessageExtraInfo(); 

SendInput((UINT)2, input, sizeof(*input)); 

, 나는 당신이이 설명서를 보지 못했다 가정 것입니다. SendInput, INPUTKEYBDINPUT을 참조하십시오.

+0

종종'''input.ki.dwExtraInfo'''의 예가 0으로 설정되어 있습니다.''input [0] .ki.dwExtraInfo = GetMessageExtraInfo();'''일까요? – camelCase

+0

@rasteve, 솔직히 모르겠습니다!아마도 'KEYBDINPUT'에 대한 문서 (https://msdn.microsoft.com/en-us/library/ms646271(VS.85).aspx)에서'dwExtraInfo'에 관해서 이렇게 말했기 때문에 아마 그렇게했을 것입니다 : 이 정보를 얻기위한 GetMessageExtraInfo 함수 .' – Sam

+0

나는'''GetMessageExtraInfo'''를 사용하여'''dwExtraInfo''에 열쇠를 넣었던 것을 읽었지만 지금은 확신이 없습니다. – camelCase

9

스캔 코드는 키보드에서 반환 된 원시 키 ID입니다. 그래서 101 개의 키 키보드는 (이론적으로) 되돌아 갈 수있는 101 개의 고유 한 스캔 코드를 가지고 있습니다. (각주 참조)

가상 키 코드는 이상적인 키보드의 키를 나타내는 별도의 코드 집합입니다. 실제 키보드에서 Tab 키가 어디에 있고 어떤 스캔 코드가 사용 되든 관계없이 가상 키 코드는 항상 VK_TAB입니다. windows.h은 인쇄 할 수없는 가상 키에 대한 VK_xxx 코드를 정의하고 인쇄 가능한 가상 키는 ASCII 값과 같습니다.

그러나 가상 키 코드는 여전히 키 코드입니다. 'A'와 'a'는 동일한 가상 키 코드를 가지므로 'A'를 보내려면 VK_SHIFT를 내 보낸 다음 'a'를 내린 다음 'a'를 누른 다음 VK_SHIFT를 보냅니다.

VkKeyScanEx()

이 페이지 함수가 성공하면 http://msdn.microsoft.com/en-us/library/ms646332(VS.85).aspx

에서 아래의 인용문을 참조 스캔 키와 이동 상태로 문자 변환, 반환 값의 하위 바이트는 가상 키를 포함 코드이고 상위 바이트는 다음 플래그 비트의 조합이 될 수있는 시프트 상태를 포함합니다.

VkKeyScanEx()에서 복귀 할 수는 없으므로 Shift 키가 있는지 확인해야합니다. 그리고 당신은 또한 모든를 keyDown에 대한의 keyup을 보내 가지고 별도의 키 입력

SHORT vk = VkKeyScanEx(c, ...); 
if (vk & 0x100) // check upper byte for shift flag 
{ 
    // send a shift key down 
} 
if (vk & 0x200) // check for ctrl flag 
{ 
    // send a ctrl key down 
} 
input.ki.wVk = vk & 0xFF; 

// send keyup for each of the keydown 

Shift 키를 보냅니다.

각주 :

이 단지 이론에 연습 표준 PC 키보드에 당신도 더 이상 얻을 수없는 오래된 IBM 키보드 에뮬레이션, 그래서 일부 키는 다른에 따라 2 개 개의 다른 스캔 코드를 반환 할 수 있습니다 다른 경우에는 두 개의 키가 동일한 스캔 코드를 반환 할 수 있습니다.

+0

안녕하세요, 답장을 보내 주셔서 감사합니다. 나는 모든 keydown에 대해 keyup을 할 필요가 없다고 생각했다. 메모장 창에서 이것을 테스트 해보았을 때 하나의 문자 만 기록했기 때문이다 (반면에 눌려지지 않았더라도 공개되지 않으면 분명히 끝나지 않는 문자열이되기 때문이다 캐릭터의). 내가 이것을 가정하는데 왜 잘못 되었습니까? –

+0

키를 누르고 있으면 키보드는 실제로 그것을 릴리스 할 때 keydown, keydown, keydown, keydown, ... 및 keyup을 보냅니다. 예외는 반복하지 않는 CTRL, SHIFT 및 ALT입니다. –

+0

"keydown"신호를 반복적으로 보내는 것은 실제 키보드 자체가 아니라고 생각합니다. 나는이 행동이 실제로 컴퓨터에 의해 제어된다고 생각한다. – Sam

관련 문제