Qt中模拟鼠标消息并与系统鼠标消息进行区分
功能使用场景:
开发一个教学系统,包含了教师端、学生端,并且教师端支持示教功能。此时,学生端的鼠标、键盘不响应系统事件,但需要响应教师端发过来的鼠标移动、按下消息。
因为共享页面相同,为了提高局域网实时效率,采用UDP通讯方式,使用共享鼠标的方式最快(目前我没有找到比这个更快的了,如果有,小伙伴可以评论区告诉我哟,我也学习下)
在实现功能时,主要实现方式:使用钩子函数,处理系统发送的鼠标以及键盘消息。
那么禁用掉教师端的鼠标键盘消息后,如何在教师端响应按下消息时,也让学生端响应呢?
此时,就需要模拟鼠标按下消息,并且需要区分哪些消息是模拟的,哪些是PC机自己发送的。这是本文的重点!
模拟鼠标左键消息
项目中采用了WIN32的方式,可以应用到Qt框架中(我觉得比Qt的MouseEvent方式更简单)
int nPointX = 100;
int nPointY = 100;
mouse_event(MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_LEFTDOWN, nPointX, nPointY, 0, 200);
mouse_event(MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_LEFTUP, nPointX, nPointY, 0, 200);
注意:大家有没有发现使用mouse_event的最后一个参数,不是0而是一个具体的值,那么,在这里这个值有什么用呢?
回答:"200"这个值就是用来区分系统的鼠标消息与自定义消息的。当使用钩子函数禁用鼠标左键消息时,只需要屏蔽由鼠标发送的消息,而不需要屏蔽模拟鼠标消息,这样保证了在示教过程中任何点击事件都是由教师端控制的。
钩子函数应用
1:禁用键盘消息
HHOOK hook_hwnd_mouse = NULL;
HMODULE g_moduleMouse;LRESULT CALLBACK KeyboardHookProc(int nCode, WPARAM wParam, LPARAM lParam)
{KBDLLHOOKSTRUCT* pkbhs = (KBDLLHOOKSTRUCT*)lParam;if (nCode == HC_ACTION){if (wParam == WM_KEYDOWN || wParam == WM_KEYUP){//qDebug() << QStringLiteral("当前是键盘消息!");return TRUE;}}return CallNextHookEx(NULL, nCode, wParam, lParam);
}
在开启教师端示教功能时,开启对钩子函数的应用,关闭时解除钩子函数
//开启钩子函数
hook_hwnd_key = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardHookProc, g_moduleKeyboard, 0);
//取消钩子函数
UnhookWindowsHookEx(hook_hwnd_key);
使用这种方式可以禁用所有的键盘消息。
2:禁用鼠标移动消息
HHOOK hook_hwnd_mouse = NULL;
HMODULE g_moduleMouse;//鼠标事件
LRESULT CALLBACK MouseHookProc(int nCode, WPARAM wParam, LPARAM lParam)
{if (nCode == HC_ACTION){switch (wParam){case WM_MOUSEWHEEL: // 忽略鼠标滚轮输入,禁用滑动case WM_MOUSEMOVE:return TRUE; // 拦截消息,不再传递}}return CallNextHookEx(NULL, nCode, wParam, lParam);
}
控制钩子函数的开启与释放,代码如下:
//开启钩子函数
hook_hwnd_mouse = SetWindowsHookEx(WH_MOUSE_LL, MouseHookProc, g_moduleMouse, 0);
//关闭钩子函数
UnhookWindowsHookEx(hook_hwnd_mouse);
3:禁用特定鼠标左键消息
在第二个功能的基础上,钩子函数需要捕获鼠标左键按下、弹起的消息
//鼠标事件
LRESULT CALLBACK MouseHookProc(int nCode, WPARAM wParam, LPARAM lParam)
{if (nCode == HC_ACTION){switch (wParam){case WM_MOUSEWHEEL: // 忽略鼠标滚轮输入,禁用滑动case WM_MOUSEMOVE:return TRUE; // 拦截消息,不再传递case WM_LBUTTONDOWN:case WM_LBUTTONUP:{MOUSEHOOKSTRUCT* pMouseHookStruct = reinterpret_cast<MOUSEHOOKSTRUCT*>(lParam);if (dwExtraInfo == 0){return TRUE; //屏蔽鼠标的消息}}break;}}return CallNextHookEx(NULL, nCode, wParam, lParam);
}
注:dwExtraInfo由鼠标按下传过来的参数值是0,mouse_event模拟的消息中,dwExtraInfo是200。由此,就能区分出需要屏幕哪些按键消息了。
好了,到这里就结束啦,代码简单,难的是查询函数功能,希望对小伙伴们有用哟!
我是糯诺诺米团,一名C++程序媛~
相关文章:
Qt中模拟鼠标消息并与系统鼠标消息进行区分
功能使用场景: 开发一个教学系统,包含了教师端、学生端,并且教师端支持示教功能。此时,学生端的鼠标、键盘不响应系统事件,但需要响应教师端发过来的鼠标移动、按下消息。 因为共享页面相同,为了提高局域…...
实时数据开发 | 一文理解Flink窗口机制
窗口操作在流处理和批处理之间起到了桥梁的作用。 Flink引擎本质上是流式引擎,认为批处理是流处理的一个特例。因此,通过窗口将流数据划分为有限大小的集合,使得在这些有界的数据集上可以进行批处理风格的计算。 通过配置窗口的参数…...
MFC 自定义树控件:树节点的样式与交互
在本教程中,将介绍如何在 MFC 应用程序中使用树控件 (CTreeCtrl) 进行高级定制,包括设置字体、颜色、徽章、图标、节点的高度等。通过这些自定义设置,可以显著提升用户界面的交互性和视觉效果。 1. 树控件基本设置 首先,我们需要…...
YOLOv8-ultralytics-8.2.103部分代码阅读笔记-loss.py
loss.py ultralytics\utils\loss.py 目录 loss.py 1.所需的库和模块 2.class VarifocalLoss(nn.Module): 3.class FocalLoss(nn.Module): 4.class DFLoss(nn.Module): 5.class BboxLoss(nn.Module): 6.class RotatedBboxLoss(BboxLoss): 7.class KeypointLoss(n…...
像素流送api ue多人访问需要什么显卡服务器
关于像素流送UE推流,在之前的文章里其实小芹和大家聊过很多,不过今天偶然搜索发现还是有很多小伙伴,在搜索像素流送相关的问题,搜索引擎给的提示有这些。当然这些都是比较短的词汇,可能每个人真正遇到的问题和想获取的…...
字符型注入‘)闭合
前言 进行sql注入的时候,不要忘记闭合,先闭合再去获取数据 步骤 判断是字符型注入 用order by获取不了显位,select也一样 是因为它是’)闭合,闭合之后,就可以获取数据了 最后就是一样的步骤...
评分规则的建模,用户全选就是满分10分(分数可自定义), 选2个5分, 选2个以下0分
子夜(603***854) 15:11:40 和各位讨论一下设计问题: 有个有业务场景: 有一组产品共4个产品(数目用户可自定义), 需要一套规则,比如如果用户全选就是满分10分(分数可自定义), 选2个5分, 选2个以下0分 又比如另一组产品 产品有个必选属性,如果选了其中所有的必选则5分, 其他项每1…...
Elasticsearch与NLP的深度融合:文本嵌入与向量搜索实战指南
Elasticsearch与NLP的深度融合:文本嵌入与向量搜索实战指南 引言 在当今信息爆炸的时代,如何从海量文本数据中快速准确地检索出相关信息,成为了一个迫切需要解决的问题。自然语言处理(NLP)技术的发展为这一挑战提供了新的解决方案。Elasticsearch,作为一个强大的搜索引…...
4. STM32_定时器
概述 什么是定时器: 定时器核心就是计数器,是使用精准的时基,通过硬件的方式,实现定时功能的器件。 定时器的工作原理: 主频时钟CLK通过PSC进行分频后产生定时器时钟TIM CLK,计数器CNT根据TIM CLK的频率…...
Mysql 深度分页问题及优化方案
Mysql 深度分页问题及优化方案 一、为什么 MySQL 深度分页慢?二、优化方案三、补充 一、为什么 MySQL 深度分页慢? 在数据量大时,深分页查询速度缓慢,主要原因是多次回表查询。 前言:N个条件为索引,id为主…...
前端性能优化技巧
前端性能优化技巧 1. 介绍 前端性能优化是确保网站或应用程序快速、响应迅速和流畅的关键。本文档将详细探讨提升前端性能的各种策略和最佳实践。 2. 资源加载优化 2.1 资源压缩 代码压缩:使用 Webpack、Terser 等工具压缩 JavaScript、CSS 文件文件大小压缩&a…...
taro使用createAsyncThunk报错ReferenceError: AbortController is not defined
解决办法: 1,安装这俩包:yet-another-abortcontroller-polyfill,event-target-polyfill 2,app.js import: import ‘event-target-polyfill’; import ‘yet-another-abortcontroller-polyfill’; 补充 但…...
Linux:systemd进程管理【1】
整体理解 要快速掌握Linux的systemd并覆盖80%的使用场景,以下是最重要的20%知识点: Systemd简介与核心功能: Systemd是一个系统和服务管理器,作为Linux系统的PID 1进程,负责启动和管理其他系统组件。它提供并行启动服…...
【Maven】继承和聚合
5. Maven的继承和聚合 5.1 什么是继承 Maven 的依赖传递机制可以一定程度上简化 POM 的配置,但这仅限于存在依赖关系的项目或模块中。当一个项目的多个模块都依赖于相同 jar 包的相同版本,且这些模块之间不存在依赖关系,这就导致同一个依赖…...
【线上问题记录 | 排查网络连接问题】
问题描述 现在有我们程序是部署在服务器A的,A链接的是B。程序从B的redis进行存储和取数据的。 我们的业务是: 信息展示,也就是如果发现机器有异常了,实时进行监控。突然发现有一天,信息显示延迟了。 然后我们就开始排查究竟什么原…...
springboot车辆管理系统设计与实现(代码+数据库+LW)
摘要 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了车辆管理系统的开发全过程。通过分析车辆管理系统管理的不足,创建了一个计算机管理车辆管理系统的方案。文章介绍了车辆管理系统的系统分析部分&…...
独家|京东调整职级序列体系
原有的M、P、T、S主序列将正式合并为新的专业主序列P。 作者|文昌龙 编辑|杨舟 据「市象」独家获悉,京东已在近日在内部宣布对职级序列体系进行调整,将原有的M、P、T、S主序列正式合并为新的专业主序列P,合并后的职级体系将沿用原有专业序…...
Arrays.copyOfRange(),System.arraycopy() 数组复制,数组扩容
Arrays.copyOfRange() 当需要将数组中的 长度扩容时, 数组复制 使用 需要用到Arrays 类提供的的 参数解析 * param original the array from which a range is to be copied * param from the initial index of the range to be copied, inclusive * param to the final ind…...
Python学习37天
# 魔术方法 # 创建类Monster,默认为object的子类 class Monster: name None age None gender None def __init__(self, name, age, gender): self.name name self.age age self.gender gender # 重写魔术方法__str__输出实例对象信息…...
flask的第一个应用
本文编写一个简单的实例来记录下flask的使用 文章目录 简单实例flask中的路由 简单实例 flask的依赖包都安装好之后,我们就可以写一个最简单的web应用程序了,我们把这个应用程序命名为first.py: from flask import Flaskapp Flask(__name__)app.route(/…...
手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...
MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...
大学生职业发展与就业创业指导教学评价
这里是引用 作为软工2203/2204班的学生,我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要,而您认真负责的教学态度,让课程的每一部分都充满了实用价值。 尤其让我…...
MySQL 8.0 事务全面讲解
以下是一个结合两次回答的 MySQL 8.0 事务全面讲解,涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容,并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念(ACID) 事务是…...
解读《网络安全法》最新修订,把握网络安全新趋势
《网络安全法》自2017年施行以来,在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂,网络攻击、数据泄露等事件频发,现行法律已难以完全适应新的风险挑战。 2025年3月28日,国家网信办会同相关部门起草了《网络安全…...
Bean 作用域有哪些?如何答出技术深度?
导语: Spring 面试绕不开 Bean 的作用域问题,这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开,结合典型面试题及实战场景,帮你厘清重点,打破模板式回答,…...
Linux系统部署KES
1、安装准备 1.版本说明V008R006C009B0014 V008:是version产品的大版本。 R006:是release产品特性版本。 C009:是通用版 B0014:是build开发过程中的构建版本2.硬件要求 #安全版和企业版 内存:1GB 以上 硬盘…...
【WebSocket】SpringBoot项目中使用WebSocket
1. 导入坐标 如果springboot父工程没有加入websocket的起步依赖,添加它的坐标的时候需要带上版本号。 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId> </dep…...
echarts使用graphic强行给图增加一个边框(边框根据自己的图形大小设置)- 适用于无法使用dom的样式
pdf-lib https://blog.csdn.net/Shi_haoliu/article/details/148157624?spm1001.2014.3001.5501 为了完成在pdf中导出echarts图,如果边框加在dom上面,pdf-lib导出svg的时候并不会导出边框,所以只能在echarts图上面加边框 grid的边框是在图里…...
