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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • webapp开发完整版

    webapp开发完整版1.开山篇关于本课程2.react-create-app,react-scripts与eject构建项目3.React新特性4.ReactHooks详解5.ReactRedux以及其API核心介绍6.渐进式WebApp搭建项目7.订票业务架构方案8.开发首页及站点及日期选择功能9.开发搜索结果展示页面10.react组件开发选座页面及…

    2022年6月16日
    33
  • git提交中E325: ATTENTION或E325: 注意 的解决方法

    git提交中E325: ATTENTION或E325: 注意 的解决方法问题引入首先看下图,在git提交、编辑、合并等过程中,如果没有将指令进行完就将git窗口关闭有时会出现这样的界面。原因分析git在指令意外中断时,一般会有一个缓存的机制,它会记住上次中断的问题。在下次进入vim指令时,如果很重要的中断一般会提示你前面有某个操作不当或者没有结束,就出现了上面的窗口。如果不解决就会一直缠着你,以至于出现该窗口后再输入git指令的话一般就不显示在…

    2022年5月19日
    48
  • svn客户端的安装与使用教程(svn汉化教程)

    SVN服务端与客户端安装使用(客户端汉化包)客户端下载地址:https://tortoisesvn.net/downloads.zh.html下载64位SVN安装包和64位简体中文安装包安装SVN打开安装包,直接NextNext选择安装目录,如果是自定义目录要新建一个文件夹,否则会把安装文件散落在盘符(此处不安装命令行工具会导致在idea中无法使用subversio…

    2022年4月17日
    57
  • 字符串正则匹配leetcode_动态规划的特点

    字符串正则匹配leetcode_动态规划的特点原题链接给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 ‘.’ 和 ‘*’ 的正则表达式匹配。‘.’ 匹配任意单个字符‘*’ 匹配零个或多个前面的那一个元素所谓匹配,是要涵盖 整个 字符串 s的,而不是部分字符串。示例 1:输入:s = “aa” p = “a”输出:false解释:”a” 无法匹配 “aa” 整个字符串。示例 2:输入:s = “aa” p = “a*”输出:true解释:因为 ‘*’ 代表可以匹配零个或多个前面的那一个元素, 在这里前面的元素就是

    2022年8月9日
    7
  • OpenWrt配置阿里云动态域名服务DDNS

    OpenWrt配置阿里云动态域名服务DDNSOpenWrt配置阿里云动态域名服务DDNSOpenWrt配置阿里云动态域名服务DDNS创建AccessKey添加权限创建A记录设置OpenWrtDDNS验证OpenWrt配置阿里云动态域名服务DDNSDDNS(DynamicDomainNameServer,动态域名服务)是将用户的动态IP地址映射到一个固定的域名解析服务上,用户每次连接网络的时候客户端程序就会通过信息传递把该主机的动态IP地址传送给位于服务商主机上的服务器程序,服务器程序负责提供DNS服务并实现动态域名解析。创建Acce

    2022年4月30日
    894
  • linux centos7配置网络教程,linux centos7配置网络「建议收藏」

    linux centos7配置网络教程,linux centos7配置网络「建议收藏」1.动态获取ip(前提是你的路由器已经开启了DHCP)修改网卡配置文件vi/etc/sysconfig/network-scripts/ifcfg-ens32(最后一个为网卡名称)动态获取IP地址需要修改两处地方即可(1)bootproto=dhcp(2)onboot=yes修改后重启一下网络服务即可systemctlrestartnetwork2、配置静态IP地址设置静态IP地…

    2022年5月8日
    46

发表回复

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

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