2011-03-19 5 views
1

C++에서 키 누르기를 에뮬레이트하는 데 적합한 시스템을 인터넷에서 검색했습니다.문자열 분할 및 keybd를 사용하여 문자 전송

문자열을 다른 프로그램에 보내고 싶지만 GenerateKey 함수는 한 번에 하나만 보낼 수 있습니다. 나는 문자열을 깨뜨리고 각 문자를 개별적으로 보내는 코드를 만들었지 만 문자 자체 대신 알파벳의 특정 문자 수가 전송되는 경우가 있습니다. (예 : "h"를 입력하면 컴퓨터가 "8"을 울림)

어떻게 해결할 수 있으며 더 좋은 방법이 있습니까? 고맙습니다!

접근의이 종류는 정말 복잡
#include <windows.h> 
#include<iostream> 
#include <winable.h> 
#include <fstream> 
#include<time.h> 
#include<string> 

using namespace std; 

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; 
}  

int main() { 

SetConsoleTitle("sendkeys"); 
string sentence; 
while (1){ 
    cin>>sentence; 
    char letter; 
    int track = 0; 

    while(sentence[track] != '\0') { 

    cout<<sentence[track]; 
    letter = sentence[track];  
    GenerateKey(letter, FALSE); 
    track++;  
}  
}  
} 
+0

GenerateKey ('a', FALSE); 이것은 키 A를 생성합니다. –

+0

'winapi' 태그를 추가했습니다. 이것은 C++ 자체와 아무런 관련이 없기 때문입니다. –

+0

GenerateKey ('h'...)가 8을 얻는 이유는 SendInput이 ASCII 문자가 아닌 키보드의 키를 식별하는 VK 값을 사용하기 때문입니다. VK 및 ASCII 값은 0-9 및 A-Z에 대해 겹치기 - 대문자입니다. 하지만 다른 ASCII 값은 결국 당신에게 '무작위'키를 가져옵니다. 소문자 h는 ASCII 코드 0x68을가집니다. winuser.h에서 모든 VK_ 값이 정의되어 있고 VK_NUMPAD8이라는 것을 보게 될 것입니다. 그래서 시스템은 이것을 숫자 키패드에서 8을 눌러서 처리합니다. 이것은 numlock에 따라 8 또는 up-arrow 중 하나를 가져옵니다. 'H'를 보내면 대문자 잠금 상태에 따라 H 대 H가 나옵니다. – BrendanMcK

답변

1

사용자가 그 과정에서 키보드 포커스를 변경하는 경우, 키는 수와 (당신은, SHIFT, CONTROL, 및 ALT의 상태를 관리 ALT + 0xyz 콤보에 특수 문자를 변환해야합니다) 잘못된 창으로 가라.

SendMessage(WM_SETTEXT) 또는 SendMessage(EM_REPLACESEL)을 사용하면 특정 문자열을 한 번에 특정 창으로 보낼 수 있습니다.

+0

고마워, 나는 그걸 조사하고있다. –

+0

문자열을 보내는 데 사용되는 synax의 예를 들어 주시겠습니까? –

+0

아니면 독립 실행 형 함수입니까 ?? –

1

사용중인 API에 익숙하지 않지만 다른 프로세스의 stdin에 텍스트를 보내려고한다고 가정합니다.

자식 프로세스 (즉, 프로세스가 시작된 프로세스)라면 this article에 설명 된대로 파이프와 리디렉션 된 I/O를 사용할 수 있습니다.

+0

나는 무엇에 익숙하지 않다는 것을 유감스럽게 생각합니다. 너는 말하고있다. 나는 그것을 들여다 볼 것이다. –

+0

'SendInput'은 키보드 이벤트를'stdin'이 아닌 UI 메시지 루프로 보냅니다. –

+0

@Ben : 잡았다. @ 에드먼드 :이 경우, 아마도이 방법은 필요한 것이 아닙니다. 부담없이 들으십시오! – Mac