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

1、控制鼠标移动

(1)Qt方案

cpp 复制代码
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:

cpp 复制代码
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回到桌面的功能:

cpp 复制代码
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的鼠标移动实现都是步进式的移动,如果要实现像鼠标或者摇杆一样的移动,应该怎么处理呢?难道用多线程?

相关推荐
辞旧 lekkk12 分钟前
【Qt】信号和槽
linux·开发语言·数据库·qt·学习·mysql·萌新
liuhuizuikeai3 小时前
可视化门禁---Linux/Qt+SqLite篇
linux·运维·qt
王老师青少年编程3 小时前
csp信奥赛C++高频考点专项训练之字符串 --【子串查找】:[NOIP 2009 提高组] 潜伏者
c++·字符串·csp·高频考点·信奥赛·子串查找·潜伏者
初願致夕霞3 小时前
基于系统调用的Linux网络编程——UDP与TCP
linux·网络·c++·tcp/ip·udp
小小de风呀5 小时前
de风——【从零开始学C++】(五):内存管理
开发语言·c++
CHANG_THE_WORLD6 小时前
C语言中的 %*s 和 %.*s 和C++的字符串格式化输出
c语言·c++·c#
螺丝钉的扭矩一瞬间产生高能蛋白7 小时前
QT的C++接口基础用法
c++·qt·嵌入式软件·嵌入式linux·linux应用
智者知已应修善业7 小时前
【51单片机模拟生日蜡烛】2023-10-10
c++·经验分享·笔记·算法·51单片机
智者知已应修善业8 小时前
【51单片机如何让LED灯从一亮到八,再从八亮到一】2023-10-13
c++·经验分享·笔记·算法·51单片机
qeen878 小时前
【数据结构】二叉树相关经典函数C语言实现
c语言·数据结构·c++·笔记·学习·算法·二叉树