C++Windows API MOUSEEVENTF_XDOWN,MOUSEEVENTF_XUP不起作用

C++ Windows API MOUSEEVENTF_XDOWN, MOUSEEVENTF_XUP don't work

本文关键字:MOUSEEVENTF XUP 不起作用 XDOWN C++Windows API      更新时间:2023-10-16

我正在尝试学习使用 c++ Windows API 将鼠标输入发送到 Windows,到目前为止它很棒,但由于某种原因,当我尝试使用dwflags设置为(MOUSEEVENTF_XDOWN | MOUSEEVENTF_XUP)mouseInput结构时,它似乎什么也没做,所有其他 dwFlag 似乎都可以工作, 在文档中据说,当MOUSEEVENTF_XDOWN(或MOUSEEVENTF_XUP(用作dwFlags时,它应该调用存储在mouseData中的按钮上的按下或释放(例如XBUTTON1(,但它似乎什么也没做,代码有问题吗?还是我没有正确使用它? 我正在使用视窗 10 64x

#include<iostream>
#include<Windows.h>

void clickMouse()
{
INPUT event;
MOUSEINPUT mouseInput = 
{
0,
0,
XBUTTON1,
(MOUSEEVENTF_XDOWN | MOUSEEVENTF_XUP),
0,
NULL
};
event.type = INPUT_MOUSE;
event.mi = mouseInput;
SendInput(1, &event, sizeof(INPUT));
}
int main()
{
bool buttonPressed = false;
while (true)
{
if (!buttonPressed && (GetKeyState(VK_CONTROL) >> 15))
{
clickMouse();
buttonPressed = true;
}
else if (buttonPressed && !(GetKeyState(VK_CONTROL) >> 15))
{
buttonPressed = false;
}
}
}

我对你的代码做了一个小的更改(由 Andreas 指出(,以像真实用户一样按顺序触发事件。我通过将鼠标放在窗口上方的任意位置来使用 Chrome 作为目标。看起来,至少在我的机器上,无论鼠标位于何处,WM_XBUTTONDOWN后跟WM_XBUTTONUP消息都会激活后退按钮。我还使用 Spy++ 来验证这些是正在生成的消息。指定 0,0 时,它将在最后一个已知的鼠标位置触发事件。因为这是一个 X 按钮,所以您必须找到响应该事件的应用程序以查看它是否正在运行或使用 Spy++ 或类似工具来查看它是否正在触发。这是我使用的代码。

#include<iostream>
#include<Windows.h>

void clickMouse()
{
INPUT event;
MOUSEINPUT mouseInput[] =
{  
{
0,
0,
XBUTTON1,
(MOUSEEVENTF_XDOWN),
0,
NULL
},
{
0,
0,
XBUTTON1,
(MOUSEEVENTF_XUP),
0,
NULL
}};
event.type = INPUT_MOUSE;
event.mi = mouseInput[0];
SendInput(1, &event, sizeof(INPUT));
event.mi = mouseInput[1];
SendInput(1, &event, sizeof(INPUT));
}
int main()
{
bool buttonPressed = false;
while (true)
{
if (!buttonPressed && (GetKeyState(VK_CONTROL) >> 15))
{
clickMouse();
buttonPressed = true;
}
else if (buttonPressed && !(GetKeyState(VK_CONTROL) >> 15))
{
buttonPressed = false;
}
}
}

这就是我正在做的,它有效。关键是使用MOUSEEVENTF_LEFTDOWNMOUSEEVENTF_LEFTUP而不是MOUSEEVENTF_XDOWNMOUSEEVENTF_XUP

void MouseInput(int x, int y, int button, bool release)
{
#ifdef _WIN32
INPUT input;
input.type         = INPUT_MOUSE;
input.mi.mouseData = button;
input.mi.dx        = int(x * (65536.0f / GetSystemMetrics(SM_CXSCREEN)));
input.mi.dy        = int(y * (65536.0f / GetSystemMetrics(SM_CYSCREEN)));
input.mi.dwFlags   = MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE | (button ? (release ? MOUSEEVENTF_LEFTUP : MOUSEEVENTF_LEFTDOWN) : 0);
SendInput(1, &input, sizeof(input));
#endif // _WIN32
}

调用示例:

{
MouseInput(500, 200, 0, false); // just move the mouse
std::this_thread::sleep_for(std::chrono::milliseconds(300));
MouseInput(500, 200, 1, false); // push the left button
std::this_thread::sleep_for(std::chrono::milliseconds(150));
MouseInput(500, 200, 1, true); // release the left button
}
相关文章:
  • 没有找到相关文章