C++ 使用SendInput API模拟鼠标单击时是否需要引入延迟?
我需要能够在另一个进程中模拟鼠标单击控件。我想出了以下方法:C++ 使用SendInput API模拟鼠标单击时是否需要引入延迟?,c++,windows,winapi,sendinput,C++,Windows,Winapi,Sendinput,我需要能够在另一个进程中模拟鼠标单击控件。我想出了以下方法: BOOL SimulateMouseClick(POINT* pPntAt) { //Simulate mouse left-click //'pPntAt' = mouse coordinate on the screen //RETURN: // = TRUE if success BOOL bRes = FALSE; if(pPntAt) { /
BOOL SimulateMouseClick(POINT* pPntAt)
{
//Simulate mouse left-click
//'pPntAt' = mouse coordinate on the screen
//RETURN:
// = TRUE if success
BOOL bRes = FALSE;
if(pPntAt)
{
//Get current mouse position
POINT pntMouse = {0};
BOOL bGotPntMouse = ::GetCursorPos(&pntMouse);
//Move mouse to a new position
::SetCursorPos(pPntAt->x, pPntAt->y);
//Send mouse click simulation
INPUT inp = {0};
inp.type = INPUT_MOUSE;
inp.mi.dx = pPntAt->x;
inp.mi.dy = pPntAt->y;
inp.mi.dwFlags = MOUSEEVENTF_LEFTDOWN;
if(SendInput(1, &inp, sizeof(inp)) == 1)
{
//Do I need to wait here?
Sleep(100);
inp.mi.dwFlags = MOUSEEVENTF_LEFTUP;
if(SendInput(1, &inp, sizeof(inp)) == 1)
{
//Do I need to wait here before restoring mouse pos?
Sleep(500);
//Done
bRes = TRUE;
}
}
//Restore mouse
if(bGotPntMouse)
{
::SetCursorPos(pntMouse.x, pntMouse.y);
}
}
return bRes;
}
我的问题是,我是否需要像人类鼠标点击一样引入这些人为延迟?的文档包含以下内容:
SendInput函数将结构中的事件顺序插入键盘或鼠标输入流。这些事件不会与用户(使用键盘或鼠标)插入的其他键盘或鼠标输入事件、对的调用或对发送输入的其他调用插入的其他键盘或鼠标输入事件混杂在一起
这就是引入SendInput
的原因。在SendInput
的单独调用之间设置人为延迟完全违背了其目的
简单的回答是:不,不需要在合成输入之间引入延迟。您也不需要调用SetCursorPos
;输入
结构已包含鼠标输入的位置
当然,如果你去的话,你不需要处理这些问题。UI自动化的设计目标是“通过标准输入以外的方式操作UI。UI自动化还允许自动化测试脚本与UI交互。”的文档包含以下内容:
SendInput函数将结构中的事件顺序插入键盘或鼠标输入流。这些事件不会与用户(使用键盘或鼠标)插入的其他键盘或鼠标输入事件、对的调用或对发送输入的其他调用插入的其他键盘或鼠标输入事件混杂在一起
这就是引入SendInput
的原因。在SendInput
的单独调用之间设置人为延迟完全违背了其目的
简单的回答是:不,不需要在合成输入之间引入延迟。您也不需要调用SetCursorPos
;输入
结构已包含鼠标输入的位置
当然,如果你去的话,你不需要处理这些问题。UI自动化的一个设计目标是“通过标准输入以外的方式操作UI。UI自动化还允许自动测试脚本与UI交互。”从2020年起(Windows 10),在调用SetCursorPos和SendInput之间等待似乎很重要。有时,在更新光标位置之前,通过SendInput执行鼠标下键。(当然,如果您根本不使用SetCursorPos,那么您是安全的)(^这至少适用于移动窗口,即通过标题栏拖动窗口)@eik不清楚为什么您会发现需要混合使用
SetCursorPos
和SendInput
。后者允许您已经指定鼠标位置。同样不清楚的是,为什么您会发现需要通过注入输入来移动窗口。当然,你的观察可能是真的。但是,如果你做错了,各种各样的错误都可能发生。我现在正在通过Windows远程桌面工作(Corona)。也许这就是为什么我观察到如此奇怪的事情。(本地鼠标光标必须与远程鼠标光标同步)如果没有远程鼠标光标,事情可能会像您预期的那样井然有序。所以,也许,忘了我写的吧。@eik你观察到“奇怪的事情”,因为你的期望值太低了。对于来自SetCursorPos
和SendInput
的顺序输入,没有保证顺序。无论如何,没有人会需要这种保证SendInput
允许您执行SetCursorPos
所做的一切。现在还不清楚,当SendInput
足以满足所有目的时,为什么要坚持混合使用这两个API调用。从2020年开始(Windows 10),在调用SetCursorPos和SendInput之间等待似乎很重要。有时,在更新光标位置之前,通过SendInput执行鼠标下键。(当然,如果您根本不使用SetCursorPos,那么您是安全的)(^这至少适用于移动窗口,即通过标题栏拖动窗口)@eik不清楚为什么您会发现需要混合使用SetCursorPos
和SendInput
。后者允许您已经指定鼠标位置。同样不清楚的是,为什么您会发现需要通过注入输入来移动窗口。当然,你的观察可能是真的。但是,如果你做错了,各种各样的错误都可能发生。我现在正在通过Windows远程桌面工作(Corona)。也许这就是为什么我观察到如此奇怪的事情。(本地鼠标光标必须与远程鼠标光标同步)如果没有远程鼠标光标,事情可能会像您预期的那样井然有序。所以,也许,忘了我写的吧。@eik你观察到“奇怪的事情”,因为你的期望值太低了。对于来自SetCursorPos
和SendInput
的顺序输入,没有保证顺序。无论如何,没有人会需要这种保证SendInput
允许您执行SetCursorPos
所做的一切。现在仍然非常不清楚,当SendInput
满足所有意图和目的时,为什么要坚持混合使用这两个API调用。