`
汪洋00700
  • 浏览: 23611 次
  • 性别: Icon_minigender_1
  • 来自: 常德
社区版块
存档分类

C# 键盘钩子 适合新手

    博客分类:
  • C#
 
阅读更多

这几天在研究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了,暂时没有弄组合键,可以自己百度看一下,主体代码我也是百度的,自己研究明白了,才把代码贴在这儿的,大神勿喷,新手弄明白了点个赞,不明白的地方可以交流一下。吐舌头

 

 

  • 大小: 241.5 KB
分享到:
评论
1 楼 汪洋00700 2015-01-17  
    

相关推荐

    C# 键盘钩子实例源码

    【C# 键盘钩子实例源码】是关于C#编程语言中实现键盘事件监听的一个实例项目。在这个实例中,开发者使用了Windows API(应用程序接口)中的键盘钩子技术来捕获系统级别的键盘输入事件。键盘钩子是一种机制,允许程序...

    C# winform键盘钩子示例

    在C# WinForm开发中,有时我们需要监听键盘输入或者实现特定快捷键的处理,这就需要用到键盘钩子(Keyboard Hook)。本文将深入解析如何在C# WinForm应用中创建和使用键盘钩子,以及如何实现多快捷键的动态注册。 ...

    c# 键盘钩子和鼠标钩子

    免费送了 包含两种钩子程序 键盘钩子和鼠标钩子 需要的朋友可以看看

    C#设置键盘钩子屏蔽键盘信息

    C#键盘钩子(Keyboard Hook)就是利用这一机制来实现键盘输入的拦截和屏蔽。下面将详细介绍C#实现键盘钩子的相关知识点。 首先,键盘钩子是一种特定类型的钩子,主要用于监听键盘事件,如按键按下和释放。当用户在...

    C#全局键盘钩子

    本文将详细讲解如何在C#中创建全局键盘钩子,并探讨其相关知识点。 首先,我们需要了解什么是钩子(Hooks)。钩子是Windows操作系统提供的一种机制,它允许一个程序监视另一个程序的特定事件,如键盘输入、鼠标点击...

    C#获取键盘按键信息(键盘钩子)

    基于C#写的一个键盘钩子,可以屏蔽除(Ctrl + Alt + Delete)以外的所有系统热键,并可以获取当前按键信息(不过这个方面有些bug)。 对于Ctrl+Alt+Delete可以通过二进制流打开taskmgr.exe,让系统误认为它已经运行可以...

    C#键盘钩子实现全局快捷键.pdf

    标题中提到的"C#键盘钩子实现全局快捷键",是指在C#编程中利用Windows钩子(Hook)机制来捕获和处理键盘事件,以此创建可以在系统范围内工作的快捷键。这种技术涉及到深入的系统底层交互,通常使用Win32 API来实现。...

    一款改进的C#键盘钩子 hook

    【标题】:“一款改进的C#键盘钩子 hook” 在编程领域,键盘钩子是一种技术,允许程序拦截和处理来自键盘的输入事件,而不必是当前活动窗口。这种技术在某些场景下非常有用,比如监控用户输入、实现热键或者在多...

    强大的C#钩子。全局钩子,获取输入值。键盘值已处理

    ### 强大的C#钩子:全局钩子,获取输入值——键盘值处理 #### 概述 在本文中,我们将深入探讨一个基于C#语言的全局键盘钩子的应用示例,该应用能够捕获系统范围内的键盘输入,并对特定问题(如ASCII码与实际按键值...

    c++和c#键盘钩子

    两者都能实现键盘钩子,但C#通常提供更好的开发效率和跨平台支持,而C++则更适合对性能有极高要求的场合。 总之,无论是C++还是C#,实现键盘钩子都需要理解Windows消息机制和钩子工作原理。熟练掌握这些技能后,你...

    C# 捕捉键盘输入 键盘钩子

    本篇文章将详细介绍如何在C#中实现键盘钩子。 首先,我们需要了解Windows API,这是Windows操作系统提供的底层接口,允许C#程序调用非托管代码,如设置键盘钩子。在C#中,我们通常使用`DllImport`特性来导入这些API...

    C#键盘钩子实例源码

    标题中的"C#键盘钩子实例源码"是一个关于利用C#编程语言实现键盘钩子(Keyboard Hook)技术的示例项目。键盘钩子是Windows API提供的一种机制,允许应用程序监听和处理其他应用程序的键盘输入事件,即使这些事件并未...

    C# 键盘钩子例子 可屏蔽Ctrl+Alt+Delete

    【C# 键盘钩子例子 可屏蔽Ctrl+Alt+Delete】 在Windows操作系统中,开发者有时需要对用户的键盘输入进行特殊处理,例如在某些安全软件或者特定应用中,为了防止用户通过`Ctrl+Alt+Delete`组合键退出程序或唤起任务...

    c#键盘钩子实例下载

    标题中的“C#键盘钩子实例下载”表明这是一个关于C#编程语言的教程或示例,专注于实现键盘钩子(Keyboard Hook)的功能。键盘钩子是编程中的一种技术,允许程序监听并处理其他应用程序的键盘输入事件,通常用于实现...

    WinCE 6.0 C# 键盘钩子源代码

    在本文中,我们将深入探讨如何在Windows CE 6.0环境下使用C#语言实现键盘钩子(Keyboard Hook)的功能。Windows CE是微软开发的一个嵌入式操作系统,它为各种设备提供了一个可定制的操作系统基础。C#是一种面向对象...

    用C#编写的一个键盘钩子用于记录键盘输入

    标题中的“用C#编写的一个键盘钩子用于记录键盘输入”指的是使用C#编程语言创建一个程序,该程序通过设置键盘钩子(键盘事件监听器)来捕获并记录用户在计算机上的所有键盘输入。键盘钩子是Windows API提供的一种...

    C#键盘钩子

    ### C#键盘钩子实现详解 #### 一、引言 在软件开发中,键盘钩子是一种非常实用的技术,它可以捕获键盘输入事件,并在这些事件发生时执行自定义的操作。例如,在游戏开发中,可以利用键盘钩子来增强用户交互体验;...

    C# 全局键盘钩子类(包括鼠标)

    在C#中实现全局键盘钩子,开发者通常会利用Windows API函数,如SetWindowsHookEx。这个特定的压缩包文件"AdrHookDemo"可能包含了一个演示如何在C#中实现这种功能的示例项目。 首先,我们要理解键盘钩子的工作原理。...

    C#键盘钩子Hook

    这个"**C#键盘钩子Hook**"的主题就是关于如何在C#应用中创建一个键盘钩子,以便拦截特定的键盘组合,例如Alt+Tab、Alt+F4、Ctrl+Esc以及Windows键,并阻止它们的默认行为,类似于一个简单的锁屏功能。 首先,要实现...

Global site tag (gtag.js) - Google Analytics