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