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

相关推荐
技术求索者2 小时前
c++学习
开发语言·c++·学习
cykaw25905 小时前
QT 文件选择对话框 QFileDialog
开发语言·qt
左直拳5 小时前
c++中“&”符号代表引用还是取内存地址?
开发语言·c++·指针·引用·右值·取内存地址
十年编程老舅6 小时前
二本计算机,毕业=失业?
c++·程序员·编程·秋招·c++项目·春招·qt项目
虾球xz6 小时前
游戏引擎学习第260天:在性能分析器中实现钻取功能
网络·c++·学习·游戏引擎
Yusei_05236 小时前
C++复习类与对象基础
c++
freshman_y7 小时前
Qt实现车载多媒体项目,包含天气、音乐、视频、地图、五子棋功能模块,免费下载源文件!
开发语言·qt
拾忆-eleven8 小时前
C++算法(19):整数类型极值,从INT_MIN原理到跨平台开发实战
数据结构·c++·算法
Hxyle8 小时前
c++设计模式
开发语言·c++·设计模式
www_pp_9 小时前
# 创建一个功能完备的计算器应用:使用PyQt5和Python
开发语言·python·qt