windows - 模拟点击而不点击

标签 windows winapi click mouse

是否可以模拟进程上的 Click 而无需实际单击它?

例如我想在鼠标静止不动的情况下在正在运行的计算器上单击。这可能吗?

最佳答案

如果您只是尝试在一个相当典型的标签、字段和按钮应用程序中单击一个按钮,您可以使用一些 P/Invoke 来使用 FindWindowSendMessage 到控件。

如果您还不熟悉 Spy++,现在是时候开始了!

它与 Visual Studio 2012 RC 一起打包在:C:\Program Files\Microsoft Visual Studio 11.0\Common7\Tools。其他版本应该也有类似的发现。

尝试将其作为控制台 C# 应用程序:

class Program
{
    [DllImport("user32.dll", SetLastError = true)]
    static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

    [DllImport("user32.dll")]
    static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);

    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    public static extern IntPtr SendMessage(IntPtr hWnd, uint msg, int wParam, int lParam);

    private const uint BM_CLICK = 0x00F5;

    static void Main(string[] args)
    {
        // Get the handle of the window
        var windowHandle = FindWindow((string)null, "Form1");

        // Get button handle
        var buttonHandle = FindWindowEx(windowHandle, IntPtr.Zero, (string)null, "A Huge Button");

        // Send click to the button
        SendMessage(buttonHandle, BM_CLICK, 0, 0); 
    }
}

这将获取标题为“Form1”的窗口的句柄。使用该句柄,它获得窗口内按钮的句柄。然后向按钮控件发送一个没有有用参数的“BM_CLICK”类型的消息。

我使用了一个测试 WinForms 应用程序作为我的目标。一个按钮和一些用于增加计数器的代码。

A Test WinForms App

当您运行 P/Invoke 控制台应用程序时,您应该会看到计数器递增。但是,您将不会看到按钮动画。

您还可以使用 Spy++ Message Logger 函数。我向 BM_CLICK 和 WM_LBUTTONDOWN/WM_LBUTTONUP 推荐一个过滤器(手动点击会给你什么)。

希望对您有所帮助!

关于windows - 模拟点击而不点击,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11689662/

相关文章:

c++ - 如何正确取消初始化 OpenSSL

c# - 通过 Teamviewer 连接时 WPF 应用程序崩溃

c++ - 减少线程或进程的 CPU 使用率

c++ - Windows API : Unicode variable metamorphasis

jquery - 使用单击功能禁用 jquery 悬停功能

c# - 以编程方式更改屏幕色彩平衡

windows - 将文件夹移动到自己的第一个字母目录中

c++ - 使用 Module32First 获取模块的 modBaseAddr 不返回任何内容

java - 我们可以判断鼠标是否真的点击了 Java 中的复选框吗?

javascript - 如何使用 JQuery 以编程方式单击文本输入?