C# 实现全局鼠标钩子操作以及发送键盘事件

news2024/11/14 5:38:17

全局钩子定义

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace WindowsFormsApp1
{
    public static class GlobalMousePosition
    {
        #region 获取鼠标当前位置
        public const int WH_MOUSE_LL = 14;

        public enum MouseMessages
        {
            WM_MOUSEMOVE = 0x0200
        }

        public delegate int LowLevelMouseProc(int nCode, IntPtr wParam, IntPtr lParam);

        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        public static extern IntPtr SetWindowsHookEx(int idHook, LowLevelMouseProc lpfn, IntPtr hMod, uint dwThreadId);

        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        public static extern bool UnhookWindowsHookEx(IntPtr hhk);

        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        public static extern int CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam);

        [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        public static extern IntPtr GetModuleHandle(string lpModuleName);
        #endregion


        #region 点击事件
        [DllImport("user32.dll")]
        static extern bool SetCursorPos(int x, int y);

        [DllImport("user32.dll")]
        public static extern void mouse_event(uint dwFlags, int dx, int dy, uint dwData, int dwExtraInfo);

        // 模拟鼠标点击一次
        public static void SimulateMouseClick(int x, int y)
        {
            SetCursorPos(x, y);
            Thread.Sleep(100);  // 等待 100 毫秒,确保鼠标移动到指定位置

            // 模拟鼠标按下和释放操作(模拟点击)
            mouse_event(0x0002, x, y, 0, 0);  // 鼠标左键按下
            mouse_event(0x0004, x, y, 0, 0);  // 鼠标左键释放
        }
        #endregion

    }
}

winfrom窗体代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using static System.Net.Mime.MediaTypeNames;
using static WindowsFormsApp1.GlobalMousePosition;

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        private LowLevelMouseProc mouseProc;
        private IntPtr mouseHookId = IntPtr.Zero;
        public Form1()
        {
            InitializeComponent();
            this.TopMost = true;
        }

        protected override void OnLoad(EventArgs e)
        {
            base.OnLoad(e);

            // 注册全局鼠标钩子
            mouseProc = HookCallback;
            using (Process curProcess = Process.GetCurrentProcess())
            using (ProcessModule curModule = curProcess.MainModule)
            {
                mouseHookId = SetWindowsHookEx(WH_MOUSE_LL, mouseProc, GetModuleHandle(curModule.ModuleName), 0);
            }
        }

        protected override void OnFormClosing(FormClosingEventArgs e)
        {
            base.OnFormClosing(e);

            // 取消注册全局鼠标钩子
            UnhookWindowsHookEx(mouseHookId);
        }

        private int HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
        {
            if (nCode >= 0 && MouseMessages.WM_MOUSEMOVE == (MouseMessages)wParam)
            {
                // 获取鼠标位置
                Point mousePosition = Cursor.Position;

                // 更新你的全局记录逻辑,比如将当前鼠标位置保存到全局变量或日志中
                // ...
                labelMousePosition.Text = string.Format("当前鼠标位置:X={0}, Y={1}", mousePosition.X, mousePosition.Y);
            }

            return CallNextHookEx(mouseHookId, nCode, wParam, lParam);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Clipboard.Clear(); // 清空剪贴板
            int x = int.Parse(this.x.Text);
            int y = int.Parse(this.y.Text);
            string text = this.textbox.Text;
            Clipboard.SetText(text);
            Thread.Sleep(100);
            SimulateMouseClick(x, y);
            Thread.Sleep(100);
            SendKeys.Send("^(v)");
            Thread.Sleep(100);
            SendKeys.Send("\t");
        }
    }
}

效果截图:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/689424.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【云原生 | 55】Docker三剑客之Docker Swarm简介和安装

🍁博主简介: 🏅云计算领域优质创作者 🏅2022年CSDN新星计划python赛道第一名 🏅2022年CSDN原力计划优质作者 🏅阿里云ACE认证高级工程师 🏅阿里云开发者社区专…

chatgpt赋能python:Python如何获取激光雷达数据

Python如何获取激光雷达数据 激光雷达数据在机器学习和自动驾驶领域中扮演着重要的角色。Python作为一种功能强大而又易于学习的编程语言,在获取激光雷达数据方面也表现出极高的效率和灵活性。下面我们将介绍如何使用Python获取激光雷达数据。 什么是激光雷达数据…

vue-li问题记录

Starting development server... ERROR ValidationError: webpack Dev Server Invalid Options options should NOT have additional properties options should NOT have additional properties 大概是package.json或者是vue.config.js文件出现类问题,我把这两…

chatgpt赋能python:Python计算BMI-一篇完整的指南

Python 计算BMI - 一篇完整的指南 我们都知道,BMI是身体质量指数的简称,它是以身高和体重计算的一个数值,用来评估一个人的身体状况。在本文中,我们将介绍如何使用Python计算BMI,并提供一些关于BMI的背景知识。 什么…

[Selenium] 通过Java+Selenium查询某个博主的Top100文章质量分

系列文章目录 通过JavaSelenium查询文章质量分 通过JavaSelenium查询某个博主的Top40文章质量分 通过JavaSelenium查询某个博主的Top100文章质量分 文章目录 系列文章目录前言一、环境准备二、查询某个博主的Top100文章2.1、修改pom.xml配置2.2、配置Chrome驱动2.3、引入浏览器…

数据结构C语言版本(下)

第七章 图 第一节 图的定义 一、逻辑结构 1、逻辑结构 ①定义:G(V,E)。V是顶点集,E是顶点间二元关系的集合。 (内涵越小,外延越大) ②与树的区别: ①树有特殊的根结点; ②树的结点和关系能分成…

津津乐道设计模式 - 桥接模式详解

😄 19年之后由于某些原因断更了三年,23年重新扬帆起航,推出更多优质博文,希望大家多多支持~ 🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志 🎐 个人CSND主页——Mi…

选择C#还是Qt作为上位机开发工具:如何做出最佳决策?

选择C#还是Qt作为上位机开发工具取决于你的具体需求和偏好。以下是一些优化因素供你考虑:跨平台支持:如果你的应用程序需要在多个操作系统上运行,Qt可能是更好的选择,因为它具有强大的跨平台能力。Qt可以帮助你开发具备一致性和可…

演讲实录丨神策数据桑文锋:双引擎赋能数字化客户经营

在「开放融合,引领营销 5.0 新纪元——暨 2023 年金融营销科技价值发现论坛」现场,神策数据创始人 & CEO 桑文锋发表了《双引擎赋能数字化客户经营》的主题演讲,围绕“用户/客户数据平台”和“旅程编排引擎”双引擎做了详细介绍。 本文根…

SpringBoot项目-双人对战五子棋实验报告

简单五子棋Web项目报告 课 程 Web应用程序设计 项目名称 简单双人五子棋对战 成绩 专业班级 XXX 组别 无 学号 XXX 指导教师 XXX 姓 名 XXX 同组人姓名 无 完成日期 XXX 功能描述 1.用户的注册及登录功能 玩家可以在完成游戏账户的注册&#xff0c…

uni-app 数字输入框组件封装

文章目录 前言一、创建数字输入框文件二、制作数字输入框组件三、父组件调用 前言 数字输入框是一个项目中常见的需求,其中的耦合度很高,完全可以将其封装起来使用,在使用的时候传入五个参数,分别为: 最大值最小值默…

RUST 运行是报 linker `link.exe` not found

如下图所示: 解决方法: 第一步: rustup toolchain install stable-x86_64-pc-windows-gnu 第二步: rustup default stable-x86_64-pc-windows-gnu 验证:

关于全局异常提示

项目中客户端请求如果后端出现技术上的bug,会报出网络异常,这对客户是很不友好的,比方说请求参数格式校验,如下: import com.fasterxml.jackson.annotation.JsonFormat; 假如日期格式传的不对,这个注解校验…

I3C协议手册研读-1

0 前言 对于I3C,我觉得有必要仔细分析一下手册,通过博客的方式来进行,可以更好的督促自己进行学习。 本次研读的I3C手册版本如下图所示。 1 介绍 阿兴分析如下: 目前比较成熟的协议有I2C、SPI、USART等,但是因为有一…

网络安全合规-ISO 27701(二)

隐私信息安全管理体系(PIMS)认证 是在隐私保护方面对 ISO/IEC 27001 和ISO/IEC 27002 的扩展,针对保护可能受到个人信息收集和处理影响的隐私提供了更多相关指南。获得PIMS认证的企业标志着其在保护用户数据和个人信息安全方面符合国际标准IS…

怎么学习和提升后端开发能力? - 易智编译EaseEditing

学习和提升后端开发能力可以通过以下步骤进行: 学习编程语言: 选择一种常用的后端编程语言,如Python、Java、C#等,并深入学习该语言的语法、特性和最佳实践。掌握基本的编程概念和技巧是提升后端开发能力的基础。 学习数据库&am…

微信小程序:期末大作业,毕业设计茶客堂商城微信小程序

1. 项目简介 茶客堂微信小程序是一个为茶叶爱好者提供优质茶叶和茶文化知识的平台。茶作为中国的传统文化,越来越受到各个年龄层的人们的喜爱。而传统的茶叶销售方式有一定的局限性,如茶叶品质无法保证、价格不透明等。茶客堂微信小程序应运而生&#x…

【软考网络管理员】2023年软考网管初级常见知识考点(23)- 路由器的配置

涉及知识点 华为路由器的配置,华为路由器命令大全,软考大纲路由命令,静态路由和动态路由的配置命令,软考网络管理员常考知识点,软考网络管理员网络安全,网络管理员考点汇总。 原创于:CSDN博主-…

GPT快速分区

经过刚刚的“转换分区表类型为GUID格式”设置之后,现在分区的分区表类型已经是GPT格式了。我们设置想要分区的数目,例如我想要分两个区,点击自定选择2个分区,系统C盘分了80G,剩下空间留给了D盘。默认勾选“创建新ESP分…

jenkins流水线Pipeline的使用

pipeline流水线 1、jenkins安装pipeline插件 2、创建流水线项目 1、创建pipeline的流水线项目 2、编写流水线 pipeline {agent anystages {stage(拉去代码) {steps {git credentialsId: gitee, url: https://gitee.com/xwb1056481167/jenkins-demo.gitecho 拉去代码}}stage(m…