Щелчок мышью путем отправки сообщений

Я пытаюсь отправить щелчки мышью в программу. Поскольку я не хочу, чтобы мышь переместилась, я не хочу использовать SendInput или mouse_event, и потому что окно, которое должно получить щелчки, действительно не использует Кнопки или другие события GUI, я не могу отправить сообщения в эти кнопки.

Я пытаюсь получить это использование работы SendMessage, но по некоторым причинам это не работает. Соответствующие нормы (в C#, но попробованном Java с jnative также), пробуя это на Vista

    [DllImport("user32.dll", CharSet=CharSet.Auto)]
    public static extern int SendMessage(IntPtr A_0, int A_1, int A_2,  int  A_3);

    static int WM_CLOSE = 0x10;
    static int WM_LBUTTONDOWN = 0x201;
    static int WM_LBUTTONUP = 0x202;

    public static void click(IntPtr hWnd, int x, int y)
    {
        SendMessage(hWnd, WM_LBUTTONDOWN, 1, ((x << 0x10) ^ y));
        SendMessage(hWnd, WM_LBUTTONUP, 0, ((x << 0x10) ^ y));
    }

    public static void close(IntPtr hWnd)
    {
        SendMessage(hWnd, WM_CLOSE, 0, 0);
    }

close хорошо работает, но click ничего не делает.

править: Найденный проблемой. Помимо глупой ошибки для замены координат X и Y, как предложено ниже, я не проверял, является ли дескриптор Окна, который получает щелчок, также корректным клиентским окном. Я теперь имею

        POINT p = new POINT(x, y);
        IntPtr hWnd = WindowFromPoint(p);

        RECT rct = new RECT();

        if (!GetWindowRect(hWnd, ref rct))
        {
            return;
        }

        int newx = x - rct.Left;
        int newy = y - rct.Top;
        SendMessage(hWnd, WM_LBUTTONDOWN, 1, newy * 65536 + newx);
        SendMessage(hWnd, WM_LBUTTONUP, 0, newy * 65536 + newx);

который работает прекрасный.

6
задан Frank Meulenaar 14 May 2010 в 08:06
поделиться

2 ответа

Проблема заключается в вашей упаковке координат x, y.

  1. y должно быть в старшем слове
  2. Вы должны использовать | (побитовое или) для объединения компонентов пары координат

У вас должно быть следующее

((y << 0x10) | x)
4
ответ дан 17 December 2019 в 07:01
поделиться

Вам нужно правильно упаковать координаты, как говорит Крис, также помните, что x и y - координаты клиента, вызовите ScreenToClient () для преобразования экранных координат.

0
ответ дан 17 December 2019 в 07:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: