1

有一个可以在 Windows 中运行的简单应用程序。它具有非常简单的界面:带有固定坐标按钮的方形窗口。

我需要编写一个使用此应用程序的程序:启动它并单击其中一个按钮(假设在 (150,200) 处调用单击)。

有没有办法在 Java 或 .NET 中做到这一点?

4

6 回答 6

3

基于 Java 的解决方案是启动应用程序。在 a 中Process并使用Robot与它进行交互。

此线程上的最佳解决方案是 @HFoE,但已被版主删除。作为参考,它基本上归结为..

如果您想控制另一个 Windows 应用程序,请使用专门为此构建的工具,例如AutoIt V3

由于在提供替代方案时“不要这样做”似乎被认为是一个有效的答案(根据 Meta 的一般意见),我不明白为什么删除了答案。

于 2012-08-01T12:53:51.287 回答
2

如果可以的话,作为充满鳗鱼的气垫船 - 使用 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 获取所需的窗口等)

于 2012-08-01T12:29:20.643 回答
1

对于 .Net,您几乎可以使用我更喜欢的AutomationElement 。有一点学习时间,但应该不会花太多时间。您可以使用ProcessStartInfo启动您的应用程序。

如果你有 VS2010 Pro 或 Ultimate,你可以使用 CodedUITests 来生成几个按钮。

正如@Hovercraft Full Of Eels 所建议的那样——Autoit,Python 也可以这样做

于 2012-08-01T12:16:57.780 回答
1

是的 - 在 C# 中...

  1. 使用Process类来开始这个过程(网上有很多关于如何做到这一点的资源。
  2. 等到进程开始(或者只是等待一段可能足够长的固定时间,或者你可以尝试做一些花哨的事情,比如 IPC 或监视正在创建的窗口)
  3. 要模拟单击,请查看如何在 C# 中模拟鼠标单击?它使用对mouse_event函数的 P/Invoke 调用。

但是请注意,有几件事可能会出错

  • 有人可能会移动窗口,或者在启动应用程序时在该窗口顶部放置另一个窗口
  • 在较慢的 PC 上,加载应用程序可能需要更长的时间(可以通过监视打开的窗口和等待预期的应用程序窗口出现等操作来减轻这种风险)
于 2012-08-01T12:18:38.490 回答
1

在.net中,您可以从 System.Diagnostics Process.Start启动应用程序,甚至可以传递参数,并模拟鼠标事件,您可以使用 P/Invoke 在SO here上已经有一个答案

于 2012-08-01T12:19:17.200 回答
0

这是我的工作测试应用程序,可以在 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;
    }
}
于 2012-08-01T13:24:28.790 回答