윈도에서 키보드나 마우스를 실제로 이용하지 않고 입력을 흉내 내는 방법이 있습니다. 이렇게 입력을 흉내 내면, 게임을 시험하는 작업을 자동화하거나 실수하기 쉬운 반복 작업을 자동화하는 등 다양한 곳에 응용할 수 있습니다. 키보드나 마우스의 입력을 저장했다가 그대로 반영하는 유틸리티는 많지만, 이렇게 프로그래밍하는 방법을 사용하면 활용의 폭이 더 넓어집니다.

이러한 가상 입력 방법으로 잘 알려진 것은 윈도 메시지를 사용하는 것입니다. WM_KEYDOWN, WM_KEYUP, WM_CHAR, WM_LBUTTONDOWN, 그리고 WM_LBUTTONUP 등의 메시지를 Spy++ 도구, FindWindowEx 함수, PostMessage, 그리고 SendMessage 함수를 이용해 보내면 됩니다. 그런데 어떤 프로그램에서는 이 방법으로 가상 입력이 잘되지 않고, 다른 방법을 찾아야 합니다.

다른 가상 입력 방법으론 SendInput 함수를 이용하는 것이 있습니다. SendInput을 이용할 때에도 주의할 점이 있는데, 특히 포커스 전환할 때엔 Sleep으로 지연을 적당히 줘야 잘 동작할 때가 있습니다. 그리고 마우스 입력을 흉내 낼 때엔 SendInput 함수만으로는 잘되지 않고, SetCursorPos 함수로 마우스 커서 위치를 옮긴 다음에 SendInput 함수로 클릭만 흉내 내야 잘 되는 것 같습니다.

참고로, 관련된 함수 중에 AttachThreadInput이라는 함수도 있는데, 이걸 꼭 사용해야 하는지 잘 모르겠습니다.

다음은 SendInput을 활용해서, test라고 입력하고 엔터를 누른 다음에 화면의 가로 100, 세로 100 위치를 왼쪽 마우스 버튼으로 클릭하는 예제입니다.

#include "stdafx.h"
#include <vector>
#include <windows.h>

using std::vector;

void type_key(const vector<WORD>& virtual_key)
{
        for (vector<WORD>::const_iterator iterator = virtual_key.begin(); iterator != virtual_key.end(); ++iterator)
        {
                INPUT an_input = {};
                an_input.type = INPUT_KEYBOARD;
                an_input.ki.wVk = *iterator;                

SendInput(1, &an_input, sizeof an_input);
Sleep(10);

an_input.ki.dwFlags = KEYEVENTF_KEYUP;
                SendInput(1, &an_input, sizeof an_input);
                Sleep(10);
        }              
}

void click_mouse_left_button(LONG x, LONG y)
{
        SetCursorPos(x, y);
        Sleep(10);

        INPUT an_input = {};
        an_input.type = INPUT_MOUSE;

        an_input.mi.dwFlags = MOUSEEVENTF_LEFTDOWN;
        SendInput(1, &an_input, sizeof an_input);
        Sleep(10);

        an_input.mi.dwFlags = MOUSEEVENTF_LEFTUP;
        SendInput(1, &an_input, sizeof an_input);
        Sleep(10);
}

int _tmain(int argc, _TCHAR* argv[])
{
        char input[] = "TEST\xd";
        type_key(vector<WORD>(input, &input[strlen(input)]));
        click_mouse_left_button(100, 100);
        return 0;
}

2008/10/01 14:44 2008/10/01 14:44

트랙백 주소 :: http://www.easyisright.net/trackback/552

댓글을 달아 주세요

  1. shadows 2010/01/27 03:51  댓글주소  수정/삭제  댓글쓰기

    좋은 정보 감사합니다.