Имитация событий мыши из C++ в WindowsC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Имитация событий мыши из C++ в Windows

Сообщение Anonymous »


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

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

тронутый = false; пока (1) { если (!тронул) { // p.x и p.y рассчитаны здесь на основе положения мыши в // время события сенсорного экрана п.х = ...; п.у = ...; if ((window = WindowFromPoint (p)) != NULL) PostMessage (окно, WM_LBUTTONDOWN, 0, 0); коснулся = правда; } еще { if ((window = WindowFromPoint (p)) != NULL) PostMessage (окно, WM_LBUTTONUP, 0, 0); коснулся = ложь; } } Это работает, но не совсем имитирует поведение нажатия мыши в Windows — независимо от положения касания в момент отсоединения (т. е. если касание было перетянуто), WM_LBUTTONUP отправляется элементу управления, получившему WM_LBUTTONDOWN.

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

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

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

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

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

Спасибо за совет.
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»