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

相关推荐
daidaidaiyu19 分钟前
一文入门 Android NDK 开发
c++
Ethernet_Comm20 分钟前
从 C 转向 C++ 的过程
c语言·开发语言·c++
难得的我们22 分钟前
C++与区块链智能合约
开发语言·c++·算法
diediedei36 分钟前
C++编译期正则表达式
开发语言·c++·算法
Tianwen_Burning2 小时前
c++ release下的debug
c++
小小码农Come on2 小时前
QT qss样式表案例
qt
谦宸、墨白2 小时前
从零开始学C++:二叉树进阶
开发语言·数据结构·c++
Howrun7773 小时前
C++ 文件操作全知识点详细讲解
c++
小温冲冲4 小时前
QPixmap 详解:Qt 中的高效图像处理类
开发语言·图像处理·qt
小温冲冲4 小时前
Qt实现图片缩放与拖拽查看功能(附源码)
qt