前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >系统钩子

系统钩子

作者头像
用户1175783
发布于 2019-09-18 02:06:05
发布于 2019-09-18 02:06:05
95400
代码可运行
举报
运行总次数:0
代码可运行

# 系统钩子

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
曾经有一段时间特别迷恋外挂程序,因此有所了解,但仅限于皮毛,由于缺乏的知识太多就放弃了,最近有个私活需要用到钩子,所以重行来研究一番,其实也谈不上研究,我是一个C#程序员,本来就没有多少系统的知识(并不是每个C#程序员都是这样),使用win32 api对我来说还是有些困难的,所以不能给出多么高深的讲解,这里仅限于我是如何使用C#调用win32 api来实现系统钩子的。

什么是钩子

我不觉得自己能说清楚什么是钩子,所以我推荐大家看一些 钩子简介

项目需求:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
实现一个程序来禁用所有鼠标按键,禁用任务管理器,禁用注册表等。

涉及Win32 API

  1. SetWindowsHookEx (参考 )
  2. UnhookWindowsHookEx (参考 )

代码实现

  1. 要使用钩子首先我们得有一个钩子 我的钩子代码 //定义个委托类型,因为设置钩子的时候需要这种类型的委托实现 private delegate int HookProc(int nCode,IntPtr wparam,ref IntPtr lparam); //实现HookProc委托签名的方法 private static int HookProcCallback(int nCode, IntPtr wparam, ref IntPtr lparam) { //这里可以进行消息的过滤,返回0时所有的消息都不会进入下一个钩子 return 0; }
  2. 设置钩子到系统的钩子链中 SetWindowsHookEx的定义的参数:
    1. 钩子的类型,即它处理的消息类型(比如:键盘钩子,鼠标钩子,Shell钩子等)
    2. 钩子回调函数,即接收的消息由谁处理
    3. 需要钩子拦截的程序句柄,0/null为当前进程/模块,
    4. 是否为全局钩子,如果为0则与所有线程关联,即全局钩子;否则,这个线程一定属性上一个参数对应的进程/模块

    设置钩子代码 //定义一个钩子实例 var hookProc = new HookProc(HookProcCallback); //设置钩子 hKeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, proc, null, 0); if(hkeyboardHook!=IntPtr.Zero){ //设置成功 }

# 完整代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Hook
{
    // 设置钩子
    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    public static extern IntPtr SetWindowsHookEx(int idHook, HookHandlerDelegate lpfn, IntPtr hmod, uint dwThreadID);

    // 卸载钩子 
    [DllImport("user32.dll")]
    public static extern bool UnhookWindowsHookEx(IntPtr idHook);

    // 获取模块句柄
    [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    public static extern IntPtr GetModuleHandle(String modulename);
    public const int WM_KEYDOWN = 0x0100;
    public const int WH_KEYBOARD_LL = 13;
    public const int WM_SYSKEYDOWN = 0x0104;
    public struct KBDLLHOOKSTRUCT
    {
        public int vkCode;
        public int scanCode;
        public int flags;
        public int time;
        public int dwExtraInfo;
    }
    public delegate int HookHandlerDelegate(int nCode, IntPtr wparam, ref KBDLLHOOKSTRUCT lparam);
    //钩子回掉委托实例
    private static HookHandlerDelegate proc;
    //钩子句柄
    private static IntPtr hKeyboardHook;

    private static int HookCallback(int nCode, IntPtr wparam, ref KBDLLHOOKSTRUCT lparam)
    {
        if (
            nCode >= 0
            &&
            (wparam == (IntPtr)WM_KEYDOWN
            ||
            wparam == (IntPtr)WM_SYSKEYDOWN)
            )
        {
            if (lparam.vkCode == 91 || lparam.vkCode == 164 || lparam.vkCode == 9 || lparam.vkCode == 115)
            {
                return 1;
            }
            else
            {
                return 0;
            }
        }
        return 0;
    }

    public static void HookStart()
    {
        if (hKeyboardHook == IntPtr.Zero)
        {
            // 创建HookProc实例 
            proc = new HookHandlerDelegate(HookCallback);
            using (Process curPro = Process.GetCurrentProcess())
            using (ProcessModule curMod = curPro.MainModule)
            {
                //定义全局钩子 
                hKeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, proc,GetModuleHandle(curMod.FileName), 0);
            }

            if (hKeyboardHook == IntPtr.Zero)
            {
                HookStop();
                throw new Exception("钩子设置失败");
            }
        }

    }

    public static void HookStop()
    {
        bool retKeyboard = true;
        if (hKeyboardHook != IntPtr.Zero)
        {
            retKeyboard = UnhookWindowsHookEx(hKeyboardHook);
            hKeyboardHook = IntPtr.Zero;
        }
        if (!(retKeyboard)) throw new Exception("卸载钩子失败");

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

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

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
c#键盘钩子全解
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/130999.html原文链接:https://javaforall.cn
全栈程序员站长
2022/08/11
8290
c#键盘钩子全解
用 WPF 写的颜色拾取器
之前都是用别人的颜色拾取器,今天自己用WPF写了一个颜色拾取器小程序 拾取鼠标所在位置的颜色,按键盘上的空格键停止取色 程序下载:MyWPFScreenColorE.rar 程序里面有一个全局的勾子
lpxxn
2018/01/31
1.4K0
用 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
winform键盘全局与线程Hook
注:idHook 钩子类型,即确定钩子监听何种消息 线程钩子监听键盘消息应设为2,全局钩子监听键盘消息应设为13 线程钩子监听鼠标消息应设为7,全局钩子监听鼠标消息应设为14
code2roc
2023/07/19
2900
WPF 拼音输入法
实际上本文是在使用一个好用的软件 希沃白板 的时候发现在里面很难输入拼音来做课堂活动。
林德熙
2018/09/19
1.6K0
WPF 拼音输入法
c# 键盘钩子
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/132342.html原文链接:https://javaforall.cn
全栈程序员站长
2022/06/29
4230
键盘 计算机代码,键盘钩子示例[通俗易懂]
KeyBoardHookProcedure = new HookProc(KeyBoardHookProc);
全栈程序员站长
2022/09/02
7550
键盘钩子之完美得到单键或多组合键的信息
【先看代码】 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
键盘钩子之完美得到单键或多组合键的信息
wpf键盘记录器
很简单的一个wpf键盘记录器 这个程序我一样用了全局勾子,之前用的都是winform上运行了,前一段时间 在国外的论坛上逛看到了一个wpf能用的就做了一个小程序记录一下,为了方便大家直关的看我在页面上
lpxxn
2018/01/31
1.2K0
wpf键盘记录器
C# winform键盘钩子
http://blog.163.com/da7_1@126/blog/static/1040726782011112652629750/
全栈程序员站长
2022/08/31
4620
dotnet C# 全局 Windows 鼠标钩子
本文来告诉大家一个简单的方法实现全局的 鼠标钩子 实现封装方法十分简单,请看代码 public class MouseHookEventArgs : EventArgs { public bool Handle { get; set; } /// <inheritdoc /> public MouseHookEventArgs(MouseMessages mouseMessage) { MouseMes
林德熙
2021/12/23
7730
12.1 使用键盘鼠标监控钩子
本节将介绍如何使用Windows API中的SetWindowsHookEx和RegisterHotKey函数来实现键盘鼠标的监控。这些函数可以用来设置全局钩子,通过对特定热键挂钩实现监控的效果,两者的区别在于SetWindowsHookEx函数可以对所有线程进行监控,包括其他进程中的线程,而RegisterHotKey函数只能对当前线程进行监控。
微软技术分享
2023/10/07
4360
12.1 使用键盘鼠标监控钩子
c#中使用钩子
相信以前用过VB、Delphi,特别是VC的程序员应该对钩子程序都不陌生。在C#中我们同样可以使用钩子程序来实现特殊效果,比如当用户按下某个特殊键时提示,比如关闭应用程序前提示等。 当然使用方法相对VC来说要稍微复杂一点,有的地方还不太方便,下面的例子中实现两个基本功能: 1、按下Alt+F4时使窗口最小化 2、关闭应用程序前提示 不过目前只能捕获消息,不能屏蔽消息,我正在实验,也希望知道的高手能多多指教 一、加入winuser.h中的定义 因为钩子程序一般情况下都是在vc下使用的,在c#里面并没有对应的方法、结构等的定义,我们首先需要把winuser.h中的相关定义加入自己的类
冰封一夏
2019/09/10
1.1K0
java键盘钩子_java 写的低级鼠标键盘钩子示例
http://java.net/projects/jna/downloads下载 jna.jar 和 platform.jar
全栈程序员站长
2022/08/23
1.1K0
C# 实现 WinForm 全屏置顶
我们在运行一些 Windows 应用程序的时候,需要将其运行在窗体置顶的模式(使其它应用窗体无法遮挡在置顶应用窗体之上),并且进入全屏状态。本文将介绍如何使用 C# 来实现 WinForm 的全屏置顶的基本功能。
初九之潜龙勿用
2024/12/11
1380
c# winform 窗体失去焦点关闭(钩子实现)
main函数里面写 Application.ApplicationExit += Application_ApplicationExit;
冰封一夏
2019/09/10
2.9K0
数据防泄漏 | 禁止PrintScreen键
在数据防泄漏软件,通常会禁止 PrintScreen 键,防止通过截屏来将数据保存为图片而导致泄密。
码农UP2U
2020/08/26
9100
WPF写的取色器
昨天有个小伙子,在找取色器工具。我说,这个应该开发起来很简单,于是,摸了大约半个钟的鱼,开发了一个。现在我把源码和操作案例发出来,供有需要的大佬们玩。(功能过于单一和简单,但是能用)
Wesky
2024/08/13
780
WPF写的取色器
vs2019键盘钩子_低级键盘钩子回调函数「建议收藏」
与SetWindowsHookEx函数一起使用的应用程序定义的或库定义的回调函数。 每当一个新的键盘输入事件即将被提交到线程输入队列中时,系统都会调用这个函数。当调用此回调函数以响应键状态的更改时,将在更新键的异步状态之前调用回调函数。因此,不能通过在回调函数中调用GetAsyncKeyState来确定键的异步状态。HOOKPROC类型定义了指向这个回调函数的指针。LowLevelKeyboardProc是应用程序定义的或库定义的函数名的占位符。
全栈程序员站长
2022/09/05
5250
相关推荐
c#键盘钩子全解
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文