2011-07-14 3 views
2

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

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

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' - независимо от положения прикосновения, когда Untouch происходит (т.е. если касание было перетаскивано), WM_LBUTTONUP отправляется в элемент управления, который получил WM_LBUTTONDOWN.

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

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

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

Любые предложения?

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

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

+0

Вы проверили этот вопрос: http://stackoverflow.com/questions/5164774/how-can-i-simulate-mouse-events-from-code – iammilind

+0

Я пробовал SendInput, но проблема в том, что SendInput (кроме Я сделал что-то не так) заставляет указатель мыши реагировать так, как будто событие мыши, которое я отправил, действительно произошло - поэтому, если я посылаю щелчок мыши в другое место, мышь фактически перемещается в другое место. То, что я пытаюсь сделать, это отправить базовые сообщения WM_LBUTTONDOWN, WM_MOUSEMOVE и WM_LBUTTONUP (и любые другие сообщения, если они есть), в соответствующий элемент управления (ов), как если бы мышь была нажата и/или перетащена туда, но без перемещения указателя мыши. – Mark

+0

Если вы хотите скрыть указатель мыши, лучшим вариантом может быть установка указателя мыши на невидимый.Улов с использованием сообщений WM_ вместо использования SendInput заключается в том, что если целевое приложение использует GetCursorPos или Get [Async] KeyState, чтобы проверить положение мыши или состояние кнопки, оно получит фактическое состояние, а не то, что вы пытаетесь подделать. (Кроме того, если приложение делает что-то нечетное, как обработка ввода в крючке или в цикле сообщений, а не в окне proc, это может не сработать, когда вы отправляете сообщения вместо этого.) Но если у вас есть целевое приложение (ы) в этом случай, вы можете планировать это. – BrendanMcK

ответ

0

Это ваш код:

PostMessage (window, WM_LBUTTONDOWN, 0, 0); 

Вы можете попробовать это вместо указанных выше строк:

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

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

+0

MAKEWORD создает слово из байтов ... вам нужно хотя бы MAKELONG, хотя сообщения с кнопкой мыши Windows фактически принимают LPARAM: http://stackoverflow.com/questions/8490389/wm-mousemove-packing-x-and-y-positions/8490518 # 8490518 – HostileFork

Смежные вопросы