5

Click実際にクリックせずにプロセスをシミュレートすることは可能ですか?

Clickたとえば、マウスを動かさずに電卓を動かしたい。これは可能ですか?

4

1 に答える 1

9

かなり典型的なラベル、フィールド、およびボタン アプリケーション内のボタンをクリックしようとしているだけの場合は、コントロールに対して少しの 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 アプリをターゲットとして使用しました。1 つのボタンと、カウンターをインクリメントするためのコード ビハインド。

テスト WinForms アプリ

P/Invoke コンソール アプリケーションを実行すると、カウンターの増分が表示されます。ただし、ボタンのアニメーションは表示されません。

Spy++ Message Logger 関数を使用することもできます。BM_CLICK と、おそらく WM_LBUTTONDOWN/WM_LBUTTONUP (手動でクリックすると得られるもの) へのフィルターをお勧めします。

それが役立つことを願っています!

于 2012-07-27T15:55:53.353 に答える