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调用。