日期:2014-05-17  浏览次数:21171 次

c#键盘钩子问题
      int KbHookProc(int nCode, IntPtr wParam, IntPtr lParam)
        {
            if (nCode >= 0 && wParam == (IntPtr)0x100)
            {
                int vkCode = Marshal.ReadInt32(lParam);

                if (vkCode == (int)Keys.Q) { press((byte)Keys.NumPad7);return 1; } 
            }

            return CallNextHookEx(hHook, nCode, wParam, lParam);
        }

为什么  if (vkCode == (int)Keys.Q) { press((byte)Keys.NumPad7);} return 1; 这句把return 1放外面就什么也打不出来了?而放里面就可以打出7屏蔽Q,为何?

------解决方案--------------------
放在外面
press((byte)Keys.NumPad7)就无效了
因为它会触发另一次KbHookProc,并且return 1而不再执行CallNextHookEx(hHook, nCode, wParam, lParam);
只有执行了CallNextHookEx(hHook, nCode, wParam, lParam);才会处理后续的钩子。
------解决方案--------------------
return CallNextHookEx(hHook, nCode, wParam, lParam);这句话是关键,意思是当你处理外后,按键消息继续传递给系统,系统继续处理。就是正常的按键。

如果return 1 放外面,这句话就执行不到了,那就是说你的所有按键消息系统都接收不到了。
------解决方案--------------------
放到外面就不会执行return CallNextHookEx(hHook, nCode, wParam, lParam);了
------解决方案--------------------
放在外面 不就直接return 1 了么 就不执行return CallNextHookEx(hHook, nCode, wParam, lParam);了
。。打个断点 就明白。