转载 https://www.cnblogs.com/zhaoyuncai/p/7684958.html
稍微有些改动 这里只添加 按键按下
一.为什么需要全局键盘监听?
在某些情况下应用程序需要实现快捷键执行特定功能,例如大家熟知的QQ截图功能Ctrl+Alt+A快捷键,只要QQ程序在运行(无论是拥有焦点还是处于后台运行状态),都可以按下快捷键使用此功能…
这个时候在程序中添加键盘监听肯定不能满足需求了,当用户焦点不在App上时(如最小化,或者用户在处理其它事物等等)键盘监听就失效了
二.怎样才能实现全局键盘监听?
这里需要用到Windows API,源码如下:(可以作为一个工具类[KeyboardHook.cs]收藏起来)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
1 using System; 2 using System.Text; 3 using System.Runtime.InteropServices; 4 using System.Reflection; 5 using System.Windows.Forms; 6 7 namespace BAMdp.MouseKeyboardLibrary 8 { 9 public abstract class GlobalHook 10 { 11 #region Windows API Code 12 13 [StructLayout(LayoutKind.Sequential)] 14 protected class POINT 15 { 16 public int x; 17 public int y; 18 } 19 20 [StructLayout(LayoutKind.Sequential)] 21 protected class MouseHookStruct 22 { 23 public POINT pt; 24 public int hwnd; 25 public int wHitTestCode; 26 public int dwExtraInfo; 27 } 28 29 [StructLayout(LayoutKind.Sequential)] 30 protected class MouseLLHookStruct 31 { 32 public POINT pt; 33 public int mouseData; 34 public int flags; 35 public int time; 36 public int dwExtraInfo; 37 } 38 39 [StructLayout(LayoutKind.Sequential)] 40 protected class KeyboardHookStruct 41 { 42 public int vkCode; 43 public int scanCode; 44 public int flags; 45 public int time; 46 public int dwExtraInfo; 47 } 48 49 [DllImport("user32.dll", CharSet = CharSet.Auto, 50 CallingConvention = CallingConvention.StdCall, SetLastError = true)] 51 protected static extern int SetWindowsHookEx( 52 int idHook, 53 HookProc lpfn, 54 IntPtr hMod, 55 int dwThreadId); 56 57 [DllImport("user32.dll", CharSet = CharSet.Auto, 58 CallingConvention = CallingConvention.StdCall, SetLastError = true)] 59 protected static extern int UnhookWindowsHookEx(int idHook); 60 61 62 [DllImport("user32.dll", CharSet = CharSet.Auto, 63 CallingConvention = CallingConvention.StdCall)] 64 protected static extern int CallNextHookEx( 65 int idHook, 66 int nCode, 67 int wParam, 68 IntPtr lParam); 69 70 [DllImport("user32")] 71 protected static extern int ToAscii( 72 int uVirtKey, 73 int uScanCode, 74 byte[] lpbKeyState, 75 byte[] lpwTransKey, 76 int fuState); 77 78 [DllImport("user32")] 79 protected static extern int GetKeyboardState(byte</