这几天在研究C#,为什么会想学C#呢,因为在玩游戏的时候,想一键导入秘籍,嘿嘿,感觉会方便很多,比如“魔兽争霸3”,“罗马帝国3”,我原本是想用java做的,发现实现起来比较麻烦,因为java的本地编程能力不强,需要JNA来调用,所以没有用java,转而想用别的编程语言,后来想用QT,但QT配置起来也不怎么好,于是决定用C#,好了,言归正传,下面将贴上代码,会做详细的注释,主体是借鉴的别人的代码。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Runtime.InteropServices; using System.Diagnostics; using System.Windows.Forms; using System.Threading; namespace test { class KeyboardHookLib { //钩子类型:键盘 private const int WH_KEYBOARD_LL = 13; //自己创建窗口按键 public const int WM_KEYDOWN = 0x100; //全局系统按键 public const int WM_SYSKEYDOWN = 0x104; //键盘处理事件委托. private delegate int HookHandle(int nCode, int wParam, IntPtr lParam); //客户端键盘处理事件 public delegate void ProcessKeyHandle(HookStruct param, out bool handle); //接收SetWindowsHookEx返回值 private static int _hHookValue = 0; //勾子程序处理事件 private static HookHandle _KeyBoardHookProcedure; //Hook结构 [StructLayout(LayoutKind.Sequential)] public class HookStruct { public int vkCode; public int scanCode; public int flags; public int time; public int dwExtraInfo; } //设置钩子 [DllImport("user32.dll")] private static extern int SetWindowsHookEx(int idHook, HookHandle lpfn, IntPtr hInstance, int threadId); //取消钩子 [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)] private static extern bool UnhookWindowsHookEx(int idHook); //调用下一个钩子 [DllImport("user32.dll")] private static extern int CallNextHookEx(int idHook, int nCode, int wParam, IntPtr lParam); //获取当前线程ID [DllImport("kernel32.dll")] private static extern int GetCurrentThreadId(); //获取关联进程的主模块 [DllImport("kernel32.dll")] private static extern IntPtr GetModuleHandle(string name); private IntPtr _hookWindowPtr = IntPtr.Zero; //构造器 public KeyboardHookLib() { } //外部调用的键盘处理事件,如果需要调用自己窗口建立的函数,则需要这行代码 //private static ProcessKeyHandle _clientMethod = null; /// 安装勾子 //如果需要调用自己窗口建立的函数,则需要这行代码 // public void InstallHook(ProcessKeyHandle clientMethod) //{ //如果需要调用自己窗口建立的函数,则需要这行代码 //_clientMethod = clientMethod; /* * _clientMethod 相当于一个发射的工具, * 从钩子代码这儿调用到你自己窗口建立的函数那儿 * 我做的是个最简单的辅助, * 所以不需要调用到自己的函数那儿, * 所以就没有把创建它 */ public void InstallHook() { // 安装键盘钩子 if (_hHookValue == 0) { //GetHookProc 是钩子内部调用的函数,当按下键盘时, //会调用到这儿来,可以改变名字 _KeyBoardHookProcedure = new HookHandle(GetHookProc); //得到线程 _hookWindowPtr = GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName); _hHookValue = SetWindowsHookEx( WH_KEYBOARD_LL, _KeyBoardHookProcedure, _hookWindowPtr, 0); //如果设置钩子失败. if (_hHookValue == 0) UninstallHook(); } } //取消钩子事件 public void UninstallHook() { if (_hHookValue != 0) { bool ret = UnhookWindowsHookEx(_hHookValue); if (ret) _hHookValue = 0; } } //钩子事件内部调用,调用_clientMethod方法转发到客户端应用。 private static int GetHookProc(int nCode, int wParam, IntPtr lParam) { //当nCode大于0,并且是按下事件时为1 if (nCode >= 0 && (wParam == WM_KEYDOWN) || (wParam == WM_SYSKEYDOWN)) { //转换结构 HookStruct hookStruct = (HookStruct)Marshal.PtrToStructure(lParam, typeof(HookStruct)); //是否拦截按键的标识符,默认不拦截 bool handle = false; switch ((Keys)hookStruct.vkCode) { //将拦截标识符置为拦截,向当前窗口发送一个回车, //再发送greenisgood 10000,再发送一个回车 case Keys.F1: handle = true; SendKeys.Send("{ENTER}"); SendKeys.Send("greenisgood 10000"); SendKeys.Send("{ENTER}"); break; } /* if (_clientMethod != null) { //调用客户提供的事件处理程序。 //_clientMethod(hookStruct, out handle); //if (handle) return 1; //1:表示拦截键盘,return 退出 } */ if (handle) return 1; } return CallNextHookEx(_hHookValue, nCode, wParam, lParam); } } }
钩子管理类就OK了,那么,就只要在你自己的窗口安装钩子即可,代码如下:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace test { public partial class Form1 : Form { private KeyboardHookLib _keyboardHook = null; //当运行程序默认安装钩子,也可以建一个按钮,手动安装 public Form1() { InitializeComponent(); _keyboardHook = new KeyboardHookLib(); //如果需要调用回来,安装钩子时把函数传过去 // _keyboardHook.InstallHook(this.newKeyPress); _keyboardHook.InstallHook(); } private void Form1_Load(object sender, EventArgs e) { } // _clientMethod 便是调用到这个函数来 //private void newKeyPress(KeyboardHookLib.HookStruct hookStruct, out bool handle) //{ //handle = true; //Keys key = (Keys)hookStruct.vkCode; //richTextBox1.Text += key.ToString(); // } //窗口退出事件 private void Form1_FormClosing(object sender, FormClosingEventArgs e) { //卸载钩子 if (_keyboardHook != null) _keyboardHook.UninstallHook(); } //右键菜单-退出事件 private void 退出ToolStripMenuItem_Click(object sender, EventArgs e) { //卸载钩子 if (_keyboardHook != null) _keyboardHook.UninstallHook(); Close(); } //右键菜单 private void notifyIcon1_MouseDoubleClick(object sender, MouseEventArgs e) { if (WindowState == FormWindowState.Minimized) { //还原窗体显示 WindowState = FormWindowState.Normal; //激活窗体并给予它焦点 this.Activate(); } } } }
大功告成,最简单的钩子就OK了,暂时没有弄组合键,可以自己百度看一下,主体代码我也是百度的,自己研究明白了,才把代码贴在这儿的,大神勿喷,新手弄明白了点个赞,不明白的地方可以交流一下。
相关推荐
【C# 键盘钩子实例源码】是关于C#编程语言中实现键盘事件监听的一个实例项目。在这个实例中,开发者使用了Windows API(应用程序接口)中的键盘钩子技术来捕获系统级别的键盘输入事件。键盘钩子是一种机制,允许程序...
在C# WinForm开发中,有时我们需要监听键盘输入或者实现特定快捷键的处理,这就需要用到键盘钩子(Keyboard Hook)。本文将深入解析如何在C# WinForm应用中创建和使用键盘钩子,以及如何实现多快捷键的动态注册。 ...
免费送了 包含两种钩子程序 键盘钩子和鼠标钩子 需要的朋友可以看看
C#键盘钩子(Keyboard Hook)就是利用这一机制来实现键盘输入的拦截和屏蔽。下面将详细介绍C#实现键盘钩子的相关知识点。 首先,键盘钩子是一种特定类型的钩子,主要用于监听键盘事件,如按键按下和释放。当用户在...
本文将详细讲解如何在C#中创建全局键盘钩子,并探讨其相关知识点。 首先,我们需要了解什么是钩子(Hooks)。钩子是Windows操作系统提供的一种机制,它允许一个程序监视另一个程序的特定事件,如键盘输入、鼠标点击...
基于C#写的一个键盘钩子,可以屏蔽除(Ctrl + Alt + Delete)以外的所有系统热键,并可以获取当前按键信息(不过这个方面有些bug)。 对于Ctrl+Alt+Delete可以通过二进制流打开taskmgr.exe,让系统误认为它已经运行可以...
标题中提到的"C#键盘钩子实现全局快捷键",是指在C#编程中利用Windows钩子(Hook)机制来捕获和处理键盘事件,以此创建可以在系统范围内工作的快捷键。这种技术涉及到深入的系统底层交互,通常使用Win32 API来实现。...
【标题】:“一款改进的C#键盘钩子 hook” 在编程领域,键盘钩子是一种技术,允许程序拦截和处理来自键盘的输入事件,而不必是当前活动窗口。这种技术在某些场景下非常有用,比如监控用户输入、实现热键或者在多...
### 强大的C#钩子:全局钩子,获取输入值——键盘值处理 #### 概述 在本文中,我们将深入探讨一个基于C#语言的全局键盘钩子的应用示例,该应用能够捕获系统范围内的键盘输入,并对特定问题(如ASCII码与实际按键值...
两者都能实现键盘钩子,但C#通常提供更好的开发效率和跨平台支持,而C++则更适合对性能有极高要求的场合。 总之,无论是C++还是C#,实现键盘钩子都需要理解Windows消息机制和钩子工作原理。熟练掌握这些技能后,你...
本篇文章将详细介绍如何在C#中实现键盘钩子。 首先,我们需要了解Windows API,这是Windows操作系统提供的底层接口,允许C#程序调用非托管代码,如设置键盘钩子。在C#中,我们通常使用`DllImport`特性来导入这些API...
标题中的"C#键盘钩子实例源码"是一个关于利用C#编程语言实现键盘钩子(Keyboard Hook)技术的示例项目。键盘钩子是Windows API提供的一种机制,允许应用程序监听和处理其他应用程序的键盘输入事件,即使这些事件并未...
【C# 键盘钩子例子 可屏蔽Ctrl+Alt+Delete】 在Windows操作系统中,开发者有时需要对用户的键盘输入进行特殊处理,例如在某些安全软件或者特定应用中,为了防止用户通过`Ctrl+Alt+Delete`组合键退出程序或唤起任务...
标题中的“C#键盘钩子实例下载”表明这是一个关于C#编程语言的教程或示例,专注于实现键盘钩子(Keyboard Hook)的功能。键盘钩子是编程中的一种技术,允许程序监听并处理其他应用程序的键盘输入事件,通常用于实现...
在本文中,我们将深入探讨如何在Windows CE 6.0环境下使用C#语言实现键盘钩子(Keyboard Hook)的功能。Windows CE是微软开发的一个嵌入式操作系统,它为各种设备提供了一个可定制的操作系统基础。C#是一种面向对象...
标题中的“用C#编写的一个键盘钩子用于记录键盘输入”指的是使用C#编程语言创建一个程序,该程序通过设置键盘钩子(键盘事件监听器)来捕获并记录用户在计算机上的所有键盘输入。键盘钩子是Windows API提供的一种...
### C#键盘钩子实现详解 #### 一、引言 在软件开发中,键盘钩子是一种非常实用的技术,它可以捕获键盘输入事件,并在这些事件发生时执行自定义的操作。例如,在游戏开发中,可以利用键盘钩子来增强用户交互体验;...
在C#中实现全局键盘钩子,开发者通常会利用Windows API函数,如SetWindowsHookEx。这个特定的压缩包文件"AdrHookDemo"可能包含了一个演示如何在C#中实现这种功能的示例项目。 首先,我们要理解键盘钩子的工作原理。...
这个"**C#键盘钩子Hook**"的主题就是关于如何在C#应用中创建一个键盘钩子,以便拦截特定的键盘组合,例如Alt+Tab、Alt+F4、Ctrl+Esc以及Windows键,并阻止它们的默认行为,类似于一个简单的锁屏功能。 首先,要实现...