是否可以模拟进程上的 Click
而无需实际单击它?
例如我想在鼠标静止不动的情况下在正在运行的计算器上单击
。这可能吗?
最佳答案
如果您只是尝试在一个相当典型的标签、字段和按钮应用程序中单击一个按钮,您可以使用一些 P/Invoke 来使用 FindWindow
和 SendMessage
到控件。
如果您还不熟悉 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 应用程序作为我的目标。一个按钮和一些用于增加计数器的代码。
当您运行 P/Invoke 控制台应用程序时,您应该会看到计数器递增。但是,您将不会看到按钮动画。
您还可以使用 Spy++ Message Logger 函数。我向 BM_CLICK 和 WM_LBUTTONDOWN/WM_LBUTTONUP 推荐一个过滤器(手动点击会给你什么)。
希望对您有所帮助!
关于windows - 模拟点击而不点击,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11689662/