web-dev-qa-db-ja.com

プログラムによるマウスカーソルの移動

開始するには、このコードを http://swigartconsulting.blogs.com/tech_blender/2005/08/how_to_move_the.html で見つけました:

public class Win32
{
    [DllImport("User32.Dll")]
    public static extern long SetCursorPos(int x, int y);

    [DllImport("User32.Dll")]
    public static extern bool ClientToScreen(IntPtr hWnd, ref POINT point);

    [StructLayout(LayoutKind.Sequential)]
    public struct POINT
    {
        public int x;
        public int y;
    }
}

ボタンのクリックイベントハンドラーに次のコードを貼り付けます。

Win32.POINT p = new Win32.POINT();
p.x = button1.Left + (button1.Width / 2);
p.y = button1.Top + (button1.Height / 2);

Win32.ClientToScreen(this.Handle, ref p);
Win32.SetCursorPos(p.x, p.y);

これにより、マウスポインターがボタンの中央に移動します。

このコードはうまく機能しますが、少し拡張する方法がわからないようです。ドロップダウンリストボックスを含むWebページ(事前に知らないランダムなページ)に対してInternet Explorer(Windowsフォームに埋め込まれている)を開いているとします。上記のコードを変更して、カーソルを移動し、リストボックスをドロップダウンし(以下に示すマウスクリック方法を使用してリストをドロップダウンします)、リストを上下に移動して、各アイテムをマウスポインターとして強調表示します。行きますが、私の一生の間、現在選択されているアイテムを実際にマウスクリックして選択を維持する方法がわかりません。私のやり方では、ドロップダウンリストボックスが閉じるだけで、選択は変更されません。マウスクリックに次のコードを使用しています(リストをドロップダウンします)。

private static void MouseClick(int x, int y, IntPtr handle) //handle for the browser window
{
    IntPtr lParam = (IntPtr)((y << 16) | x); // The coordinates
    IntPtr wParam = IntPtr.Zero; // Additional parameters for the click (e.g. Ctrl)

    const uint downCode = 0x201; // Left click down code
    const uint upCode = 0x202; // Left click up code

    SendMessage(handle, downCode, wParam, lParam); // Mouse button down
    SendMessage(handle, upCode, wParam, lParam); // Mouse button up
}

私はここで単純な何かを見逃していると確信していますが、私の人生ではそれが何であるかを理解することはできません。よろしくお願いします。

ボブ

22
Beaker

SendMessagesを直接使用する代わりに、SendInput( http://msdn.Microsoft.com/en-us/library/ms646310(VS.85).aspx )を使用してマウスクリックイベントを合成する必要があります。

16
Michael

WM_LBUTTONDOWNメッセージの正しいWPARAMが不足していると思います。左ボタンの場合はMK_LBUTTONです。

 #define MK_LBUTTON          0x0001
3
arul