我希望屏蔽Win + R,但是不想屏蔽Win键 public static int KeyBoardHookProc(int nCode, int wParam, IntPtr lParam)
        {
            if (nCode >= 0)
            {
                KeyBoardHookStruct kbh = (KeyBoardHookStruct)Marshal.PtrToStructure(lParam, typeof(KeyBoardHookStruct));                if (Control.ModifierKeys == Keys.LWin)  // 这里运行没问题                    return 1;
            }
            return CallNextHookEx(hHook, nCode, wParam, lParam);
        } public static int KeyBoardHookProc(int nCode, int wParam, IntPtr lParam)
        {
            if (nCode >= 0)
            {
                KeyBoardHookStruct kbh = (KeyBoardHookStruct)Marshal.PtrToStructure(lParam, typeof(KeyBoardHookStruct));                if (Control.ModifierKeys == Keys.LWin && kbh.vkCode == (int)Keys.R)  // 这里不行                    return 1;
            }
            return CallNextHookEx(hHook, nCode, wParam, lParam);
        }

解决方案 »

  1.   

    if (kbh.vkCode == (int)Keys.R)
    {
       //if(GetAsyncKeyState)这里判断Win是否按下
    }
      

  2.   


    钩子好像只有“KeyDown”;没有“KeyUp”
      

  3.   


    “GetAsyncKeyState”这是什么?属性?系统方法?自定义方法
      

  4.   

    GetAsyncKeyState  API函数,具体见MSDN
      

  5.   

    public static int KeyBoardHookProc(int nCode, int wParam, IntPtr lParam)
            {
                if (nCode >= 0)
                {
                    KeyBoardHookStruct kbh = (KeyBoardHookStruct)Marshal.PtrToStructure(lParam, typeof(KeyBoardHookStruct));                if (Control.ModifierKeys == Keys.LWin && kbh.vkCode == (int)Keys.R)  // 这里不行    //因为你用了"&&",改为"||"试一下                   return 1;
                }
                return CallNextHookEx(hHook, nCode, wParam, lParam);
            }
      

  6.   

    public class KeyboardHook
        {
            private const int WM_KEYDOWN = 0x100;//按下消息   
            private const int WM_KEYUP = 0x101;//松开消息   
            private const int WM_SYSKEYDOWN = 0x104;
            private const int WM_SYSKEYUP = 0x105;
            public static int quanjun1 = 0;
            //全局事件   
            public event KeyEventHandler OnKeyDownEvent;
            public event KeyEventHandler OnKeyUpEvent;
            public event KeyPressEventHandler OnKeyPressEvent;        static int hKeyboardHook = 0;
            public const int WH_KEYBOARD_LL = 13;        public delegate int HookProc(int nCode, Int32 wParam, IntPtr lParam);        //声明键盘钩子事件类型   
            HookProc KeyboardHookProcedure;
            [StructLayout(LayoutKind.Sequential)]
            public class KeyboardHookStruct
            {
                public int vkCode;//表示一个1到254间的虚拟键盘码   
                public int scanCode;//表示硬件扫描码   
                public int flags;
                public int time;
                public int dwExtraInfo;
            }
            //安装钩子   
            [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
            public static extern int SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId);
            //下一个钩子   
            [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
            public static extern int CallNextHookEx(int idHook, int nCode, Int32 wParam, IntPtr lParam);
            //卸载钩子   
            [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
            public static extern bool UnhookWindowsHookEx(int idHook);
            //取得模块句柄    
            [DllImport("kernel32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
            private static extern IntPtr GetModuleHandle(string lpModuleName);  
            private int KeyboardHookProc(int nCode, Int32 wParam, IntPtr lParam)
            {
                if ((nCode >= 0) && (OnKeyDownEvent != null || OnKeyUpEvent != null || OnKeyPressEvent != null))
                {
                    KeyboardHookStruct MyKBHookStruct = (KeyboardHookStruct)Marshal.PtrToStructure(lParam, typeof(KeyboardHookStruct));                //引发OnKeyDownEvent   
                    if (OnKeyDownEvent != null && (wParam == WM_KEYDOWN || wParam == WM_SYSKEYDOWN))
                    {
                        Keys keyData = (Keys)MyKBHookStruct.vkCode;
                        KeyEventArgs e = new KeyEventArgs(keyData);
                        OnKeyDownEvent(this, e);
                       return quanjun1;
                    }            }
                return CallNextHookEx(hKeyboardHook, nCode, wParam, lParam);
            }
            public void Start()
            {
                if (hKeyboardHook == 0)
                {
                    KeyboardHookProcedure = new HookProc(KeyboardHookProc);
                    //hKeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardHookProcedure, Marshal.GetHINSTANCE(System.Reflection.Assembly.GetExecutingAssembly().GetModules()[0]), 0);   
                    using (System.Diagnostics.Process curProcess = System.Diagnostics.Process.GetCurrentProcess())
                    using (System.Diagnostics.ProcessModule curModule = curProcess.MainModule)
                        hKeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardHookProcedure, GetModuleHandle(curModule.ModuleName), 0);                if (hKeyboardHook == 0)
                    {
                        Stop();
                        throw new Exception("Set GlobalKeyboardHook failed!");
                    }
                }
            }
            public void Stop()
            {            bool retKeyboard = true;
                if (hKeyboardHook != 0)
                {
                    retKeyboard = UnhookWindowsHookEx(hKeyboardHook);
                    hKeyboardHook = 0;
                }
                if (!retKeyboard)
                     throw new Exception("Unload GlobalKeyboardHook failed!");
                
                
            }
            //构造函数中安装钩子   
            public KeyboardHook()
            {
                  
                Start();
            }
            //析构函数中卸载钩子   
            ~KeyboardHook()
            {
                Stop();
            }  
    有的
      

  7.   

    GetAsyncKeyState winapi 可以判断哪个按键被按下了楼上有个哥们说的对
      

  8.   

    GetKeyState 这个也可以考虑下