0

Click機能しません-理由がわからず、解決策が見つかりません:(

すなわち。Click(150,215)マウスをクライアント領域に移動し、そこでクリックする必要があります。

    [DllImport("user32.dll")]
    private static extern bool ScreenToClient(IntPtr hWnd, ref Point lpPoint);

    [DllImport("user32", SetLastError = true)]
    private static extern int SetCursorPos(int x, int y);

    static void MouseMove(int x, int y)
    {
        Point p = new Point(x * -1, y * -1);
        ScreenToClient(hWnd, ref p);
        p = new Point(p.X * -1, p.Y * -1);
        SetCursorPos(p.X, p.Y);
    }

    static void Click(int x, int y)
    {
        MouseMove(x, y);
        SendMessage(hWnd, WM_LBUTTONDOWN, (IntPtr)0x1, new IntPtr(y * 0x10000 + x));
        SendMessage(hWnd, WM_LBUTTONUP, (IntPtr)0x1, new IntPtr(y * 0x10000 + x));
    }

編集: 次の方法は機能していますが、「より高度な」と言えます。

もちろん、私はそれを使用できますmouse_eventが、SendMessage() の解決策を見たいと思います...

    [DllImport("user32.dll")]
    static extern void mouse_event(int dwFlags, int dx, int dy, int dwData, int dwExtraInfo);

    const int LEFTDOWN = 0x00000002;
    const int LEFTUP = 0x00000004;

    static void Click(int x, int y)
    {
        MouseMove(x, y);
        mouse_event((int)(LEFTDOWN), 0, 0, 0, 0);
        mouse_event((int)(LEFTUP), 0, 0, 0, 0);
    }

しばらくして、MouseInputbyを使った別の方法を見つけましSendInputたが、非常に長いです:P

縮むことはできますか?

        [Flags]
    enum MouseEventFlags : uint
    {
        MOUSEEVENTF_MOVE = 0x0001,
        MOUSEEVENTF_LEFTDOWN = 0x0002,
        MOUSEEVENTF_LEFTUP = 0x0004,
        MOUSEEVENTF_RIGHTDOWN = 0x0008,
        MOUSEEVENTF_RIGHTUP = 0x0010,
        MOUSEEVENTF_MIDDLEDOWN = 0x0020,
        MOUSEEVENTF_MIDDLEUP = 0x0040,
        MOUSEEVENTF_XDOWN = 0x0080,
        MOUSEEVENTF_XUP = 0x0100,
        MOUSEEVENTF_WHEEL = 0x0800,
        MOUSEEVENTF_VIRTUALDESK = 0x4000,
        MOUSEEVENTF_ABSOLUTE = 0x8000
    }

    [DllImport("user32.dll", SetLastError = true)]
    static extern uint SendInput(uint nInputs, ref INPUT pInputs, int cbSize);

    [StructLayout(LayoutKind.Explicit)]
    struct MouseKeybdhardwareInputUnion
    {
        [FieldOffset(0)]
        public MouseInputData mi;
    }
    struct MouseInputData
    {
        public int dx;
        public int dy;
        public uint mouseData;
        public MouseEventFlags dwFlags;
        public uint time;
        public IntPtr dwExtraInfo;
    }
    [StructLayout(LayoutKind.Sequential)]
    struct INPUT
    {
        public SendInputEventType type;
        public MouseKeybdhardwareInputUnion mkhi;
    }
    enum SendInputEventType : int
    {
        InputMouse,
    }

    static void Click(int x, int y)
    {
        INPUT mouseInput = new INPUT();
        mouseInput.type = SendInputEventType.InputMouse;
        mouseInput.mkhi.mi.dx = x;
        mouseInput.mkhi.mi.dy = y;
        mouseInput.mkhi.mi.mouseData = 0;

        MouseMove(x, y);
        mouseInput.mkhi.mi.dwFlags = MouseEventFlags.MOUSEEVENTF_LEFTDOWN;
        SendInput(1, ref mouseInput, Marshal.SizeOf(new INPUT()));

        mouseInput.mkhi.mi.dwFlags = MouseEventFlags.MOUSEEVENTF_LEFTUP;
        SendInput(1, ref mouseInput, Marshal.SizeOf(new INPUT()));
    }
4

1 に答える 1

0

あなたが説明した正確な問題を調査したことはありませんが、あなたが説明したことを行うために設計された Windows API 呼び出しを確認することmouse_eventをお勧めします。SendInput

mouse_event呼び出しの古いバージョンであり、新しいバージョンであり、複数の入力イベントをサポートすることSendInputで置き換えられます。mouse_inputどちらの方法も、P/Invoke.net の次の URL で利用できます。

于 2012-11-25T05:00:40.580 に答える