1

Windowsで動作する簡単なアプリケーションがあります。それは非常にシンプルなインターフェースを持っています:固定座標のボタンを備えたsqureウィンドウ。

このアプリケーションを利用するプログラムを作成する必要があります。それを起動し、ボタンの1つをクリックします(たとえば、(150,200)でクリックを呼び出します)。

Javaまたは.NETでそれを行う方法はありますか?

4

6 に答える 6

3

Javaベースのソリューションは、アプリを起動することです。で、Processを使用しRobotて対話します。

このスレッドでの最善の解決策は@HFoEによるものでしたが、モデレーターによって削除されました。参考までに、基本的には..

別のWindowsアプリケーションを制御する場合は、AutoItV3などのこのために特別に構築されたツールを使用してください。

(メタの一般的な意見では)代替案が提供された場合、「やらない」は有効な回答と見なされるため、回答が削除された理由がわかりません。

于 2012-08-01T12:53:51.287 に答える
2

可能であれば、Hovercraft Full Of Eelsとして、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てプロセスを開始します(これを行う方法については、Web上にたくさんのリソースがあります。
  2. プロセスが開始するまで待ちます(おそらく十分な長さになるであろう一定の時間待つか、IPCや作成されているウィンドウの監視などの凝ったことを試してみることができます)
  3. クリックをシミュレートするには、C#でマウスクリックをシミュレートする方法をご覧ください。これは、 mouse_event関数へのP/Invoke呼び出しを使用します。

ただし、これでうまくいかないことがいくつかあることに注意してください

  • アプリケーションの起動にかかる時間内に、誰かがウィンドウを移動したり、そのウィンドウの上に別のウィンドウを配置したりする可能性があります
  • 低速のPCでは、アプリケーションのロードに時間がかかる場合があります(このリスクは、開いているウィンドウを監視したり、期待されるアプリケーションウィンドウが表示されるのを待つなどの方法で軽減できます)。
于 2012-08-01T12:18:38.490 に答える
1

.netでは、System.DiagnosticsからProcess.Startを実行してアプリケーションを起動したり、パラメーターを渡したり、P/Invokeを使用してマウスイベントをシミュレートしたりできます。SOにはすでにその答えがあります。

于 2012-08-01T12:19:17.200 に答える
0

これが、ウィンドウをクリックして遊ぶための私の動作するテストアプリです。アプリを起動して、適切な場所でクリックすることを望んでいます)この方法でウィンドウをキャプチャするためのソリューションがあると便利です=)

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 に答える