본문 바로가기

Programing

원격제어:키보드 시물레이션

원격제어의 기능 중 하나는 원격지의 화면을 보는 것이고 다른 하나는 기능(마우스, 키보드)을 수행하는 것이다.

원격지에 기능을 수행하기 위해서는 가상으로 마우스나 키보드가 눌리도록 명령을 주어야 한다.


윈도우 API 중에는 keybd_event가 있는데 현재는 SendInput를 사용하라고 msdn에는 권장을 한다.

 keybd_event: http://msdn.microsoft.com/en-us/library/windows/desktop/ms646304(v=vs.85).aspx

 SendInput: http://msdn.microsoft.com/en-us/library/windows/desktop/ms646310(v=vs.85).aspx


아래 프로그램은 3초후에 키보드 오른쪽 키를 누른 것 같은 효과를 준다.

#include <stdio.h>

#include <Windows.h>


void PressLeft();

void PressRight();


int main() {

printf("Wait\n");

Sleep(3000);

printf("Send\n");

PressRight();

printf("Completed\n");

return 0;

}


void PressVirtualKeyboad(BYTE vk) {

// Simulate a key press

keybd_event( vk, vk, 0, 0 );


// Simulate a key release

keybd_event( vk, vk, KEYEVENTF_KEYUP, 0);

}


void PressLeft() {

PressVirtualKeyboad(VK_LEFT);

}


void PressRight() {

PressVirtualKeyboad(VK_RIGHT);

}


코드를 보면 keybd_event라는 함수가 두번 호출 되었는데, 처음은 키가 눌린 것을 시뮬레이트한 것이고, 두번째는 키가 놓인 이벤트를 시뮬레이트를 한 것이다.


SendInput을 사용한 버전은 아래와 같다. 나머지는 동일하고 PressVirtualKeyboad부분만 바뀐다.

구조체를 사용하기 때문에 조금 복잡해졌다. 배열로 여러개의 명령을 보낼 수 있기 때문에 대량의 입력을 보낼 때 유용하다.

또한 마우스 명령 등도 같이 보낼 수 있어졌다.

void PressVirtualKeyboad(BYTE vk) {

INPUT input;

ZeroMemory(&input, sizeof(INPUT));

input.type = INPUT_KEYBOARD;

input.ki.wVk = VK_RIGHT;

input.ki.wScan = VK_RIGHT;


// Simulate a key press

SendInput(1, &input, sizeof(INPUT));


// Simulate a key release

input.ki.dwFlags = KEYEVENTF_KEYUP;

SendInput(1, &input, sizeof(INPUT));

}



누군가가 원겨제어 소스코드를 올려놓은 것이 있는데 관심이 있다면

http://bench87.tistory.com/entry/Visual-C-%EC%9B%90%EA%B2%A9-%EC%A0%9C%EC%96%B4-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8-%EC%86%8C%EC%8A%A4

를  참고하기 바란다.