2012-07-27 174 views
3

是否可以在没有实际点击的情况下模拟Click模拟点击不点击

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

+0

你想要做什么语言?你标签winapi和C,C++或C#都是有效的候选人。另外,你想要点击什么?一个按钮?一个特定的坐标? – rrhartjr 2012-07-27 14:19:17

+0

没关系。他们中的任何一个都OK :) 但我更喜欢C#,C++和Python。 – MBZ 2012-07-27 14:20:03

+0

@MBZ那么,最好在这里检查一下:http://stackoverflow.com/questions/2416748/how-to-simulate-mouse-click-in-c – 2012-07-27 14:46:27

回答

8

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

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

A Test WinForms App

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

你也可以使用Spy ++ Message Logger功能。我建议过滤器BM_CLICK,也许WM_LBUTTONDOWN/WM_LBUTTONUP(手动点击会给你什么)。

希望有帮助!