当前位置: 首页 > news >正文

Qt/C++模拟鼠标键盘输入

1、控制鼠标移动

(1)Qt方案

QScreen* sc = QGuiApplication::primaryScreen();
QCursor* c = new QCursor();
int deltaX = 10;
int deltaY = 10;
c->setPos(sc, c->pos().x() + deltaX, c->pos().y() + deltaY);

(2)Windows原生方案(依赖WinUser.h)

方案1: 

int deltaX = 10;
int deltaY = 10;
POINT p;
GetCursorPos(&p);
SetCursorPos(p.x + deltaX, p.y + deltaY);

PS:用clipCursor函数可以限制光标范围 

方案2:

参考sendInput函数和其中需要用到的MOUSEINPUT结构体来实现,具体可以看:
sendInput 函数 (winuser.h) - Win32 apps | Microsoft Learn
MOUSEINPUT (winuser.h) - Win32 apps | Microsoft Learn

PS:该方法不指定MOUSEEVENTF_ABSOLUTE时鼠标是用的相对移动,运动速度受系统设置中“指针速度”的影响,因此会更加合理。

2、模拟鼠标/键盘输入

(1)Windows原生方案(依赖WinUser.h)

参考sendInput函数和其中需要用到的MOUSEINPUT结构体以及KEYBDINPUT结构体实现,下面是官方例程关于实现键盘输入的例子,实现了键盘Win+D回到桌面的功能:

INPUT inputs[4];
ZeroMemory(inputs, sizeof(inputs));
inputs[0].type = INPUT_KEYBOARD;
inputs[0].ki.wVk = VK_LWIN;
inputs[1].type = INPUT_KEYBOARD;
inputs[1].ki.wVk = 'D';
inputs[2].type = INPUT_KEYBOARD;
inputs[2].ki.wVk = 'D';
inputs[2].ki.dwFlags = KEYEVENTF_KEYUP;
inputs[3].type = INPUT_KEYBOARD;
inputs[3].ki.wVk = VK_LWIN;
inputs[3].ki.dwFlags = KEYEVENTF_KEYUP;
UINT uSent = SendInput(ARRAYSIZE(inputs), inputs, sizeof(INPUT));
if (uSent != ARRAYSIZE(inputs))
{OutputString(L"SendInput failed: 0x%x\n", HRESULT_FROM_WIN32(GetLastError()));
}

其中,uSent是函数返回成功插入键盘或鼠标输入流的事件数。如果函数返回零,则表示输入已被另一个线程阻止。若返回的时间数与发出的事件数不等,则有事件发送失败,使用GetLastError可以获取错误信息。

键盘、鼠标同理,参见:

sendInput 函数 (winuser.h) - Win32 apps | Microsoft Learn

KEYBDINPUT (winuser.h) - Win32 apps | Microsoft Learn

MOUSEINPUT (winuser.h) - Win32 apps | Microsoft Learn

3、请教一下

想请教一下路过的大佬,这种Qt的鼠标移动实现都是步进式的移动,如果要实现像鼠标或者摇杆一样的移动,应该怎么处理呢?难道用多线程?

http://www.lryc.cn/news/386565.html

相关文章:

  • OpenGL3.3_C++_Windows(22)
  • electron-builder 打包过慢解决
  • leetcode226反转二叉树
  • 【自然语言处理系列】探索NLP:使用Spacy进行分词、分句、词性标注和命名实体识别,并以《傲慢与偏见》与全球恐怖活动两个实例文本进行分析
  • 【Rust】function和methed的区别
  • python基础语法 003-4 数据类型集合
  • Vue如何引用组件
  • vue3中省市区联动在同一个el-form-item中咋么设置rules验证都不为空的效果
  • 如何集成CppCheck到visual studio中
  • GWO-CNN-SVM,基于GWO灰狼优化算法优化卷积神经网络CNN结合支持向量机SVM数据分类(多特征输入多分类)
  • Go-知识测试-工作机制
  • 【小程序静态页面】猜拳游戏大转盘积分游戏小程序前端模板源码
  • JupyterServer配置
  • 信息检索(57):MINIMIZING FLOPS TO LEARN EFFICIENT SPARSE REPRESENTATIONS
  • Python 面试【中级】
  • [Open-source tool]Uptime-kuma的簡介和安裝於Ubuntu 22.04系統
  • 【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 灰度图像恢复(100分) - 三语言AC题解(Python/Java/Cpp)
  • leetcode494. 目标和
  • 数据结构简介
  • PyScript:在浏览器中释放Python的强大
  • 巴黎成为欧洲AI中心 大学开始输出AI创始人
  • 完全离线的本地问答模型LocalGPT如何实现无公网IP远程连接提问
  • 【算法专题--栈】栈的压入、弹出序列 -- 高频面试题(图文详解,小白一看就懂!!)
  • 如何高效安全的开展HPC数据传输,保护数据安全?
  • Java部分复习笔记整理
  • GoLang语言
  • ctfshow web入门 sqli-labs web517--web524
  • Spring Cloud Gateway 跨域配置和跨服务请求跟踪
  • 动手学深度学习(Pytorch版)代码实践 -卷积神经网络-29残差网络ResNet
  • 解锁音乐潮流:使用TikTok API获取平台音乐信息