WPF 屏蔽系统热键

  private struct KBDLLHOOKSTRUCT
        {
            public int vkCode;
            int scanCode;
            public int flags;
            int time;
            int dwExtraInfo;
        }

        private delegate int LowLevelKeyboardProcDelegate(int nCode, int wParam, 
            ref KBDLLHOOKSTRUCT lParam);

        [DllImport("user32.dll")]
        private static extern IntPtr SetWindowsHookEx(int idHook, 
            LowLevelKeyboardProcDelegate lpfn, IntPtr hMod, int dwThreadId);

        [DllImport("user32.dll")]
        private static extern bool UnhookWindowsHookEx(IntPtr hHook);


        [DllImport("user32.dll")]
        private static extern int CallNextHookEx(int hHook, int nCode, int wParam, ref KBDLLHOOKSTRUCT lParam);

        [DllImport("kernel32.dll")]
        private static extern IntPtr GetModuleHandle(IntPtr path);
        private IntPtr hHook;
        LowLevelKeyboardProcDelegate hookProc; // prevent gc

        const int WH_KEYBOARD_LL = 13;

        private static int LowLevelKeyboardProc(int nCode, int wParam, ref KBDLLHOOKSTRUCT lParam)
        {
            if (nCode >= 0)
                switch (wParam)
                {
                    case 256: // WM_KEYDOWN
                    case 257: // WM_KEYUP
                    case 260: // WM_SYSKEYDOWN
                    case 261: // M_SYSKEYUP
                        if (
                            //(lParam.vkCode == 0x09 && lParam.flags == 32) || // Alt+Tab
                            (lParam.vkCode == 0x1b && lParam.flags == 32) || // Alt+Esc
                            (lParam.vkCode == 0x73 && lParam.flags == 32) || // Alt+F4
                            (lParam.vkCode == 0x1b && lParam.flags == 0)  || // Ctrl+Esc
                            (lParam.vkCode == 0x5b && lParam.flags == 1)  || // Left Windows Key 
                            (lParam.vkCode == 0x5c && lParam.flags == 1))    // Right Windows Key 
                        {
                            return 1;
                        }

                        break;

                }
            return CallNextHookEx(0, nCode, wParam, ref lParam);
        }

//应用加载的时候注册hook
private void Application_Startup(object sender, StartupEventArgs e)
  {                
       // hook keyboard
       IntPtr hModule = GetModuleHandle(IntPtr.Zero);
       hookProc = new LowLevelKeyboardProcDelegate(LowLevelKeyboardProc);
       hHook = SetWindowsHookEx(WH_KEYBOARD_LL, hookProc, hModule, 0);
       if (hHook == IntPtr.Zero)
       {
           MessageBox.Show("Failed to set hook, error = " + Marshal.GetLastWin32Error());
       }
  }

版权声明:本文为qq_39008744原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。