如何在低级别上模拟鼠标左键,以便Microsoft虚拟键盘接受它?

时间:2015-02-07 05:52:47

标签: c# c++ autoit drivers

我的任务是自动化一些表单填写Web浏览器java应用程序。

但是Java可以防止这种自动化。它可以防止使用AutoIt填充数据。由于这种保护,有时数据无法以Java形式正确填充,因此无法实现自动化过程。

然后我尝试使用Microsoft虚拟键盘,它适用于Java表单。但它也有防止AutoIt的保护,当我尝试使用AutoIt在虚拟键盘上生成鼠标点击时,这不起作用。按键根本没有按下。

因此,我希望以某种方式编写一个只会生成单击鼠标的小exe文件,但是在硬件级别上。此文件应始终在后台运行,并且不要从活动窗口进行钢铁聚焦。这将允许我使用虚拟键盘来填充java表单。

我找到了http://glovepie.org/,但我找不到以编程方式调用鼠标左键的方法。我只能将一些键盘键重新映射到用GlovePIE点击鼠标。

我也读过C ++中的keydown和keyrelease事件但是我担心虚拟键盘可能会对它有所保护。另外,我不知道如何使用keydown和keyrelease编写适当的C ++代码来生成鼠标点击。

修改

#include <windows.h>
#include <Winuser.h>

int __stdcall WinMain(HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    LPTSTR    lpCmdLine,
    int       cmdShow)
{
    void click(){
        INPUT input = { 0 }; //INPUT structure
        // left down
        input.type = INPUT_MOUSE;
        input.mi.dwFlags = MOUSEEVENTF_LEFTDOWN; //left mouse button down
        SendInput(1, &input, sizeof(INPUT)); //call SendInput, pass in input to click

        Sleep(1);

        // left up
        ZeroMemory(&input, sizeof(INPUT)); //clear out input
        input.type = INPUT_MOUSE;
        input.mi.dwFlags = MOUSEEVENTF_LEFTUP; //left mouse button up
        SendInput(1, &input, sizeof(INPUT)); //call SendInput, pass in input to unclick
    }
}

1 个答案:

答案 0 :(得分:0)

void click(){
    INPUT input={0}; //INPUT structure
    // left down
    input.type = INPUT_MOUSE; 
    input.mi.dwFlags = MOUSEEVENTF_LEFTDOWN; //left mouse button down
    SendInput(1,&input,sizeof(INPUT)); //call SendInput, pass in input to click

    Sleep(1);

    // left up
    ZeroMemory(&input,sizeof(INPUT)); //clear out input
    input.type = INPUT_MOUSE; 
    input.mi.dwFlags = MOUSEEVENTF_LEFTUP; //left mouse button up
    SendInput(1,&input,sizeof(INPUT)); //call SendInput, pass in input to unclick
}

这是点击并释放鼠标左键的C ++ Windows API代码。这是您可能想要处理的最低级别。 SendInput上的MSDN文档也可能有用:https://msdn.microsoft.com/en-us/library/windows/desktop/ms646310%28v=vs.85%29.aspx