공장 이야기

Windows Mobile에서 Mouse Hook...

바다가소주라면- 2010. 8. 13. 17:18

반듯이 DLL 형태로 만들어 져야 한다... 자 코드 나갑니다.ㅋ

P.S 풀 소스를 첨부 합니다.^^

 

MouseHook.zip

 

 

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);

MouseHook.zip
0.01MB