C# winform键盘钩子

C# winform键盘钩子http://blog.163.com/da7_1@126/blog/static/1040726782011112652629750/新建一个工程CSharpKeyboardHook,在WinForm窗体上拉一个Lable(用于显示,按下的是那个键)和两个button(用于开关勾子)下面是C#winform键盘勾子的代码,照搬上去就可以的啦:一、新建一个类文件KeyboardHo

大家好,又见面了,我是你们的朋友全栈君。

http://blog.163.com/da7_1@126/blog/static/1040726782011112652629750/

新建一个工程CSharpKeyboardHook,在WinForm窗体上拉一个Lable(用于显示,按下的是那个键)和两个button(用于开关勾子)

下面是C#winform键盘勾子的代码,照搬上去就可以的啦:

一、新建一个类文件KeyboardHookLib,代码如下所示:

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using System.Reflection;
using System.Diagnostics;
using Microsoft.Win32;
using System.Windows.Forms;


namespace CSharpKeyboardHook
{

    /// <summary>
    /// 键盘Hook管理类

    /// </summary>
    public class KeyboardHookLib
    {
        private const int WH_KEYBOARD_LL = 13; //键盘

        //键盘处理事件委托.
        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 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();

        //Gets the main module for the associated process.
        [DllImport("kernel32.dll")]
        private static extern IntPtr GetModuleHandle(string name);

        private IntPtr _hookWindowPtr = IntPtr.Zero;

        //构造器
        public KeyboardHookLib() { }

        //外部调用的键盘处理事件
        private static ProcessKeyHandle _clientMethod = null;

        /// <summary>
        /// 安装勾子
        /// </summary>
        /// <param name="hookProcess">外部调用的键盘处理事件</param>
        public void InstallHook(ProcessKeyHandle clientMethod)
        {
            _clientMethod = clientMethod;

            // 安装键盘钩子
            if (_hHookValue == 0)
            {
                _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)
        {
            if (nCode >= 0)
            {
                //转换结构
                HookStruct hookStruct = (HookStruct)Marshal.PtrToStructure(lParam, typeof(HookStruct));

                if (_clientMethod != null)
                {
                    bool handle = false;
                    //调用客户提供的事件处理程序。
                    _clientMethod(hookStruct, out handle);
                    if (handle) return 1; //1:表示拦截键盘,return 退出
                }
            }
            return CallNextHookEx(_hHookValue, nCode, wParam, lParam);
        }

    }
}

///

//界面事件代码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Reflection;
using System.Diagnostics;
using Microsoft.Win32;

namespace CSharpKeyboardHook
{
public partial class frmKeyboardHook : Form
{
//勾子管理类
private KeyboardHookLib _keyboardHook = null;

public frmKeyboardHook()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
//安装勾子
_keyboardHook = new KeyboardHookLib();
_keyboardHook.InstallHook(this.KeyPress);
}

private void button2_Click(object sender, EventArgs e)
{
//取消勾子
if (_keyboardHook != null) _keyboardHook.UninstallHook();
}

/// <summary>
/// 客户端键盘捕捉事件.
/// </summary>
/// <param name="hookStruct">由Hook程序发送的按键信息</param>
/// <param name="handle">是否拦截</param>
public void KeyPress(KeyboardHookLib.HookStruct hookStruct, out bool handle)
{
handle = false; //预设不拦截任何键

if (hookStruct.vkCode == 91) // 截获左win(开始菜单键)
{
handle = true;
}

if (hookStruct.vkCode == 92)// 截获右win
{
handle = true;
}

//截获Ctrl+Esc
if (hookStruct.vkCode == (int)Keys.Escape && (int)Control.ModifierKeys == (int)Keys.Control)
{
handle = true;
}

//截获alt+f4
if (hookStruct.vkCode == (int)Keys.F4 && (int)Control.ModifierKeys == (int)Keys.Alt)
{
handle = true;
}

//截获alt+tab
if (hookStruct.vkCode == (int)Keys.Tab && (int)Control.ModifierKeys == (int)Keys.Alt)
{
handle = true;
}

//截获F1
if (hookStruct.vkCode == (int)Keys.F1)
{
handle = true;
}

//截获Ctrl+Alt+Delete
if ((int)Control.ModifierKeys == (int)Keys.Control + (int)Keys.Alt + (int)Keys.Delete)
{
handle = true;
}

//如果键A~Z
if (hookStruct.vkCode >= (int)Keys.A && hookStruct.vkCode <= (int)Keys.Z)
{
//挡掉G键,想要挡掉哪些键就把下面的G换成那个要挡掉的键,同理可以挡多个
if (hookStruct.vkCode == (int)Keys.G)
hookStruct.vkCode = (int)Keys.None; //设键为0

handle = true;
}

Keys key = (Keys)hookStruct.vkCode;
label1.Text = "你按下:" + (key == Keys.None ? "" : key.ToString());

}
}
}


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/143071.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 基于Packet Tracer的校园网络设计与规划「建议收藏」

    基于Packet Tracer的校园网络设计与规划「建议收藏」本文仅仅为本人课程要求而设计的方案,本文仅仅使用RIP动态路由协议,HSRP协议,浮动路由,静态路由,等价路由,DHCP地址分配,NAT技术,VLAN划分。如有问题请大佬们在本博客下留言。一、设计要求模拟设计并实现校园网规划,完成拓扑结构设计、IP地址规划、路由协议、网络管理规划、安全管理规划,用软件模拟器实现此规划。选取设备和协议根据你对校园网的了解和调研情况确定,也可以进行适当程度的假设…

    2022年10月5日
    4
  • vb6.0连接access数据库_access数据库是什么型数据库

    vb6.0连接access数据库_access数据库是什么型数据库第一步:在stdafx.h头文件中加入#import”c:\programfiles\commonfiles\system\ado\msado15.dll”no_namespacerename(“EOF”,”adoEOF”),rename(“BOF”,”adoBOF”)第二步:初始化COM库子main函数中CoInitialize(NULL); CoUninitialize

    2022年8月12日
    6
  • 什么是SSH 以及常见的ssh 功能

    什么是SSH 以及常见的ssh 功能什么是SSH?简单说,SSH是一种网络协议,用于计算机之间的加密登录。如果一个用户从本地计算机,使用SSH协议登录另一台远程计算机,我们就可以认为,这种登录是安全的,即使被中途截获,密码也不会泄露。最早的时候,互联网通信都是明文通信,一旦被截获,内容就暴露无疑。1995年,芬兰学者TatuYlonen设计了SSH协议,将登录信息全部加密,成为互联网安全的一个基本解决方案,迅速在全世界获得推广,目…

    2022年7月13日
    14
  • C# 条件运算符_c++ 运算符

    C# 条件运算符_c++ 运算符usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;namespace_0212_条件运算符{classProgram{//?一、C#条件运算符(?:)…

    2022年10月2日
    3
  • 封装是怎么实现的_ad13怎么添加封装

    封装是怎么实现的_ad13怎么添加封装1.封装的概念(1)将东西包装在一起,然后以新的完整的形式呈现出来(即将属性和方法封装到类里面,通过添加访问修饰符来限制访问权限,以达到信息隐藏的目的)(2)信息隐藏:隐藏对象的实现细节,不让外部

    2022年8月1日
    6
  • navicat for mysq 15l激活码【中文破解版】

    (navicat for mysq 15l激活码)这是一篇idea技术相关文章,由全栈君为大家提供,主要知识点是关于2021JetBrains全家桶永久激活码的内容IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.htmlMLZPB5EL5Q-eyJsaWN…

    2022年3月21日
    53

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号