有一个可以在 Windows 中运行的简单应用程序。它具有非常简单的界面:带有固定坐标按钮的方形窗口。
我需要编写一个使用此应用程序的程序:启动它并单击其中一个按钮(假设在 (150,200) 处调用单击)。
有没有办法在 Java 或 .NET 中做到这一点?
有一个可以在 Windows 中运行的简单应用程序。它具有非常简单的界面:带有固定坐标按钮的方形窗口。
我需要编写一个使用此应用程序的程序:启动它并单击其中一个按钮(假设在 (150,200) 处调用单击)。
有没有办法在 Java 或 .NET 中做到这一点?
如果可以的话,作为充满鳗鱼的气垫船 - 使用 autoit - 它会容易得多。如果 AutoIt 不是一个选项,那么您将需要使用 winAPI 函数来执行此操作。
例如在坐标处调用 mouseclick:
[DllImport("user32.dll")]
static extern bool SetCursorPos(int x, int y);
[DllImport("user32.dll")]
static extern bool GetCursorPos(ref Point lpPoint);
[DllImport("user32.dll")]
public static extern void mouse_event(int dwFlags, int dx, int dy, int cButtons, int dwExtraInfo);
public void LeftMouseClick(int xpos, int ypos) //Make a click at specified coords and return mouse back
{
Point retPoint = new Point();
GetCursorPos(ref retPoint); // set retPoint as mouse current coords
SetCursorPos(xpos, ypos); //set mouse cursor position
mouse_event(MOUSEEVENTF_LEFTDOWN, xpos, ypos, 0, 0);
mouse_event(MOUSEEVENTF_LEFTUP, xpos, ypos, 0, 0); //click made
SetCursorPos(retPoint.X, retPoint.Y); //return mouse position to coords
}
但请注意,要在窗口内进行点击,它必须在您的面前 - 例如,您不能点击最小化的应用程序。
如果您想尝试 - 您可以在PInvoke找到所有需要的功能(如何运行程序、通过 hwnd 获取所需的窗口等)
对于 .Net,您几乎可以使用我更喜欢的AutomationElement 。有一点学习时间,但应该不会花太多时间。您可以使用ProcessStartInfo启动您的应用程序。
如果你有 VS2010 Pro 或 Ultimate,你可以使用 CodedUITests 来生成几个按钮。
正如@Hovercraft Full Of Eels 所建议的那样——Autoit,Python 也可以这样做
是的 - 在 C# 中...
Process
类来开始这个过程(网上有很多关于如何做到这一点的资源。但是请注意,有几件事可能会出错
在.net中,您可以从 System.Diagnostics Process.Start启动应用程序,甚至可以传递参数,并模拟鼠标事件,您可以使用 P/Invoke 在SO here上已经有一个答案
这是我的工作测试应用程序,可以在 Windows 中单击。我们只是启动了一些应用程序并希望在正确的位置单击它)如果有一些以这种方式捕获窗口的解决方案会很好=)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Threading;
namespace ConsoleApplication8
{
class Program
{
static void Main(string[] args)
{
var startInfo = new ProcessStartInfo(@"C:\Users\Bodia\Documents\visual studio 2010\Projects\ConsoleApplication8\WindowsFormsApplication1\bin\Debug\WindowsFormsApplication1.exe");
startInfo.WindowStyle = ProcessWindowStyle.Maximized;
Console.WriteLine(1);
var process = Process.Start(startInfo);
Console.WriteLine(2);
Thread.Sleep(400);
Console.WriteLine(3);
LeftMouseClick(1000, 200);
Console.WriteLine(4);
}
static void CursorFun()
{
Point cursorPos = new Point();
GetCursorPos(ref cursorPos);
cursorPos.X += 100;
Thread.Sleep(1000);
SetCursorPos(cursorPos.X, cursorPos.Y);
cursorPos.X += 100;
Thread.Sleep(1000);
SetCursorPos(cursorPos.X, cursorPos.Y);
cursorPos.X += 100;
Thread.Sleep(1000);
SetCursorPos(cursorPos.X, cursorPos.Y);
cursorPos.X += 100;
Thread.Sleep(1000);
SetCursorPos(cursorPos.X, cursorPos.Y);
}
[DllImport("user32.dll")]
static extern bool SetCursorPos(int x, int y);
[DllImport("user32.dll")]
static extern bool GetCursorPos(ref Point lpPoint);
[DllImport("user32.dll")]
public static extern void mouse_event(int dwFlags, int dx, int dy, int cButtons, int dwExtraInfo);
public static void LeftMouseClick(int xpos, int ypos) //Make a click at specified coords and return mouse back
{
Point retPoint = new Point();
GetCursorPos(ref retPoint); // set retPoint as mouse current coords
SetCursorPos(xpos, ypos); //set mouse cursor position
mouse_event(MOUSEEVENTF_LEFTDOWN, xpos, ypos, 0, 0);
mouse_event(MOUSEEVENTF_LEFTUP, xpos, ypos, 0, 0); //click made
SetCursorPos(retPoint.X, retPoint.Y); //return mouse position to coords
}
struct Point
{
public int X;
public int Y;
}
private const int MOUSEEVENTF_LEFTDOWN = 0x02;
private const int MOUSEEVENTF_LEFTUP = 0x04;
private const int MOUSEEVENTF_RIGHTDOWN = 0x08;
private const int MOUSEEVENTF_RIGHTUP = 0x10;
}
}