C++;Windows API MOUSEEVENTF\u XDOWN、MOUSEEVENTF\u XUP don';行不通 我试图学习使用C++ Windows API来向Windows发送鼠标输入,到目前为止它是很棒的,但是由于某种原因,当我尝试使用鼠标输入< /COD>结构时,使用 DWFLAGG/ SET到(MouSeEvffxXDOWN MouSeVFEXXUP)它似乎什么也不做,所有其他DWFLAGS也都能正常工作, 文档中说,当MOUSEEVENTF_XDOWN(或MOUSEEVENTF_XUP)用作dwFlags时,它应该调用存储在mouseData中的按钮上的按下或释放(例如XBUTTON1),但它似乎没有做任何事情,代码是否有问题?还是我没有正确地使用它? 我使用的是Windows1064X #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; } } } #包括 #包括 void clickMouse() { 输入事件; 鼠标输入鼠标输入= { 0, 0, 按钮1, (MOUSEEVENTF_XDOWN | MOUSEEVENTF_XUP), 0, 无效的 }; event.type=输入\鼠标; event.mi=鼠标输入; SendInput(1,&事件,sizeof(输入)); } int main() { bool按钮按下=错误; while(true) { 如果(!buttonPressed&&(GetKeyState(VK_控件)>>15)) { 单击鼠标(); 按钮按下=真; } 否则如果(按钮按下&&!(GetKeyState(VK_控件)>>15)) { 按钮按下=错误; } } }
我对您的代码做了一个小改动(Andreas指出),以便像真正的用户那样按顺序触发事件。我使用Chrome作为目标,将鼠标放在窗口的任意位置。看起来,至少在我的机器上,WM_XBUTTONDOWN后跟WM_XBUTTONUP消息会激活后退按钮,无论鼠标位于何处。我还使用Spy++验证这些消息是否是正在生成的消息。指定0,0后,它将在最后一个已知的鼠标位置触发事件。因为这是一个X按钮,所以您必须找到一个响应该事件的应用程序才能看到它正在工作,或者使用Spy++或类似的工具来看到它正在启动。这是我使用的代码C++;Windows API MOUSEEVENTF\u XDOWN、MOUSEEVENTF\u XUP don';行不通 我试图学习使用C++ Windows API来向Windows发送鼠标输入,到目前为止它是很棒的,但是由于某种原因,当我尝试使用鼠标输入< /COD>结构时,使用 DWFLAGG/ SET到(MouSeEvffxXDOWN MouSeVFEXXUP)它似乎什么也不做,所有其他DWFLAGS也都能正常工作, 文档中说,当MOUSEEVENTF_XDOWN(或MOUSEEVENTF_XUP)用作dwFlags时,它应该调用存储在mouseData中的按钮上的按下或释放(例如XBUTTON1),但它似乎没有做任何事情,代码是否有问题?还是我没有正确地使用它? 我使用的是Windows1064X #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; } } } #包括 #包括 void clickMouse() { 输入事件; 鼠标输入鼠标输入= { 0, 0, 按钮1, (MOUSEEVENTF_XDOWN | MOUSEEVENTF_XUP), 0, 无效的 }; event.type=输入\鼠标; event.mi=鼠标输入; SendInput(1,&事件,sizeof(输入)); } int main() { bool按钮按下=错误; while(true) { 如果(!buttonPressed&&(GetKeyState(VK_控件)>>15)) { 单击鼠标(); 按钮按下=真; } 否则如果(按钮按下&&!(GetKeyState(VK_控件)>>15)) { 按钮按下=错误; } } },c++,windows,C++,Windows,我对您的代码做了一个小改动(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;
}
}
}
#包括
#包括
void clickMouse()
{
输入事件;
鼠标输入鼠标输入[]=
{
{
0,
0,
按钮1,
(Mouseeventfxdown),
0,
无效的
},
{
0,
0,
按钮1,
(MOUSEEVENTF_XUP),
0,
无效的
}};
event.type=输入\鼠标;
event.mi=鼠标输入[0];
SendInput(1,&事件,sizeof(输入));
event.mi=鼠标输入[1];
SendInput(1,&事件,sizeof(输入));
}
int main()
{
bool按钮按下=错误;
while(true)
{
如果(!buttonPressed&&(GetKeyState(VK_控件)>>15))
{
单击鼠标();
按钮按下=真;
}
否则如果(按钮按下&&!(GetKeyState(VK_控件)>>15))
{
按钮按下=错误;
}
}
}
您是否检查了SendInput
的返回值?它报告成功还是失败?我不确定将MOUSEEVENTF_XDOWN事件和MOUSEEVENTF_XUP事件结合起来是否有意义。首先发送向下事件,然后发送向上事件似乎更有意义。您似乎在相对于上次鼠标单击位置的坐标(0,0)处发送单击事件。这是故意的吗?如果目标窗口位于左上角,绝对坐标不是更合适吗(100100)?对于绝对坐标,您必须设置MOUSEEVENTF_绝对标志。@AndreasWenzel Success(非零值)@AndreasWenzel我不想移动鼠标,相对于上次报告的位置的坐标(0,0)不适合吗?