5

是否可以Click在不实际单击的情况下模拟一个过程?

例如,我想Click在鼠标静止的情况下运行计算器。这可能吗?

4

1 回答 1

9

如果您只是想在一个相当典型的标签、字段和按钮应用程序中单击一个按钮,您可以使用一点 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”的窗口的句柄。使用该句柄,它可以获取 Window 中 Button 的句柄。然后向按钮控件发送一条没有有用参数的“BM_CLICK”类型的消息。

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

一个测试 WinForms 应用程序

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

您还可以使用 Spy++ 消息记录器功能。我向 BM_CLICK 和 WM_LBUTTONDOWN/WM_LBUTTONUP 推荐一个过滤器(手动点击会给你什么)。

希望有帮助!

于 2012-07-27T15:55:53.353 回答