WPF 利用键盘钩子来捕获键盘,做一些不为人知的事情...完整实例
2021-07-05 07:19
标签:ati sum href var input next strong rtos style 键盘钩子是一种可以监控键盘操作的指令。 看到这句话是不是觉得其实键盘钩子可以做很多事情. 场景 当你的程序需要一个全局的快捷键时,可以考虑使用键盘钩子,如大家常用qq的截图快捷键,那么在WPF里怎么去实现呢? 当然不是直接在Window窗体里面去注册KeyDown、KeyUp,这样只有在程序是焦点的情况下才能触发, 我们这里要做的更为强大,即在非焦点下去获取到键盘的事件(要偷偷记录女朋友键盘记录的滚粗,当然我是在开玩笑,程序猿哪里有女朋友,我们只有男朋友(⊙0⊙)) 实现 首先我们需要用到这么几个WinAPI 大致的逻辑为: 安装键盘钩子,然后通过委托来处理获取到的键盘消息 整理为两个类(winapi[Win32Api.cs]类和键盘钩子[KeyboardHook.cs]类)如下 当时拿在虚拟码的时候其实我是拒绝的,因为在接下来我竟然不知道要对这些虚拟码做什么处理,难道要一个一个转换才能在WPF里进一步的去判断按下的是什么键? 最后经博客园 结果 于是我们开开心心的拿到了基友的键盘操作记录 nono,我只是拿来做了一个钢琴键盘 代码已贴,恕不给基友另行提供Demo WPF 利用键盘钩子来捕获键盘,做一些不为人知的事情...完整实例 标签:ati sum href var input next strong rtos style 原文地址:https://www.cnblogs.com/lonelyxmas/p/9827734.html//安装钩子的函数
[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 bool UnhookWindowsHookEx(int idHook);
//下一个钩挂的函数
[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern int CallNextHookEx(int idHook, int nCode, Int32 wParam, IntPtr lParam);
public class Win32Api
{
public const int WM_KEYDOWN = 0x100;
public const int WM_KEYUP = 0x101;
public const int WM_SYSKEYDOWN = 0x104;
public const int WM_SYSKEYUP = 0x105;
public const int WH_KEYBOARD_LL = 13;
[StructLayout(LayoutKind.Sequential)] //声明键盘钩子的封送结构类型
public class KeyboardHookStruct
{
public int vkCode; //表示一个在1到254间的虚似键盘码
public int scanCode; //表示硬件扫描码
public int flags;
public int time;
public int dwExtraInfo;
}
public delegate int HookProc(int nCode, Int32 wParam, IntPtr lParam);
//安装钩子的函数
[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 bool UnhookWindowsHookEx(int idHook);
//下一个钩挂的函数
[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern int CallNextHookEx(int idHook, int nCode, Int32 wParam, IntPtr lParam);
[DllImport("kernel32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern IntPtr GetModuleHandle(string lpModuleName);
}
public class KeyboardHook
{
int hHook;
Win32Api.HookProc KeyboardHookDelegate;
///
namespace System.Windows.Input
{
// 摘要:
// 提供在 Win32 虚拟键和 WPFSystem.Windows.Input.Key 枚举之间进行转换的静态方法。
public static class KeyInterop
{
// 摘要:
// 将 Win32 虚拟键转换为 WPFSystem.Windows.Input.Key。
//
// 参数:
// virtualKey:
// 要转换的虚拟键。
//
// 返回结果:
// WPF 键。
public static Key KeyFromVirtualKey(int virtualKey);
//
// 摘要:
// 将 WPFSystem.Windows.Input.Key 转换为 Win32 虚拟键。
//
// 参数:
// key:
// 要转换的 WPF。
//
// 返回结果:
// Win32 虚拟键。
public static int VirtualKeyFromKey(Key key);
}
}
KeyInterop.KeyFromVirtualKey(KeyData)
文章标题:WPF 利用键盘钩子来捕获键盘,做一些不为人知的事情...完整实例
文章链接:http://soscw.com/index.php/essay/102009.html