gpt4 book ai didi

c++ - 在最小化/最大化/关闭窗口按钮上调用 Sendinput 后​​鼠标指针卡住

转载 作者:行者123 更新时间:2023-11-30 02:43:00 59 4
gpt4 key购买 nike

我正在构建一个应用程序,它从另一台计算机接收鼠标移动/按下/释放命令,并使用 Windows Sendinput 函数模拟它们。

除了我单击生成 Sendinput 调用的同一窗口的最小化、最大化或关闭按钮外,一切正常。

在那种情况下,鼠标指针卡住在最小化按钮(或最大化或关闭)的顶部,并且 UI 事件循环似乎完全卡住。如果我手动点击屏幕上的某处,UI 就会解冻,一切都会恢复正常。

这是我在最小化按钮上生成发送输入调用时发生的情况的屏幕截图: enter image description here

这是我用来模拟鼠标移动/按下/释放的代码:鼠标.cpp

#include "Mouse.h"

#ifdef _WIN32
#include <windows.h>
#endif

#ifdef _WIN32

void Mouse::moveToPoint(const int x, const int y)
{
// get screen resolution
HDC hDCScreen = GetDC(NULL);
int horres = GetDeviceCaps(hDCScreen, HORZRES);
int vertres = GetDeviceCaps(hDCScreen, VERTRES);
ReleaseDC(NULL, hDCScreen);

const int points_in_line = 65535;
const double points_in_x_pixel = points_in_line / static_cast<double>(horres);
const double points_in_y_pixel = points_in_line / static_cast<double>(vertres);

INPUT event;
event.type = INPUT_MOUSE;
event.mi.dx = x * points_in_x_pixel; //+ 0.5;
event.mi.dy = y * points_in_y_pixel; //+ 0.5;
event.mi.mouseData = 0;
event.mi.dwFlags = MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE;
event.mi.time = 0;
event.mi.dwExtraInfo = 0;

SendInput(1, &event, sizeof(event));
}

void Mouse::press(Qt::MouseButton button)
{
DWORD btn = button == Qt::LeftButton ? MOUSEEVENTF_LEFTDOWN :
button == Qt::RightButton ? MOUSEEVENTF_RIGHTDOWN :
button == Qt::MidButton ? MOUSEEVENTF_MIDDLEDOWN : 0;

INPUT event;
event.type = INPUT_MOUSE;
event.mi.dx = 0;
event.mi.dy = 0;
event.mi.mouseData = 0;
event.mi.dwFlags = btn;
event.mi.time = 0;
event.mi.dwExtraInfo = 0;

SendInput(1, &event, sizeof(event));
}

void Mouse::release(Qt::MouseButton button)
{
DWORD btn = button == Qt::LeftButton ? MOUSEEVENTF_LEFTUP :
button == Qt::RightButton ? MOUSEEVENTF_RIGHTUP :
button == Qt::MidButton ? MOUSEEVENTF_MIDDLEUP : 0;

INPUT event;
event.type = INPUT_MOUSE;
event.mi.dx = 0;
event.mi.dy = 0;
event.mi.mouseData = 0;
event.mi.dwFlags = btn;
event.mi.time = 0;
event.mi.dwExtraInfo = 0;

SendInput(1, &event, sizeof(event));
}

void Mouse::scroll(int value)
{
INPUT event;
event.type = INPUT_MOUSE;
event.mi.dx = 0;
event.mi.dy = 0;
event.mi.mouseData = value * WHEEL_DELTA;
event.mi.dwFlags = MOUSEEVENTF_WHEEL;
event.mi.time = 0;
event.mi.dwExtraInfo = 0;

SendInput(1, &event, sizeof(event));
}

void Mouse::doubleClick(Qt::MouseButton button)
{
press(button);
release(button);

std::chrono::milliseconds dura(100);
std::this_thread::sleep_for(dura);

press(button);
release(button);
}
#endif

和头文件:Mouse.h

#ifndef MOUSE_H
#define MOUSE_H

#include <thread>
#include <QtGlobal>
#include <QtEvents>
#include <QDebug>
#include <iostream> //std::cout

class Mouse {
public:
// fails if given coordinates are not in the screen's rect
// Linux: fails if there is an opening X display error
static void moveToPoint(const int x, const int y);

static void doubleClick(Qt::MouseButton button);

// fails if the given button is not Qt::LeftButton, Qt::RightButton or Qt::MiddleButton
// Linux: fails if there is an opening X display error
static void press(Qt::MouseButton button);
static void release(Qt::MouseButton button);

// Linux: fails if there is an opening X display error
static void scroll(int value); //positive values for scrolling up, negative for scrolling down

private:
static Qt::MouseButtons bp;
static void selectArea(const int x, const int y);
};
#endif // MOUSE_H

这种奇怪行为的原因可能是什么?

最佳答案

如您所见,单击其中一个标题按钮会导致 Windows 进入其自己的消息循环,等待按钮释放。

当 Windows 处于此消息循环中时,您自己的消息循环正在等待的任何消息(知道何时释放按钮)都不会发送给您。您永远不会收到释放鼠标按钮的消息,因此永远不要注入(inject)该输入,因此指针似乎卡住了。

解决方案是将您的 SendInput 调用移动到非 GUI 线程。

关于c++ - 在最小化/最大化/关闭窗口按钮上调用 Sendinput 后​​鼠标指针卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26558755/

59 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com