시작할 때 StartEventCapture() 호출

종료할 때 EndEventCapture() 호출


StartEventCapture() 호출하면 WM_INPUT 메시지가 발생함

GetRawInputData를 사용해서 키보드, 마우스 이벤트를 가져오면 됨.

void StartEventCapture()
{
	RAWINPUTDEVICE rawInputDev[2]; 
	ZeroMemory(rawInputDev, sizeof(RAWINPUTDEVICE)*2);

	// 키보드 RAWINPUTDEVICE 구조체 설정	
	rawInputDev[0].usUsagePage = 0x01;
	rawInputDev[0].usUsage = 0x06;
	rawInputDev[0].dwFlags = RIDEV_INPUTSINK;
	rawInputDev[0].hwndTarget = GetSafeHwnd();

	//마우스 RAWINPUTDEVICE 구조체 설정
	rawInputDev[1].usUsagePage = 0x01;
	rawInputDev[1].usUsage = 0x02;
	rawInputDev[1].dwFlags = RIDEV_INPUTSINK;
	rawInputDev[1].hwndTarget = GetSafeHwnd();                 

	if( FALSE == RegisterRawInputDevices(rawInputDev, 2, sizeof(RAWINPUTDEVICE)) )
	{
		CString str;
		str.Format(_T("RegisterRawInputDevices Error %d"), GetLastError());
		MessageBox(str);        
	}
}

void EndEventCapture()
{
	RAWINPUTDEVICE rawInputDev[2]; 
	ZeroMemory(rawInputDev, sizeof(RAWINPUTDEVICE)*2);

	// 키보드 RAWINPUTDEVICE 구조체 설정	
	rawInputDev[0].usUsagePage = 0x01;
	rawInputDev[0].usUsage = 0x06;
	rawInputDev[0].dwFlags = RIDEV_REMOVE;//     <== 이부분이 틀림
	rawInputDev[0].hwndTarget = GetSafeHwnd();

	//마우스 RAWINPUTDEVICE 구조체 설정
	rawInputDev[1].usUsagePage = 0x01;
	rawInputDev[1].usUsage = 0x02;
	rawInputDev[1].dwFlags = RIDEV_REMOVE;//    <== 이부분이 틀림
	rawInputDev[1].hwndTarget = GetSafeHwnd();                 

	if( FALSE == RegisterRawInputDevices(rawInputDev, 2, sizeof(RAWINPUTDEVICE)) )
	{
		CString str;
		str.Format(_T("RegisterRawInputDevices Error %d"), GetLastError());
		MessageBox(str);        
	}
}


LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
	// TODO: 여기에 특수화된 코드를 추가 및/또는 기본 클래스를 호출합니다.
	if( message == WM_INPUT )
	{	
		UINT   dwSize = 40;
		static BYTE lpb[40];
		GetRawInputData((HRAWINPUT)lParam, RID_INPUT, lpb, &dwSize, sizeof(RAWINPUTHEADER));
		RAWINPUT* raw = (RAWINPUT*)lpb;
				
		if( raw->header.dwType == RIM_TYPEMOUSE ) 
		{
			int xPosRelative = raw->data.mouse.lLastX;
			int yPosRelative = raw->data.mouse.lLastY;

			if( raw->data.mouse.ulButtons == 0 ) // move
			{		
				InvalidateRect(CRect(0,50,150,100));
			}
			else if( raw->data.mouse.ulButtons == 1 /*|| m_bLbuttonDragging*/ ) // l-button down  
			{	
			}
			else if( raw->data.mouse.ulButtons == 2 ) // l-button up
			{
			}
			else if( raw->data.mouse.ulButtons == 4 ) // r-button down
			{
			}
			else if( raw->data.mouse.ulButtons == 8 ) // r-button down
			{
			}
			else
			{
			}
		} 

		if( raw->header.dwType == RIM_TYPEKEYBOARD ) 
		{
			CString str;
			str.Format( _T(" Kbd: make=%04x Flags:%04x Reserved:%04x ExtraInformation:%08x, msg=%04x VK=%04x \n"), 
			raw->data.keyboard.MakeCode, 
			raw->data.keyboard.Flags, 
			raw->data.keyboard.Reserved, 
			raw->data.keyboard.ExtraInformation, 
			raw->data.keyboard.Message, 
			raw->data.keyboard.VKey);	

			MSG msg;
			memset( &msg, 0, sizeof(MSG) );
			msg.hwnd = m_hWnd;
			msg.message = raw->data.keyboard.Message;
			msg.wParam = raw->data.keyboard.VKey;			

			//    KeyMessageProcessing( &msg );
			OutputDebugString( str );
		}
	}

	return CDialog::WindowProc(message, wParam, lParam);
}



MFC 컴파일 시에 아래와 같은 에러가 발생할 때가 있다.


"fatal error C1010: 미리 컴파일된 헤더를 찾는 동안 예기치 않은 파일의 끝이 나타났습니다. '#include "stdafx.h"'을(를) 소스에 추가하시겠습니까?"


Precompiled Header 때문에 발생하는 에러이다.

자세한 내용 및 해결 방안은 아래 링크 참조


http://myblue0324.tistory.com/55

#include "stdafx.h"

#include <typeinfo>

#include <iostream>

using namespace std;


template < typename T > 

void asdf( T arg1) {

   cout << typeid( T ).name() << endl;

}


int _tmain(int argc, _TCHAR* argv[])

{

int aaa= 1000;

asdf(aaa);

return 0;

}


#include "stdafx.h"

#include <iostream>

#include <string>

using namespace std;


#define GET_NAME(n) #n


int _tmain(int argc, _TCHAR* argv[])

{

int asdf = 1000;

string str = GET_NAME(asdf);

  cout << str << endl;

return 0;

}


http://blog.daum.net/aswip/6519855

DirectX 관련 라이브러리들 중 그들이 배포하는 basetsd.h 파일에
POINTER_64 라는 키워드에 대한 define 이 빠져있기 때문에 발생

(왜 빠져 있을까...)

나의 경우

C:\Program Files\DXSDK\Include\basetsd.h에 아래 코드 추가

 

#if (_MSC_VER >= 1300) && !(defined(MIDL_PASS) || defined(RC_INVOKED))
#define POINTER_64 __ptr64
#else
#define POINTER_64
#endif

 

http://hashs.tistory.com/91
스크랩2 참조

http://blog.naver.com/websmilemax/150022743084

 

모달리스 대화상자 생성 시:

if(m_pPParamDlg == NULL)
{
    m_pPParamDlg = new CPParamDlg(this);
    m_pPParamDlg->Create(IDD_PPARAMDLG);
    m_pPParamDlg->ShowWindow(SW_SHOW);
}

 

모달리스 대화상자 종료 시:

m_pPParamDlg->DestroyWindow();
delete m_pPParamDlg;
m_pPParamDlg = NULL;

 

http://blog.naver.com/sangtakeg/120069429014

+ Recent posts