Что может привести к игнорированию щелчков мыши, отправленных PostMessage? - PullRequest
5 голосов
/ 28 августа 2011

Я искал способ отправки щелчков мыши в фоновое приложение в Windows (т. Е. По дескриптору). Тестовое окно, которое я использовал для подтверждения того, что мой код работал, принимает и обрабатывает щелчки, но мое целевое приложение - нет (даже если Spy ++ показывает сообщения).

Что может быть причиной этого?И есть ли обходной путь?

вот код C #, который я использую.

public enum WMessages : int
{
    WM_LBUTTONDOWN = 0x201,
    WM_LBUTTONUP = 0x202,

    WM_KEYDOWN = 0x100,
    WM_KEYUP = 0x101,

    WH_KEYBOARD_LL = 13,
    WH_MOUSE_LL = 14,
}

[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("user32.dll", SetLastError = true)]
private static extern int PostMessage(HandleRef hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam);

public void SendClick(WMessages type, Point pos)
{
    switch(type)
    {
        case WMessages.WM_LBUTTONDOWN:
            PostMessage(new HandleRef(null, this.process.MainWindowHandle),
                (UInt32)WMessages.WM_LBUTTONDOWN, (IntPtr)0x1,
                (IntPtr)((pos.Y << 16) | (pos.X & 0xFFFF)));
            return;
        case WMessages.WM_LBUTTONUP:
            PostMessage(new HandleRef(null, this.process.MainWindowHandle),
                (UInt32)WMessages.WM_LBUTTONDOWN, (IntPtr)0x1,
                (IntPtr)((pos.Y << 16) | (pos.X & 0xFFFF)));
            return;
        default:
            return;
    }
}

SendClick(WMessages.WM_LBUTTONDOWN, Cursor.Position);
SendClick(WMessages,WM_LBUTTONUP, Cursor.Position);

Можно ли этого достичь?Есть ли лучший способ добиться этого?

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

Спасибо

Ответы [ 2 ]

4 голосов
/ 21 января 2014
     public void SendClick(WMessages type, Point pos)
{
    switch(type)
    {
        case WMessages.WM_LBUTTONDOWN:
            PostMessage(new HandleRef(null, this.process.MainWindowHandle),
                (UInt32)WMessages.WM_LBUTTONDOWN, (IntPtr)0x1,
                (IntPtr)((pos.Y << 16) | (pos.X & 0xFFFF)));
            return;
        case WMessages.WM_LBUTTONUP:
            PostMessage(new HandleRef(null, this.process.MainWindowHandle),
                (UInt32)WMessages.WM_LBUTTONDOWN, (IntPtr)0x1, // <--(2) but you are telling to do WM_LBUTTONDOWN
                (IntPtr)((pos.Y << 16) | (pos.X & 0xFFFF)));
            return;
        default:
            return;
    }
}

SendClick(WMessages.WM_LBUTTONDOWN, Cursor.Position);
SendClick(WMessages.WM_LBUTTONUP, Cursor.Position); // <--(1) you are sending WM_LBUTTONUP

поэтому сначала просто прочитайте (1), затем (2), и ваша проблема решена

2 голосов
/ 08 октября 2011

Вы пробовали вызов SendMessage вместо PostMessage?SendMessage немедленно вызывает обработчик для окна.PostMessage помещает сообщение в список для последующей обработки.

...