2012-01-01 2 views
-1

나는 다른 창으로 키 스트로크를 보내는 프로그램을 만들었고, 나는 그것이 모두 작동하도록 만들었지 만, 온라인으로 가서 키 스트로크 부분을 수행하는 기능을 찾아야했다. 그것은 작동하지만 실제로 무엇을하고 있는지 전혀 모른다. 다른 사람이이 기능의 각 행에 무엇을하고 있는지 설명 할 수 있습니까?C++ 함수의 각 행이 무엇을 설명 할 수 있습니까? 그것은 키 스트로크를 보내지 만 나는 방법으로 혼란 스럽다.

void GenerateKey(int vk, BOOL bExtended) { 

    KEYBDINPUT kb = {0}; 
    INPUT  Input = {0}; 

    /* Generate a "key down" */ 
    if (bExtended) { kb.dwFlags = KEYEVENTF_EXTENDEDKEY; } 
    kb.wVk = vk; 
    Input.type = INPUT_KEYBOARD; 
    Input.ki = kb; 
    SendInput(1, &Input, sizeof(Input)); 

    /* Generate a "key up" */ 
    ZeroMemory(&kb, sizeof(KEYBDINPUT)); 
    ZeroMemory(&Input, sizeof(INPUT)); 
    kb.dwFlags = KEYEVENTF_KEYUP; 
    if (bExtended) { kb.dwFlags |= KEYEVENTF_EXTENDEDKEY; } 
    kb.wVk = vk; 
    Input.type = INPUT_KEYBOARD; 
    Input.ki = kb; 
    SendInput(1, &Input, sizeof(Input)); 

    return; 
} 

은 여기에 호출의 예 :

GenerateKey('C', FALSE); // Sends keystroke 'c' 

이 키 입력 'C'를 보냅니다.

이 함수는 대문자로만 작동하며 특정 16 진수 코드에서만 작동합니다. 예를 들어, (키 입력) 캐리지 리턴을 보내, 여기에 호출입니다 : 나는 이러한 호출 중 하나와 물음표 (16 진수 0x3F입니다)를 전송하려고하는 경우에는

GenerateKey(0x0D, FALSE); // Sends carriage return 

, 아무 일도 발생하지 않습니다 :

GenerateKey(0x3F, FALSE); // Nothing happens 
GenerateKey('?', FALSE); // Nothing happens 

사람들이 왜 작동하지 않는지 알 수 있습니까?

또한 누군가가 두 번째 인수 인 BOOL bExtended가 무엇인지 설명 할 수 있습니까? TRUE와 FALSE 사이를 변경하면 보내는 키 입력에 차이가없는 것처럼 보입니다.

+0

귀하의 질문은 WinAPI에 특정한 것으로, 태그를 추가해야합니다. C++ 표준은 키 스트로크에 대해 알지 못합니다. –

+0

키보드에 물음표 키가 없습니다. SHIFT +'/'(US QWERTY 자판 배열, YMMV)를 보내고 싶을 것입니다. –

답변

4

귀하의 GenerateKey 기능은 키보드 입력을 합성는 Win32 API로부터 SendInput 기능의 내부를 사용합니다.

MSDN documentation for that function을 읽으면 해당 기능의 작동 방식 및 전화 걸기 방법을 이해하는 데 필요한 모든 정보를 찾을 수 있습니다.

vk 매개 변수는 가상 키 코드이고 나열된 here입니다.

bExtended 파라미터 TRUE이면 KEYEVENTF_EXTENDEDKEY 플래그 the documentation에 따른 "스캔 코드 값 0xE0 (224)를 갖는 프리픽스 바이트가 선행 된"것을 의미 설정된다.

+0

정말 고마워! 가상 키 코드는 나를 붙드는 주요한 것들 이었지만 지금은 이해합니다. – user1125316

+0

@ user1125316 : 죄송합니다. 가상 키 코드 목록에 대한 링크가 끊어졌습니다. 나는 그것을 지금 고쳤다. –

관련 문제