home > working > C/C++ > Source, Tip

 


Name  
   이상수 
File #1  
   gh.zip (976.1 KB)   Download : 473
Subject  
   오토마우스 오토 키보드 만들기 (허접강좌) ^^;;
최근 온라인 게임등을 하다보면 오토마우스가 등장
게이머의 노가다를 대신해 주는 프로그램이 등장 환영을 받고있다
이런 오토 마우스는 사용자가하는 입력을 자동으로 반복해주는 것으로
구현자체는 그다지 어렵지 않다
물론 부가 기능이 추가될수록 복잡해질수는 있으나 여기서는 그 핵심만
살펴보기로 하자
--------------------------------------------------------------------------------------------------
사실 정말로 간단한 오토마우스를 만들고자 한다면
::SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam) 이라는 이 함수 하나만 알아도 된다
여기서 HWND을 메세지를 받게될 윈도우의 핸들이며 UINT Msg는 메세지의 종류 그리고 그 다음을 각각의 파라미터 값을 의미 한다.
윈도우 핸들 값은 ::FindWindow(LPCTSTR,LPCTSTR)라는 함수로
알아내는 것이 제일 간편하다 첫번째 인자는 NULL로 하는 것이 일반이며
2번째 인자에는 윈도우의 이름을 넣어주면 된다.
윈도우 이름이 어떤 것인지 잘 모르겠으면 Ctrl+Alt+Del키를 눌렀을때
작업관리자에 뜨는 프로그램 명을 보면 된다.

핸들명 = ::FindWindow(NULL,"Brood War");
::SendMessage(핸들명,WM_KEYDOWN,VK_DOWN,0);
위를 실행시키면 사용자가 아래 방향 화살표를 눌렀을 때와 동일한 작동이
된다. 예를 들어 위로 움직이고 스페이스바를 눌르는 동작을 연속으로
반복시키고 싶다면
::SendMessage(핸들명,WM_KEYDOWN,VK_UP,0);
::SendMessage(핸들명,WM_KEYDOWN,VK_SPACE,0);
위의 두 함수를 루프형태로 돌리면 된다.
이럴경우 실제 사용자가 누르는 것보다는 훨씬 빠른 일력이 일어나기 때문에 텀을 두기 위해서 Sleep(Millisecond)를 사용하거나 위의 동작을
타이머를 통해 일정한 시간에 반복 시키면 된다.
그런데 여기서 약간의 문제가 발생한다.
일단 메세지를 보낼 윈도우의 핸들값을 얻어오려면 그 프로그램이 메모리에 로드되어 있는 .. 실행중의 상태여야 한다는 것이다.
즉 오토마우스 프로그램은 게임을 먼저 실행 시킨후에 작동을 시켜야 한다는 이야기이다
두번째로 그렇다면 오토마우스를 실행시키자 마자 함수가 호출되어
사용자가 멈추려면 직접 게임에서 나와 이 프로그램을 종료시켜야 하는가?
위의 두가지 문제는 그냥 넘길수도 있는 문제지만 생각해 보면 사용자를
어지간히 귀찮게 하는 문제이다.
물론 윈도우에서는 위에 대한 훌륭한 해결책을 제공한다.
사용자는 게임 내에서 오토마우스 프로그램을 끄고 킬수 있으며 원하는 시점에서 타겟 윈도우의 핸들을 얻어오도록 할수도 있다.
문제해결의 핵심은 게임이 실행중인 상태 즉 우리의 프로그램이 비 활성화된 상태에 어떻게 메세지를 전달 시키느냐 하는 것이다.
우리는 이것을 후킹을 통해 해결할 수 있다.
후킹의 개념 및 내용은 상당이 어렵고 사실 나도 잘 모르기 때문에 ^^;;
여기에선 간단한 사용법만 알고 넘어가도록 해보장
사용법 자체는 간단한다.
훅을 설치하고 (SetWindowsHookEx(...)) 제거(UnhookWindowsHookEx(hook)) 하면 된다.
::SetWindowsHookEx(int idHook,HOOKPROC lpfn,HINSTANCE hmod,DWORD dwThreadID)
이 설치 함수는 일단 정수기의 필터 정도로 생각해보도록 하자.
인자에는 가로챌 메세지의 종류,후킹 프로시져 이름,후킹인스턴스이름등이
들어간다.
우리는 이렇게 설치만하면 윈도우에서 발생하는 메세지를 가로채어
우리가 원하는 형태로 가공할 수 있게된다.
예를 들어 키보드 메세지를 가로채고자 할떄는
static HHOOK hook = NULL;
hook = SetWindowsHookEx(WH_KEYBOARD,hookproc,hinstance,NULL);
라는 식으로 실행만 시켜주면 된다.
그리고 우리가 만든 프로그램이 비활성화 상태에 있더라고 위와 같은
메세지가 발생했을경우 우리의 프로그램에
PostMessage(hwnd,WM_USER+755,wparam,lparam);
위와 같이 우리의 프로그램에 메세지를 발생시켜주면
사용자가 실제로 입력한 것과 똑같은 이벤트가 어플리케이션에 전달이되고
우리는 위의 사용자 정의 이벤트에 대한 처리만 해주면 된다.

1 훅 설치 hook = SetWindowsHookEx(WH_KEYBOARD,hookproc,hinstance,NULL);
2 메세지 전달
PostMessage(hwnd,WM_USER+755,wparam,lparam);
3. 받은 메세지 처리
ON_MESSAGE(WM_USER+755, 실행시킬 함수이름정도?)메세지맵에 사용자 정의 메세지 추가후 처리

위와 같은 형식으로 진행 해주면
이제는 우리는 게임안에서도 미리 약속된 키를 통해 매크로를 실행시키고
끄고 할 수 있게 되었습니다.

에고 힘들다 ... 나머지는 다음 강좌를 통해 올리도록 하겠습니다. ㅎㅎ

참고자료로 위와 같이 메세지를 중간에서 가로채주는 프로그램의 소스를
아래에 올려놓도록 하겠습니다.



Name Memo Password  
        


Prev
   [강좌] How to use C++ in MFC No.1 Operator Overload [1]

조규남
Next
   ps를 만들어 버리자 [1]

조규남


Copyright 1999-2018 Zeroboard / skin by JiYoo / edit by Mystous