Windows Mobile에서 Mouse Hook...
반듯이 DLL 형태로 만들어 져야 한다... 자 코드 나갑니다.ㅋ
P.S 풀 소스를 첨부 합니다.^^
LRESULT CALLBACK CMouseHook::MouseHookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if(nCode >= 0)
{
EVENTMSG *pEvent = (EVENTMSG*)lParam;
if(NULL != CMouseHook::m_wndServer)
{
switch(pEvent->message)
{
case WM_LBUTTONDOWN:
::SendMessage(CMouseHook::m_wndServer, UM_LBUTTONDOWN, pEvent->paramH, pEvent->paramL);
break;
case WM_LBUTTONUP:
::SendMessage(CMouseHook::m_wndServer, UM_LBUTTONUP, pEvent->paramH, pEvent->paramL);
break;
}
}
}
return fnCallNextHookEx(m_hMouseHook, nCode, wParam, lParam);
}
BOOL CMouseHook::InitHookProc(HWND wndHook)
{
m_dwErrorCode = 0;
if(NULL == wndHook)
return FALSE;
m_wndServer = wndHook;
m_hCore = ::GetModuleHandle(L"coredll.dll");
if(NULL == m_hCore)
{
m_dwErrorCode = ::GetLastError();
return FALSE;
}
fnQASetWindowsJournalHook = (QASETWINDOWSJOURNALHOOK)::GetProcAddress(m_hCore, L"QASetWindowsJournalHook");
if(NULL == fnQASetWindowsJournalHook)
{
m_dwErrorCode = ::GetLastError();
return FALSE;
}
fnQAUnhookWindowsJournalHook = (QAUNHOOKWINDOWSJOURNALHOOK)::GetProcAddress(m_hCore, L"QAUnhookWindowsJournalHook");
if(NULL == fnQAUnhookWindowsJournalHook)
{
m_dwErrorCode = ::GetLastError();
return FALSE;
}
fnCallNextHookEx = (CALLNEXTHOOKEX)::GetProcAddress(m_hCore, L"CallNextHookEx");
if(NULL == fnCallNextHookEx)
{
m_dwErrorCode = ::GetLastError();
return FALSE;
}
return TRUE;
}
BOOL CMouseHook::SetMouseHook()
{
EVENTMSG emMouse;
m_hMouseHook = fnQASetWindowsJournalHook(WH_JOURNALRECORD, (HOOKPROC)CMouseHook::MouseHookProc, &emMouse);
if(NULL == m_hMouseHook)
return FALSE;
return TRUE;
}
BOOL CMouseHook::UnHookMouse()
{
fnQAUnhookWindowsJournalHook(WH_JOURNALRECORD);
return TRUE;
}
===========================================================================================================
.h
#define WH_JOURNALRECORD 0
#define WH_JOURNALPLAYBACK 1
#define HC_ACTION 0
#define HC_GETNEXT 1
#define HC_SKIP 2
#define HC_NOREMOVE 3
#define HC_NOREM HC_NOREMOVE
#define HC_SYSMODALON 4
#define HC_SYSMODALOFF 5
typedef struct {
UINT message;
UINT paramL;
UINT paramH;
DWORD time;
HWND hwnd;
} EVENTMSG, *PEVENTMSG;
// Hooking
typedef LRESULT (WINAPI* HOOKPROC)(int, WPARAM, LPARAM);
typedef LRESULT (WINAPI* CALLNEXTHOOKEX)(HHOOK, int , WPARAM, LPARAM);
// Journal(Mouse)
typedef HHOOK (WINAPI*QASETWINDOWSJOURNALHOOK)(int, LPVOID, EVENTMSG*);
typedef HHOOK (WINAPI*QAUNHOOKWINDOWSJOURNALHOOK)(int);
#define UM_LBUTTONDOWN WM_USER+100
#define UM_LBUTTONUP WM_USER+101
// 이 클래스는 MouseHook.dll에서 내보낸 것입니다.
class MOUSEHOOK_API CMouseHook
{
public:
CMouseHook(void);
// TODO: 여기에 메서드를 추가합니다.
private:
static LRESULT CALLBACK MouseHookProc(int nCode, WPARAM wParam, LPARAM lParam);
// Member Function
private:
protected:
public:
BOOL InitHookProc(HWND wndHook);
BOOL SetMouseHook();
BOOL UnHookMouse();
// Member Variable
private:
protected:
public:
static HMODULE m_hCore;
static HHOOK m_hMouseHook;
static HWND m_wndServer;
DWORD m_dwErrorCode;
};
extern MOUSEHOOK_API int nMouseHook;
MOUSEHOOK_API int fnMouseHook(void);