1

同時に複数のマウス クリックを実行できるようにする必要があるマルチスレッド アプリケーションがあります。

マウスクリックを送信する必要がIntPtr intptrあるプロセスがあります。私はウェブでこの情報を見つけようとしましたが、私が試したいくつかの例があります. しかし、私はそれらのどれも機能させていません。

私の問題を解決する正しい方法は、関数を使用することです SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam);

hWnd は、プロセスへの IntPtr です。Msg は、左クリックが必要なアクションですint WM_LBUTTONDBLCLK = 0x0203; 。IntPtr wParam は、この問題には関係ありません (私が理解しているように)。lParam を次のように構築します。

Int32 word = MakeLParam(x, y);

private int MakeLParam(int LoWord, int HiWord)
     {
         return ((HiWord << 16) | (LoWord & 0xffff));
     }

しかし、あなたが理解しているように、私はこれを機能させることができません。私の最初の質問は、座標はこのプロセスのウィンドウ内にありますか、それとも絶対スクリーン座標ですか? そして私の2番目の質問は、私は何を間違っていますか?

4

5 に答える 5

3

つい最近、C# でマウス クリックをシミュレートしようとしましたが、この小さなヘルパー クラスを作成してそのトリックを実行しました。

public static class SimInput
{
    [DllImport("user32.dll")]
    static extern void mouse_event(uint dwFlags, uint dx, uint dy, uint dwData, UIntPtr dwExtraInfo);

    [Flags]
    public enum MouseEventFlags : uint
    {
        Move = 0x0001,
        LeftDown = 0x0002,
        LeftUp = 0x0004,
        RightDown = 0x0008,
        RightUp = 0x0010,
        MiddleDown = 0x0020,
        MiddleUp = 0x0040,
        Absolute = 0x8000
    }

    public static void MouseEvent(MouseEventFlags e, uint x, uint y)
    {
        mouse_event((uint)e, x, y, 0, UIntPtr.Zero);
    }

    public static void LeftClick(Point p)
    {
        LeftClick((double)p.X, (double)p.Y);
    }

    public static void LeftClick(double x, double y)
    {
        var scr = Screen.PrimaryScreen.Bounds;
        MouseEvent(MouseEventFlags.LeftDown | MouseEventFlags.LeftUp | MouseEventFlags.Move | MouseEventFlags.Absolute,
            (uint)Math.Round(x / scr.Width * 65535),
            (uint)Math.Round(y / scr.Height * 65535));
    }

    public static void LeftClick(int x, int y)
    {
        LeftClick((double)x, (double)y);
    }
}

座標は 65535 の分数で、少し奇妙ですが、このクラスはそれを処理します。

于 2012-05-18T22:54:44.613 に答える
0

このコードを使用して、ハンドルの左ボタンをクリックしました

public static void MouseLeftClick(Point p, int handle = 0)
{
    //build coordinates
    int coordinates = p.X | (p.Y << 16);
    //send left button down
    SendMessage(handle, 0x201, 0x1, coordinates);
    //send left button up
    SendMessage(handle, 0x202, 0x1, coordinates);
}

呼び出しでハンドルを設定しない場合は、クリックがデスクトップに送信されるため、座標は画面全体である必要があります。ハンドルを設定すると、ハンドルのウィンドウにメッセージが送信され、ウィンドウの座標を設定する必要があります。

于 2012-05-18T22:49:19.440 に答える
0

複数のマウスクリックを同時に送信したい理由がわかりません。GUI をテストするのであれば、それは間違ったテストです。同じ時間空間で何かを物理的に複数回クリックすることはできません。

しかし、質問に戻ると、SendMessage を使用しても役に立ちません。これは基本的にブロッキング コールであるためです。PostMessage を使用しようとしても、同時にクリックすることはできません。これは、メッセージ キューが UI スレッドからポンプされ、メッセージがポップされて順次処理されるためです。

于 2012-05-18T22:42:33.667 に答える
0

あなたが達成しようとしていることを 100% 理解しているとは言えません。ただし、マウス入力をシミュレートする場合は、SendInput API を使用することをお勧めします。

入力ストリームに挿入する入力の配列を指定できます。

参照: PInvoke リファレンス

于 2012-05-18T22:24:41.257 に答える