원격제어의 기능 중 하나는 원격지의 화면을 보는 것이고 다른 하나는 기능(마우스, 키보드)을 수행하는 것이다.
원격지에 기능을 수행하기 위해서는 가상으로 마우스나 키보드가 눌리도록 명령을 주어야 한다.
윈도우 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));
}
누군가가 원겨제어 소스코드를 올려놓은 것이 있는데 관심이 있다면
를 참고하기 바란다.
'Programing' 카테고리의 다른 글
[설계] 건축과 소프트웨어 개발 (0) | 2013.11.20 |
---|---|
[JSTL] 나눗셈 연산 (0) | 2013.11.19 |
지역변수의 이름은 짧게 하는 것이 보기에 좋다. (0) | 2013.05.23 |
클래스 이름짓기 (0) | 2013.05.22 |
개발도구 - 이슈관리, CI (0) | 2013.01.29 |