달력

52024  이전 다음

  • 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
  • 31

멀티바이트 코드로 작업중 문제가 발생하여 유니코드로 바꾸면서 정리 합니다.  

앞으로 TCHAR 타입을 사용하는 습관을 들여야겠습니다. 

 

strcpy -> wcscpy -> _tcscpy (문자열을 복사) 

strncpy -> wcsncpy -> _tcsncpy ( 사이즈 만큼 복사) 

strlen -> wcslen -> _tcslen (문자열 길이 확인)  

strcat -> wcscat -> _tcscat (두 문자열 이어 붙이기) 

strncat -> wcsncat -> _tcsncat (사이즈 만큼 이어 붙이기) 

strcmp -> wcscmp -> _tcscmp (문자열 비교) (반환 값(-1, 0, 1)) 

strncmp -> wcsncmp -> _tcsncmp ( 사이즈 만큼 문자열 비교) 

stricmp -> wcsicmp -> _tcsicmp (대소문자를 구별하지 않고 문자열을 비교) 

strnicmp -> wcsnicmp -> _tcsnicmp (사이즈 만큼 대소문자를 구별하지 않고 문자열을 비교)

strchr -> wcschr -> _tcschr (문자 찾기) 

strrchr -> wcsrchr -> _tcsrchr (문자 찾기 (문자열 끝에서 부터 검색)) 

strstr -> wcsstr -> _tcsstr (문자열 찾기)

strpbrk -> wcspbrk -> _tcspbrk (문자 찾기 (두번째 인수를 찾고자 하는 문자들의 집합(문자열)으로 구성)   

strtok -> wcstok -> _tcstok (문자열 자르기 (두번째 인수를 집합(문자열)으로 구성 가능)) => 해당 문자가 NULL로 치환 됨

strset -> wcsset -> _tcsset (문자 치환, 첫째 인수의 모든 문자를 두번째 인수 문자로 변경함) => "abc" -> "bbb" 

strnset -> wcsnset -> _tscnset (사이즈 만큼 문자 치환) 

strupr -> wcsupr -> _tcsupr (대문자로 치환)

strlwr -> wcslwr -> _tcslwr (소문자로 치환) 

strrev -> wcsrev -> _tcsrev (문자열 역정렬) => "가나다라마" -> "마라다나가"



출처 : http://blog.naver.com/kilsu1024/110168931552

Posted by 위너즈
|

이러한 자동입력 기능은 이미 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 위너즈
|

 

클립보드에서 데이터 얻기와 데이터 쓰기

클립보드에서 데이터를 얻고자 할 경우 GetClipboardData 함수를 사용합니다.

예를 들어서 클립보드에서 텍스트 데이터를 얻고자 한다면 다음과 같이 할수 있습니다.

         HANDLE hClipboard;

hClipboard=GetClipboardData(CF_TEXT);

만약 텍스트 데이터가 없다면 hClipboard에는 NULL값이 전송될것입니다. 넘겨주는 형식이 메모리 핸들러 형식이기 때문에 이데이터를 사용허가권을 받기 위해서는 GlobalLock를 사용해야 합니다.


 

 HANDLE hClipboard;

 LPASTR pClipboard;

hClipboard=GetClipboardData(CF_TEXT);

pClipboard=GlobalLock(hClipboard);

 //pClipboar를 사용한다.


 

위와 같이 하면 클립보드에 있는 데이터를 바로 사용하는 형식이 됩니다. 때로는 클립보드에 있는 데이터를 자신의 프로그램 내로 복사하고자 할경우가 있습니다. 이럴경우에는 클립보드에 저장된 데이터 크기만큼 메모리를 확보한후에 데이터를 복사하면 됩니다. 다음은 클립보드에서 데이터를 복사하는 예입니다.


 


 

           //클립보드를 연다

        OpenClipboard(hwnd);

        //문자형식의 데이터를 클립보드에서 얻는다.

        hClipboard=GetClipboardData(CF_TEXT);

        //hClipboard가 NULL이면 클립보드를 닫는다.

        if(!hClipboard)

        {

                CloseClipboard();

                 return 0;

        }

        //클립보드 데이터를 넣을 메모리 할당

        szBuff=GlobalReAlloc(szBuff,GlobalSize(hClipboard),GMEM_MOVEABLE);

        //메모리 사용 허가권을 받는다.

        pBuff=(LPSTR)GlobalLock(szBuff);

        //클립보드 메모리 사용허가권을 받는다.

        pClipboard=GlobalLock(hClipboard);

        //클립보드 데이터를 복사한다.


 

클립 보드에 데이터를 넣고자 한다면 SetClipboardData를 사용하여 간단하게 넣을 수 있습니다.


 

HANDLE SetClipboardData(

UINT uFormat, // 클립 보드 데이터 포맷

HANDLE hMem // 데이터 적재 메모리 핸들

); 


 

위의 예에서 pBuff에 있는 데이터를 수정한후 다시 클립보드에 넘기고자 할 때 있대 pBuff를 넘겨주는 것이 아니라 szBuff를 넘겨주어야 합니다. 클립보드로 넘어가는 것은 메모리 사용 허가 포인터 변수가 아니라 메모리 핸들러 이기 때문입니다.

 SetClipboardData(CF_TEXT,szBuff);


출처 : http://kr.blog.yahoo.com/koglul82/1984
Posted by 위너즈
|

Win32를 작성하기위한 기본적인 틀을 만들어 보기로 하겠다.

단순히 메인창을 다이얼로그박스로 띄울 뿐이다.

파일 생성은 다음과 같다.
step 01. VS 2008 >> 새 프로젝트 
step 02. Visual C++ >> Win32 >> Win32 프로젝트
step 03. ((이름과 위치는 원하는 것으로 설정 하고 확인))

== Win32 응용프로그램 마법사 대화상자가 활성화==
step 04. 응용프로그램 설정단계에서 빈 프로젝트 체크박스 체크
step 05. 마침 (솔루션에는 아무런 파일도 존재하지 않는다)

== 솔루션 탐색기의 프로젝트와 리소스, 소스, 헤더 파일이라는 폴더가 활성화 ==
step 06. 프로젝트에서 리소스를 추가한다.


step 07. ID값을 IDD_DIALOG_MAIN로 변경


step 08. 프로젝트에서 새항목을 추가한다.(단순히 Basic.cpp로 만들었다)

<결과> 솔루션 탐색기에 다음과 같이 파일이 정리 된다.

step 09. Basic.cpp에 코드를 작성한다. 코드는 다음과 같다.

// Basic.cpp

#include <Windows.h>
#include <Windowsx.h>
#include <tchar.h>
#include "resource.h"
#include "Main.h"

INT_PTR WINAPI MainDlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);

int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpszCmdParam, int nCmdShow)
{
 // DialogBox생성 함수
 DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG_MAIN), HWND_DESKTOP, MainDlgProc);

 return 0;
}

// DialogBox Procedure
INT_PTR WINAPI MainDlgProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam)
{
 switch (iMessage)
 {
 case WM_INITDIALOG :
  //InitDialogBox(hWnd);
  return TRUE;

 case WM_COMMAND :
  switch (LOWORD(wParam))
  {
  case IDOK :
  case IDCANCEL :
   EndDialog(hWnd, IDOK);
   return TRUE;
  }
  return TRUE;
 }

 return FALSE;
}


참고:
SetDlgMsgResult :
Windowsx.h에 선언되어 있으며 메세지 크래커 이다.
Window Procedure(WindProc)지 크래커로는 HANDLE_MSG 매크로가 존재한다.
하지만 DialogBox에서는 이 매크로를 사용하기에는 적절하지 않다.
DlgProc는 WindProc과는 달리 LRESULT 대신 BOOL 값을 반환하게 된다.
그래서 HANDLE_MSG가 아닌 SetDlgMsgResult를 사용하였다.
사실.... 이렇게 짧은 코드에서는 필요하지 않으나... 기본 틀로 작성한것이다.


Posted by 위너즈
|

듀얼모니터를 사용하는 경우 윈도우나 마우스의 좌표가 음수(-)값이 나올 수 있다.
디스플레이 설정에서 우측의 모니터를 Primary모니터로 잡는 경우, 우측 모니터의 좌 상단이 (0,0)좌표가 되며, 왼쪽 모니터의 X좌표는 음수 값을 갖게 된다.

마우스나 윈도우의 좌표를 LPARAM의 전달하는 메시지의 경우,
보통 HIWORD(lParam), LOWORD(lParam)를 사용해서 좌표를 파싱하게 되는데

HIWORD()
LOWORD() 매크로의 경우, WORD값 즉 양수만을 리턴 하므로 정상적인 좌표가 계산되지 않는다.

이경우,

HIWORD() 대신 GET_X_LPARAM()
LOWORD() 대신 GET_Y_LPARAM()

을 사용하면 정상적인 좌표값을 얻울 수 있다.

 

GET_X_LPARAM()GET_Y_LPARAM()은 다음과 같이 정의 되어 있으며, <windowsx.h>에 정의되어 있다.

#define GET_X_LPARAM(lp) ((int)(short)LOWORD(lp))
#define GET_Y_LPARAM(lp) ((int)(short
)HIWORD(lp))

참고로 HIWORD() LOWORD()의 정의는 다음과 같다

#define HIWORD(l) ((WORD) (((DWORD) (l) >> 16) & 0xFFFF))
#define LOWORD(l) ((WORD) (l))

출처 : http://thepassion.tistory.com/32

Posted by 위너즈
|