VS2022 MFC C++使用SendInput模拟左键点击的问题

本次主要实验模拟左键点击的问题,模拟鼠标可以通过两种方式:一种是使用mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);另一种是使用SendInput。

使用第一种方式执行

mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);

mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);

动作正常。

使用第二种方式时,按照如下方式处理,按照绝对坐标

POINT pt;
GetCursorPos(&pt);
INPUT inputDown = { 0 };
inputDown.type = INPUT_MOUSE;
inputDown.mi.dx = pt.x * 65535 / GetSystemMetrics(SM_CXSCREEN);            
inputDown.mi.dy = pt.y * 65535 / GetSystemMetrics(SM_CYSCREEN);
inputDown.mi.mouseData = 0;
inputDown.mi.dwFlags = MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_ABSOLUTE;
inputDown.mi.time = 0;
inputDown.mi.dwExtraInfo = 0;
INPUT inputUp = { 0 };
inputUp.type = INPUT_MOUSE;
inputUp.mi.dx = pt.x * 65535 / GetSystemMetrics(SM_CXSCREEN);
inputUp.mi.dy = pt.y * 65535 / GetSystemMetrics(SM_CYSCREEN);
inputUp.mi.mouseData = 0;
inputUp.mi.dwFlags = MOUSEEVENTF_LEFTUP | MOUSEEVENTF_ABSOLUTE;
inputUp.mi.time = 0;
inputUp.mi.dwExtraInfo = 0;
INPUT inputs[] = { inputDown,inputUp };
SendInput(_countof(inputs), inputs, sizeof(INPUT));

运行结果无效。

改为如下方式,按照相对坐标方式,

INPUT inputDown = { 0 };
inputDown.type = INPUT_MOUSE;
inputDown.mi.dwFlags = MOUSEEVENTF_LEFTDOWN;
INPUT inputUp = { 0 };
inputUp.type = INPUT_MOUSE;
inputUp.mi.dwFlags = MOUSEEVENTF_LEFTUP;
INPUT inputs[2] = { inputDown,inputUp };
UINT usend = SendInput(1, inputs, sizeof(INPUT));INPUT inputDown = { 0 };
inputDown.type = INPUT_MOUSE;
inputDown.mi.dwFlags = MOUSEEVENTF_LEFTDOWN;
INPUT inputUp = { 0 };
inputUp.type = INPUT_MOUSE;
inputUp.mi.dwFlags = MOUSEEVENTF_LEFTUP;
INPUT inputs[2] = { inputDown,inputUp };
UINT usend = SendInput(2, inputs, sizeof(INPUT));

if (usend != 1)
{
    TRACE(L"SendInput failed: 0x%x\n", HRESULT_FROM_WIN32(GetLastError()));
}
TRACE(_T("SendInput111:  %d\n"), usend);

返回值为0,说明执行失败。

改为如下方式

INPUT inputDown = { 0 };
inputDown.type = INPUT_MOUSE;
inputDown.mi.dwFlags = MOUSEEVENTF_LEFTDOWN;
INPUT inputUp = { 0 };
inputUp.type = INPUT_MOUSE;
inputUp.mi.dwFlags = MOUSEEVENTF_LEFTUP;
INPUT inputs[2] = { inputDown,inputUp };
UINT usend = SendInput(1, inputs, sizeof(INPUT));
if (usend != 1)
{
    TRACE(L"SendInput failed: 0x%x\n", HRESULT_FROM_WIN32(GetLastError()));
}
TRACE(_T("SendInput111: %d    %d\n"), s_TimerCnt++,usend);

usend = SendInput(1, &inputs[1], sizeof(INPUT));
if (usend != 1)
{
    TRACE(L"SendInput failed: 0x%x\n", HRESULT_FROM_WIN32(GetLastError()));
}
TRACE(_T("SendInput222: %d    %d\n"), s_TimerCnt++, usend);

执行成功。

改为如下测试

INPUT inputs[2] = { {0},{0} };
inputs[0].type = INPUT_MOUSE;
inputs[0].mi.dwFlags = MOUSEEVENTF_LEFTDOWN;
inputs[1].type = INPUT_MOUSE;
inputs[1].mi.dwFlags = MOUSEEVENTF_LEFTUP;
UINT usend = SendInput(2, inputs, sizeof(INPUT));
if (usend != 2)
{
    TRACE(L"SendInput failed: 0x%x\n", HRESULT_FROM_WIN32(GetLastError()));
}
TRACE(_T("SendInput111:   %d\n"), usend);

执行失败。

INPUT inputs[2] = { {0},{0} };
inputs[0].type = INPUT_MOUSE;
inputs[0].mi.dwFlags = MOUSEEVENTF_LEFTDOWN;
inputs[1].type = INPUT_MOUSE;
inputs[1].mi.dwFlags = MOUSEEVENTF_LEFTUP;
UINT usend = SendInput(1, inputs, sizeof(INPUT));
if (usend != 1)
{
    TRACE(L"SendInput failed: 0x%x\n", HRESULT_FROM_WIN32(GetLastError()));
}
TRACE(_T("SendInput111:   %d\n"), usend);

usend = SendInput(1, &inputs[1], sizeof(INPUT));
if (usend != 1)
{
    TRACE(L"SendInput failed: 0x%x\n", HRESULT_FROM_WIN32(GetLastError()));
}
TRACE(_T("SendInput222:   %d\n"), usend);

执行成功。

按照后面的情况,将前面绝对坐标修改为分单次运行后,也执行成功了。

这个现象没弄明白,按照定义和网上别人的例程是可以执行多次的。。。

如果哪位大神明白,希望不吝赐教~~感谢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值