Имитация событий мыши из C++ в Windows ⇐ C++
-
Anonymous
Имитация событий мыши из C++ в Windows
У меня есть программа, работающая с сенсорным экраном, но поскольку указатель мыши включен, на сенсорном экране возникают проблемы, поведение 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, или куда-то еще? Я попробовал и кнопку, и окно, в котором находится кнопка, но, очевидно, я сделал что-то не так, поскольку это не работает. Лучшее, чего мне удалось добиться, — это то, что кнопка сенсорного экрана не «нажимается», когда я ее отпускаю, но кнопка сенсорного экрана все еще остается нажатой.
Есть предложения?
Может ли кто-нибудь подтвердить, какие события и куда следует отправлять во время этой операции?
Спасибо за совет.
У меня есть программа, работающая с сенсорным экраном, но поскольку указатель мыши включен, на сенсорном экране возникают проблемы, поведение 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, или куда-то еще? Я попробовал и кнопку, и окно, в котором находится кнопка, но, очевидно, я сделал что-то не так, поскольку это не работает. Лучшее, чего мне удалось добиться, — это то, что кнопка сенсорного экрана не «нажимается», когда я ее отпускаю, но кнопка сенсорного экрана все еще остается нажатой.
Есть предложения?
Может ли кто-нибудь подтвердить, какие события и куда следует отправлять во время этой операции?
Спасибо за совет.
Мобильная версия