本次主要实验模拟左键点击的问题,模拟鼠标可以通过两种方式:一种是使用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);
执行成功。
按照后面的情况,将前面绝对坐标修改为分单次运行后,也执行成功了。
这个现象没弄明白,按照定义和网上别人的例程是可以执行多次的。。。
如果哪位大神明白,希望不吝赐教~~感谢。
1081

被折叠的 条评论
为什么被折叠?



