【问题标题】:Simulate a Click without clicking模拟点击而不点击
【发布时间】:2012-07-26 05:48:04
【问题描述】:

是否可以在不实际单击进程的情况下模拟Click

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

【问题讨论】:

  • 您希望使用哪种语言来执行此操作?您标记的 winapi 和 C、C++ 或 C# 都是有效的候选人。还有,你想点击什么?一个按钮?一个特定的坐标?
  • 没关系。它们中的任何一个都可以 :) 但我更喜欢 C#、C++ 和 Python。
  • @MBZ 好吧,最好在这里检查一下:stackoverflow.com/questions/2416748/…
  • 使用自动化界面。这就是他们的目的。

标签: windows winapi click mouse


【解决方案1】:

如果您只是想在一个相当典型的标签、字段和按钮应用程序中单击一个按钮,您可以使用一点 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 应用程序作为我的目标。一个按钮和一些后面的代码来增加一个计数器。

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

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

希望有帮助!

【讨论】:

    猜你喜欢
    • 2011-04-12
    • 2021-01-04
    • 2018-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多