Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >winform键盘全局与线程Hook

winform键盘全局与线程Hook

作者头像
code2roc
发布于 2023-07-19 06:47:53
发布于 2023-07-19 06:47:53
29000
代码可运行
举报
运行总次数:0
代码可运行

定义数据结构

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        /// <summary>
        /// 声明键盘钩子的封送结构类型
        /// </summary>
        [StructLayout(LayoutKind.Sequential)]
        public class KeyboardHookStruct
        {
            public int vkCode;//表示一个1到254间的虚拟键盘码
            public int scanCode;//表示硬件扫描码
            public int flags;
            public int time;
            public int dwExtraInfo;
        }

声明Hook相关方法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        //使用WINDOWS API函数代替获取当前实例的函数,防止钩子失效
        [DllImport("kernel32.dll")]
        public static extern IntPtr GetModuleHandle(string lpModuleName);
        //安装钩子
        [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")]
        static extern int GetCurrentThreadId();

Hook拦截方法

全局Hook

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        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 CallNextHookEx(hKeyboardHook, nCode, wParam, lParam);
        }

线程Hook

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        private int KeyboardHookProc(int nCode, Int32 wParam, IntPtr lParam)
        {
            if ((nCode >= 0) && (OnKeyDownEvent != null || OnKeyUpEvent != null || OnKeyPressEvent != null))
            {
               
                //引发OnKeyDownEvent
                if (OnKeyDownEvent != null && nCode==0)
                {
                    Keys keyData = (Keys)wParam;
                    KeyEventArgs e = new KeyEventArgs(keyData);
                    OnKeyDownEvent(this, e);
                }
            }
            return CallNextHookEx(hKeyboardHook, nCode, wParam, lParam);
        }

全局/线程Hook参数结构区别

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
线程Hook KeyboardHookProc函数的各个参数意义如下:

nCode    消息的类型,分HC_ACTIONHC_NOREMOVE

wParam    按键的虚拟键码 

lParam    按键的相关参数信息,包括重复时间、按键的状态(按下或弹起)等

全局Hook KeyboardHookProc函数的各个参数意义如下:

nCode    消息的类型,有HC_ACTION

wParam    按键的状态(按下或弹起)WM_KEYDOWNWM_KEYUPWM_SYSKEYDOWNWM_SYSKEYUP

lParam    指向KeyboardHookStruct结构的指针,该结构包含了按键的详细信息。

添加Hook

全局Hook

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        public void Start()
        {
            if (hKeyboardHook == 0)
            {
                KeyboardHookProcedure = new HookProc(KeyboardHookProc);
                using (System.Diagnostics.Process curProcess = System.Diagnostics.Process.GetCurrentProcess())
                using (System.Diagnostics.ProcessModule curModule = curProcess.MainModule)
                    hKeyboardHook = SetWindowsHookEx(13, KeyboardHookProcedure, GetModuleHandle(curModule.ModuleName), 0);
 
                if (hKeyboardHook == 0)
                {
                    Stop();
                    throw new Exception("Set GlobalKeyboardHook failed!");
                }
            }
        }

线程Hook

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        public void Start()
        {
            if (hKeyboardHook == 0)
            {
                KeyboardHookProcedure = new HookProc(KeyboardHookProc);
                hKeyboardHook = SetWindowsHookEx(2, KeyboardHookProcedure,  IntPtr.Zero, GetCurrentThreadId());
 
                if (hKeyboardHook == 0)
                {
                    Stop();
                    throw new Exception("Set GlobalKeyboardHook failed!");
                }
            }
        }

注:idHook 钩子类型,即确定钩子监听何种消息 线程钩子监听键盘消息应设为2,全局钩子监听键盘消息应设为13 线程钩子监听鼠标消息应设为7,全局钩子监听鼠标消息应设为14

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-03-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
用 WPF 写的颜色拾取器
之前都是用别人的颜色拾取器,今天自己用WPF写了一个颜色拾取器小程序 拾取鼠标所在位置的颜色,按键盘上的空格键停止取色 程序下载:MyWPFScreenColorE.rar 程序里面有一个全局的勾子
lpxxn
2018/01/31
1.4K0
用 WPF 写的颜色拾取器
WPF 拼音输入法
实际上本文是在使用一个好用的软件 希沃白板 的时候发现在里面很难输入拼音来做课堂活动。
林德熙
2018/09/19
1.6K0
WPF 拼音输入法
.NET下如何拦截鼠标、键盘消息?使用Win32NET!
在现代 Windows 开发中,拦截鼠标和键盘消息是一项常见需求。无论是为了实现热键管理、全局鼠标事件监听,还是增强应用的交互性,拦截输入事件都具有重要意义。本文将详细介绍如何在 .NET 环境下使用 Win32 API 来拦截鼠标和键盘消息,特别是使用 Win32NET 来简化调用。
Michel_Rolle
2024/12/04
1.6K0
WPF取色器开发
前言 这里全局的键盘钩子和全局鼠标钩子是为了定义快捷键。 获取鼠标坐标 using System.Runtime.InteropServices; namespace ColorPicker.Utils { internal class ZPoint { [DllImport("user32.dll", CharSet = CharSet.Auto)] public static extern bool GetCursorPos(out POINT pt);
码客说
2022/03/13
1.8K0
键盘钩子之完美得到单键或多组合键的信息
【先看代码】 class KeyboardHook { #region 私有变量 private IntPtr m_pKeyboardHook = IntPtr.Zero;/// 键盘钩子句柄 private delegate int HookProc(int nCode, Int32 wParam, IntPtr lParam);/// 钩子委托声明 private HookProc m_KeyboardHookProcedu
Shunnet
2021/06/11
1.7K0
键盘钩子之完美得到单键或多组合键的信息
键盘 计算机代码,键盘钩子示例[通俗易懂]
KeyBoardHookProcedure = new HookProc(KeyBoardHookProc);
全栈程序员站长
2022/09/02
7560
c# 键盘钩子
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/132342.html原文链接:https://javaforall.cn
全栈程序员站长
2022/06/29
4230
c# winform 窗体失去焦点关闭(钩子实现)
main函数里面写 Application.ApplicationExit += Application_ApplicationExit;
冰封一夏
2019/09/10
2.9K0
c#键盘钩子全解
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/130999.html原文链接:https://javaforall.cn
全栈程序员站长
2022/08/11
8290
c#键盘钩子全解
C# winform键盘钩子
http://blog.163.com/da7_1@126/blog/static/1040726782011112652629750/
全栈程序员站长
2022/08/31
4630
系统钩子
设置钩子代码 //定义一个钩子实例 var hookProc = new HookProc(HookProcCallback); //设置钩子 hKeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, proc, null, 0); if(hkeyboardHook!=IntPtr.Zero){ //设置成功 }
用户1175783
2019/09/18
9540
C# 实现 WinForm 全屏置顶
我们在运行一些 Windows 应用程序的时候,需要将其运行在窗体置顶的模式(使其它应用窗体无法遮挡在置顶应用窗体之上),并且进入全屏状态。本文将介绍如何使用 C# 来实现 WinForm 的全屏置顶的基本功能。
初九之潜龙勿用
2024/12/11
1380
使用c#捕获usb扫描枪扫描二维码、条形码结果
  最近公司买了一些扫描枪,要做个展会门票扫描,门票格式为一个网址,生成方式是qr二维码
_一级菜鸟
2023/05/24
1.9K0
dotnet C# 全局 Windows 鼠标钩子
本文来告诉大家一个简单的方法实现全局的 鼠标钩子 实现封装方法十分简单,请看代码 public class MouseHookEventArgs : EventArgs { public bool Handle { get; set; } /// <inheritdoc /> public MouseHookEventArgs(MouseMessages mouseMessage) { MouseMes
林德熙
2021/12/23
7730
WPF写的取色器
昨天有个小伙子,在找取色器工具。我说,这个应该开发起来很简单,于是,摸了大约半个钟的鱼,开发了一个。现在我把源码和操作案例发出来,供有需要的大佬们玩。(功能过于单一和简单,但是能用)
Wesky
2024/08/13
780
WPF写的取色器
wpf键盘记录器
很简单的一个wpf键盘记录器 这个程序我一样用了全局勾子,之前用的都是winform上运行了,前一段时间 在国外的论坛上逛看到了一个wpf能用的就做了一个小程序记录一下,为了方便大家直关的看我在页面上
lpxxn
2018/01/31
1.2K0
wpf键盘记录器
.NET/C# 使用 SetWindowsHookEx 监听鼠标或键盘消息以及此方法的坑
一般来说,大家在需要监听全局消息的时候会考虑 SetWindowsHookEx 这个 API。或者需要处理一些非自己编写的窗口的消息循环的时候,也会考虑使用它。
walterlv
2023/10/22
1.5K0
.NET/C# 使用 SetWindowsHookEx 监听鼠标或键盘消息以及此方法的坑
c#中使用钩子
相信以前用过VB、Delphi,特别是VC的程序员应该对钩子程序都不陌生。在C#中我们同样可以使用钩子程序来实现特殊效果,比如当用户按下某个特殊键时提示,比如关闭应用程序前提示等。 当然使用方法相对VC来说要稍微复杂一点,有的地方还不太方便,下面的例子中实现两个基本功能: 1、按下Alt+F4时使窗口最小化 2、关闭应用程序前提示 不过目前只能捕获消息,不能屏蔽消息,我正在实验,也希望知道的高手能多多指教 一、加入winuser.h中的定义 因为钩子程序一般情况下都是在vc下使用的,在c#里面并没有对应的方法、结构等的定义,我们首先需要把winuser.h中的相关定义加入自己的类
冰封一夏
2019/09/10
1.1K0
c#钩子学习笔记(一)
钩子(Hook),是Windows消息处理机制的一个平台,应用程序可以在上面设置子程以监视指定窗口的某种消息,而且所监视的窗口可以是其他进程所创建的。当消息到达后,在目标窗口处理函数之前处理它。钩子机制允许应用程序截获处理window消息或特定事件。
冰封一夏
2019/09/10
7120
Windows 反消息钩子(1)
消息钩子在Windows编程中有着非常广泛的应用,它可以任意拦截Windows系统,这个以消息为驱动的系统中的绝大多数消息类型。一方面这给编程者带来了巨大的灵活性,另一方面也埋下了巨大隐患,大多数窃密软件都使用这种方法。此篇文章给您提供一种钩子的反拦截方法,希望对您有所帮助。文章中使用了API钩子,您之前必须对此技术有一定了解。 为求完整,文章分为两部分,第一部分为消息钩子的使用,熟悉此技术的读者可以直接跳过此节。第二部分为消息钩子的反拦截。
全栈程序员站长
2022/09/17
5680
相关推荐
用 WPF 写的颜色拾取器
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验