Имитация событий мыши из C ++ в Windows - PullRequest
2 голосов
/ 14 июля 2011

У меня есть программа, работающая с сенсорным экраном, но из-за того, что указатель мыши находится на сенсорном экране, возникают проблемы, поведение сенсорного экрана при использовании мыши с Windows отключено, и используется домашняя программадля мониторинга сенсорного экрана и отправки сообщений в окно в том месте, где экран был затронут или нетронут (т. е. WM_LBUTTONDOWN, WM_LBUTTONUP).

Соответствующий код выглядит примерно так:

touched = false;

while (1)
{
    if (!touched) {
        // p.x and p.y calculated here based on mouse position at
        // time of touch screen event
        p.x = ...;
        p.y = ...;

        if ((window = WindowFromPoint (p)) != NULL)
            PostMessage (window, WM_LBUTTONDOWN, 0, 0);

        touched = true;
    }
    else
    {
        if ((window = WindowFromPoint (p)) != NULL)
            PostMessage (window, WM_LBUTTONUP, 0, 0);

        touched = false;
    }
}

Это работает, но точно не имитирует поведение нажатия мышью в Windows - независимо от положения касания, когда происходит неприкосновение (т. Е. Если касание было перетащено), WM_LBUTTONUP отправляется наэлемент управления, получивший WM_LBUTTONDOWN.

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

Я установил низкоуровневый хук мыши и вижу, что во время этой последовательности происходят только события мыши WM_LBUTTONDOWN, за которым следует серия WM_MOUSEMOVE, за которой следует WM_LBUTTONUP, независимо от того, отпущена или нет кнопка мыши.

Я попытался добавить альтернативную обработку, когда мышь перетаскивается, иесть сообщения WM_MOUSEMOVE, но на какой элемент управления они должны быть отправлены?Кнопка, на которую изначально было отправлено событие WM_LBUTTONDOWN, или в другое место?Я пробовал и кнопку, и окно, в котором кнопка включена, но, очевидно, я сделал что-то не так, поскольку это, похоже, не работает.Лучшее, чего мне удалось добиться - это то, что кнопка сенсорного экрана не «нажата», когда я отсоединяю кнопку, но кнопка сенсорного экрана все еще нажата.

Есть предложения?

Кто-нибудь может подтвердить, какие события должны быть отправлены куда во время этой операции?

Спасибо за любой совет.

1 Ответ

0 голосов
/ 14 декабря 2011

Это ваш код:

    PostMessage (window, WM_LBUTTONDOWN, 0, 0);

Можете ли вы попробовать это вместо приведенной выше строки:

    DWORD dw = MAKEWORD(p.x, p.y);
    PostMessage (window, WM_LBUTTONDOWN, MK_LBUTTON, dw);

Я думаю, что этот код должен работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...