我写了一个全局键盘钩子
1,目的是当用记按下如 小键盘的Del键
将其变为输入',' ,但在调用时出现用户按一下键触发2 次的现象
变成了输入',,'
我是在
LRESULT CALLBACK MyTaskKeyHookLL(int nCode, WPARAM wParam, LPARAM lParam)
{
if (nCode >= 0  ) //==HC_ACTION
{
           case VK_DELETE:  ::PostMessage(g_hWnd,WM_USER,10,1112);return 1; 
发送消息给目标窗口处理的.2,在全局键盘钩子如何得到当前得到光标窗口的句柄
甚至得到当前得到光标的编辑控件的句柄
GetForegroundWindow();//取目标窗口控件句柄 
只能得到MDI窗口的句柄 
无法得到当前SHEET窗口的句柄

解决方案 »

  1.   

    出现用户按一下键触发2 次的现象,原因在于
    case VK_DELETE:  ::PostMessage(g_hWnd,WM_USER,10,1112);return 1; 
    不应立即RETURN 1,而应该 return(CallNextHookEx(NULL,code,wParam,lParam));
      

  2.   

    不对吧,这样不就还是执行del的功能了,实现不了我的效果?
      

  3.   

    不要PostMessage();
    将nCode = ','的虚键后直接
    return(CallNextHookEx(NULL,code,wParam,lParam));
      

  4.   

    1.用个bool变量来限制按键两次
    2.GetFocus
      

  5.   

    Action有两个,一个是KEY_DOWN,一个是KEY_UP。楼主的情况我也遇到过,两次调用分别是按下和弹起两个动作导致的,在代码里面处理一下就可以了。
      

  6.   

    那要怎么区分是是KEY_DOWN,还是KEY_UP。
    或者说在代码中怎么处理?
    我现在是用时间差来判断,但很不准确?
    谢谢
      

  7.   

    LRESULT CALLBACK KeyboardProc1(int ncode, WPARAM wParam,LPARAM lParam)
    {
         if(HC_ACTION==ncode)
     {
                 if((lParam&0xc0000000)==0xc0000000)//抬起
               { 
                         }   
               }
    }
      

  8.   

    那家伙说错了,lParam的第31位表示按钮是按下还是弹起,
    if(lParam & 0x8000000) 
    {
    //弹起
    }
    else
    {
    //按下
    }
      

  9.   

    来晚了!被arkuka说了。arkuka正解!
      

  10.   

    怎么还是不行?
    是不是我用的
    WH_KEYBOARD_LL
    低级HOOK的原因?
      

  11.   

    if(wParam == WM_KEYDOWN)
    {
    //按下
    }
    else
    {
    //弹起
    }
      

  12.   

    补充一下:
    在LowLevelKeyboardProc里面,wParam是消息类型,lParam转化成KBDLLHOOKSTRUCT指针来使用。
      

  13.   

    WH_KEYBOARD_LL的参数是一个struct,所以你需要进行强制类型转换以后,再从struct里面找到你的要参数。
      

  14.   

    太好了
    谢谢liotion(天上掉下一个林分分~~) (
    和各位的帮助