MSN, 네이트 같은 메신저프로그램을 보면 특정 시간 동안 사용자 입력이 없으면 "자리비움" 모드로 들어갑니다.
이것을 구현하기 위해 키보드/마우스를 후킹 하는 방법을 많이 썼습니다.
아시다시피 후킹이란게 키로거 와 같은 악성코드/스파이웨어로 악용 되고 있기 때문에, MS에서 윈도우 포커스가 잃게 되도 마우스/키보드 이벤트를 얻어올수 있는 방법을 만들었습니다.
RegisterRawInputDevices함수로 시스템에 키보드, 마우스 이벤트를 던져 달라고 등록을 할 수 있습니다.
등록을 하게되면 시스템은 해당 윈도우에 WM_INPUT메세지를 던져 주어 사용자로 부터 Input 이벤트가 들어왔는지를 알수 있습니다.
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);
}
LRESULT CRegisterRawInputDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
// TODO: Add your specialized code here and/or call the base class
if(message == WM_INPUT)
{
//여기서 마우스/키보드 입력 메시지를 확인할 수 있습니다.
// GetRawInputDevices 함수를 이용하여 입력된 정보를 알 수 있습니다.
}
return CDialog::WindowProc(message, wParam, lParam);
}RAWINPUTDEVICE 구조체에 usUsagePage, usUsage 값에 대한 정보는 아래 페이지에서 확인할 수 있습니다.
http://www.microsoft.com/whdc/archive/HID_HWID.mspx
출처 : http://www.devpia.com/Maeul/Contents/Detail.aspx?BoardID=51&MAEULNo=20&no=8430&ref=8430




