달력

112024  이전 다음

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

이러한 자동입력 기능은 이미 win API함수로 만들어져 있다.
 
보안 업체는 이러한 API함수가 작동되지 않게 하였기 때문에 엔프로텍터나, 게임가드 등과같은
 
보안을 사용하는 프로그램의 오토제작을 위해서는
 
내장 API를 쓸수 없고(써도 되지만 동작하지 않는다) device driver로 새로 만들어야 된다.
 
물론 기본적인 device driver도 보안업체에서 이미 막아두었고 몇가지 우회를 통해서 만들어야 된다.
 
device driver는 범위를 벗어나기 때문에 설명은 생략하고...
 
 
API에는 다음과 같은 두가지 함수가 자동 입력기능을 담당하여 준다.
 
함수에 대한 설명은 msdn library를 참조하기 바란다.  설명은 생략하겠다.
 
VOID WINAPI keybd_event(
  __in  BYTE bVk,
  __in  BYTE bScan,
  __in  DWORD dwFlags,
  __in  ULONG_PTR dwExtraInfo
);
VOID WINAPI mouse_event(
  __in  DWORD dwFlags,
  __in  DWORD dx,
  __in  DWORD dy,
  __in  DWORD dwData,
  __in  ULONG_PTR dwExtraInfo
);
 
 
예제는 msdn library에서 발췌하였다.
 
#include <windows.h>

   void SetNumLock( BOOL bState )
   {
      BYTE keyState[256];

      GetKeyboardState((LPBYTE)&keyState);
      if( (bState && !(keyState[VK_NUMLOCK] & 1)) ||
          (!bState && (keyState[VK_NUMLOCK] & 1)) )
      {
      // Simulate a key press
         keybd_event( VK_NUMLOCK,
                      0x45,
                      KEYEVENTF_EXTENDEDKEY | 0,
                      0 );

      // Simulate a key release
         keybd_event( VK_NUMLOCK,
                      0x45,
                      KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP,
                      0);
      }
   }

   void main()
   {
      SetNumLock( TRUE );
   }
 
scancode에 대한 참조는 다음 사이트를 참조하기 바란다.
 
http://www.codeproject.com/KB/system/keyboard.aspx
 
 
 
mouse_event()에서 dx, dy는 마우스의 화면 좌표를 가리키는데 0 ~ 65535의 범위를 가진다.
 
이는 화면 해상도에 상관 없이 똑같은 값을 가지는데 이는 해상도에 상관 없이 함수를 사용하기 위해서인 것 같다.
 
이점만 유의하면 함수를 사용하는데 다른 문제는 없을 것 같다.
 
다음은 마우스 이동에 관한 함수 예이다.
 
// 마우스를 이동한다. 현재 좌표에서 이동한다.
void CDriver::MouseMove(DWORD dwMoveX, DWORD dwMoveY)
{
  // 상대 좌표는 마우스의 현재 위치를 기준으로 움직인 것을 나타낸다.
  //
  // 마우스의 절대좌표는 화면 좌측상단은 0,0  우측하단은 65535,65535 이다.
  // 그렇기 때문에 화면 좌표가 들어오면 절대촤표 기준으로 변환시켜서 대입해줘야 된다.
  int scrWidth, scrHeight;
  scrWidth = GetSystemMetrics(SM_CXSCREEN);
  scrHeight = GetSystemMetrics(SM_CYSCREEN);
  int scrX = dwMoveX;
  int scrY = dwMoveY;
  mouse_event(MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_MOVE, scrX*65535/scrWidth, scrX*65535/scrHeight, 0, 0);
 return;
}
 
이제 오토제작에 필요한 모든 기능을 알아보았다..
 
다음에는 마지막으로 간단에서 적용된 코딩예를 설명하겠다.

출처 : http://koronaii.tistory.com/219

Posted by 위너즈
|