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