C#全局键盘监听(Hook)的使用(转载)

转载 https://www.cnblogs.com/zhaoyuncai/p/7684958.html  

稍微有些改动 这里只添加 按键按下

一.为什么需要全局键盘监听?

在某些情况下应用程序需要实现快捷键执行特定功能,例如大家熟知的QQ截图功能Ctrl+Alt+A快捷键,只要QQ程序在运行(无论是拥有焦点还是处于后台运行状态),都可以按下快捷键使用此功能…

这个时候在程序中添加键盘监听肯定不能满足需求了,当用户焦点不在App上时(如最小化,或者用户在处理其它事物等等)键盘监听就失效了

二.怎样才能实现全局键盘监听?

这里需要用到Windows API,源码如下:(可以作为一个工具类[KeyboardHook.cs]收藏起来)

  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</
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值