如何以编程方式(C#或Java)在Windows中启动一个应用程序,并在它的窗口调用点击?(How

2019-07-30 17:53发布

还有的是,在Windows上运行一个简单的应用程序。 这是一个非常简单的界面:在固定坐标按钮squre窗口。

我需要编写一个程序,利用该应用程序的:启动它,并点击一个按钮(假设调用在点击(150,200))。

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

Answer 1:

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

在此线程最好的解决办法是通过@HFoE而是由主持人删除。 作为参考,它基本上来到了..

如果你想控制另一个Windows应用程序,使用为这个功能,比如专门建立了一个工具AutoIt的V3 。

由于“不要做”似乎被认为是当另一种方法是提供了一个有效的答案(由上元的一般意见),我不明白为什么答案被删除。



Answer 2:

由于气垫船全鳝,如果你能 - 使用了AutoIt - 这是容易得多。 如果AutoIt的是不是一种选择,那么你将需要为了做它用WINAPI功能。

例如调用鼠标点击坐标:

[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
}

但要知道,这使点击它需要在你的面前窗口中 - 你不能单击以例如最小化的应用程序。

如果你想尝试-你可以找到所有需要的功能(如何运行PROGRAMM,通过HWND获取所需窗等) 的PInvoke



Answer 3:

对于.NET,你几乎可以使用AutomationElement ,我喜欢。 有一点学习时间,但它不应该花费太多。 你可以与你的应用程序的ProcessStartInfo 。

如果你有VS2010专业版或旗舰版则可以使用CodedUITests产生几个按钮推动的。

作为@Hovercraft充满鳗鱼建议 - AutoIt的,巨蟒可以做同样的



Answer 4:

是的 - 在C#...

  1. 使用Process类启动进程(也有丰富的资源如何做到这一点在网络上。
  2. 等到进程已经启动(或只是等待它可能将是足够长的时间,固定金额,或者你可以尝试做类似的东西IPC幻想或监测建立窗口)
  3. 为了模拟点击看看如何模拟鼠标点击在C#中? 它采用了P /调用调用mouse_event功能。

但是请注意,有几件事情可以出错,这

  • 有人可能会移动窗口,或者将另外一个窗口对窗口中所花费的时间来启动应用程序的顶部
  • 在较慢的PC可能需要更长的时间来加载应用程序(这种风险可以通过做这样的事情监视打开的窗口,并等待预期的应用程序窗口出现减轻)


Answer 5:

在.NET中,你可以的Process.Start从System.Diagnostics程序启动应用程序,你甚至可以传递参数,并模拟鼠标事件,你可以使用的P / Invoke已经有一个答案,关于所以这里



Answer 6:

这是我的工作测试应用程序与点击窗口播放。 我们刚开始的一些应用程序,并希望双击它,在正确的地方),这将是不错的捕捉窗这样一些解决方案=)

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;
    }
}


文章来源: How to programmatically (C# or Java) launch an app in Windows and invoke click in it's window?