【问题标题】:How to simulate left mouse click on low level so that Microsoft virtual keyboard accept it?如何在低级模拟鼠标左键点击让微软虚拟键盘接受呢?
【发布时间】:2015-02-07 05:52:46
【问题描述】:

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

但是 Java 可以防止这种自动化。它可以防止使用 AutoIt 填充数据。由于这种保护,有时数据无法正确填写到 Java 表单中,因此自动化过程是不可能的。

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

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

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

我还阅读了 C++ 中的 keydown 和 keyrelease 事件,但我担心虚拟键盘可能有针对它的保护。我也不知道如何编写正确的 C++ 代码来使用 keydown 和 keyrelease 生成鼠标点击。

编辑

#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
    }
}

【问题讨论】:

  • 只是好奇,因为您同时提到了 autoit 和 java。你试过IUIAutomation吗?

标签: c# c++ driver


【解决方案1】:
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

【讨论】:

  • asqapro,谢谢你的回答。我真的很感谢你的帮助。但是您可以查看我在问题的编辑部分发布的代码吗?这是我的第一个 C++ 程序,很难正确地做到这一点。目前构建失败并出现错误:'WinMain':函数无法重载,本地函数定义非法,IntelliSense:预期为';'
  • 如果有人能快速回答我写的代码有什么问题,我将不胜感激。今天是星期六,我们打算今天进行维护,因为这对我们来说非常方便。
  • 您使用的是什么 IDE/编译器? int main(){} 应该可以工作。
猜你喜欢
  • 2013-10-22
  • 2014-02-13
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-11
相关资源
最近更新 更多