У меня есть программа, работающая с сенсорным экраном, но поскольку указатель мыши, находящийся на «сенсорном экране», вызывает проблемы, поведение сенсорного экрана 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
было отправлено, или в другое место? Я попробовал как кнопку, так и окно, на котором кнопка включена, но, очевидно, я сделал что-то не так, потому что это не работает. Лучшее, что я смог достичь, - это кнопка сенсорного экрана, которую нельзя «щелкнуть», когда я отключаю кнопку, но кнопка сенсорного экрана все еще нажата.
Любые предложения?
Может ли кто-нибудь подтвердить, какие события следует отправлять там, где во время этой операции?
Спасибо за любой совет.
Вы проверили этот вопрос: http://stackoverflow.com/questions/5164774/how-can-i-simulate-mouse-events-from-code – iammilind
Я пробовал SendInput, но проблема в том, что SendInput (кроме Я сделал что-то не так) заставляет указатель мыши реагировать так, как будто событие мыши, которое я отправил, действительно произошло - поэтому, если я посылаю щелчок мыши в другое место, мышь фактически перемещается в другое место. То, что я пытаюсь сделать, это отправить базовые сообщения WM_LBUTTONDOWN, WM_MOUSEMOVE и WM_LBUTTONUP (и любые другие сообщения, если они есть), в соответствующий элемент управления (ов), как если бы мышь была нажата и/или перетащена туда, но без перемещения указателя мыши. – Mark
Если вы хотите скрыть указатель мыши, лучшим вариантом может быть установка указателя мыши на невидимый.Улов с использованием сообщений WM_ вместо использования SendInput заключается в том, что если целевое приложение использует GetCursorPos или Get [Async] KeyState, чтобы проверить положение мыши или состояние кнопки, оно получит фактическое состояние, а не то, что вы пытаетесь подделать. (Кроме того, если приложение делает что-то нечетное, как обработка ввода в крючке или в цикле сообщений, а не в окне proc, это может не сработать, когда вы отправляете сообщения вместо этого.) Но если у вас есть целевое приложение (ы) в этом случай, вы можете планировать это. – BrendanMcK