代码在这里:
LRESULT CALLBACK KeyBoardProc(int nCode,WPARAM wParam, LPARAM lParam )
{
if(nCode>=0)
{
if((lParam&0xc000ffff)==1) // key down   // 是不是这里的问题?
    ::PostMessage(m_h0Main,WM_HOOK_KEYDOWN,wParam,lParam); //或者这里?
}
return CallNextHookEx(hKeyHook,nCode,wParam,lParam);
}// m_h0Main  是调用此DLL 的主程序窗口句柄
// if((lParam&0xc000ffff)==1)  不知这样得到 WM_KEYDOWN 对不对?  还有什么其它的方式?// 再有就是,我长按住一个键,怎么只会收到一个WM_KEYDOWN   不是会有一连串WM_KEYDOWN的吗?谢谢 各位!

解决方案 »

  1.   

    不是不对,按下一个键本来就只有一个WM_KEYDOWN消息,如果弹起就会有两个消息。需要判断按键状态。
      

  2.   

    if  (!(lParam  &  0xA0000000))//保证响应一次看看这个
    http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=192660
    http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=190021
      

  3.   

    关不关  PostMessgae  的事呢?
      

  4.   

    还有,为什么要来句:
    if(nCode>=0)
    {}
      

  5.   

    回复人: hehaheha(不笑) ( ) 信誉:93  2004-10-09 15:47:00  得分: 0  
     
     
       不是不对,按下一个键本来就只有一个WM_KEYDOWN消息,如果弹起就会有两个消息。需要判断按键状态。
      
    //
    有时有三四个呢,我只是击一下键(没有长按住),这也有时也会收到三四个,真是搞不懂///////////////////////////////////////////////////////////////
     回复人: crystal521(水晶泪) ( ) 信誉:95  2004-10-09 16:08:00  得分: 0  
    if  (!(lParam  &  0xA0000000))//保证响应一次看看这个
    http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=192660
    http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=190021//
    看了!!
    还不是很明白
    我是想,钩到所有的WM_KEYDOWN  (包括长按住一个键时一连串的WM_KEYDOWN)
      

  6.   

    同意,用lParam  &  0xA0000000来屏蔽。
      

  7.   

    代码我改成了:
    if(nCode==HC_ACTION)  
    {  
    if(!(lParam & 0xA0000000))//相应一次  
    {  
    if((lParam & 0xc000ffff)==1) // key down
    {
    ::PostMessage(m_h0Main,WM_HOOK_KEYDOWN,wParam,lParam);
    }
    }
    }但是钩不到  ALT 键,  且,长按一个键时,收不到一连串的WM_KEYDOWN  这些都是我必需的呀怎么办?