Доброго времени суток всем. Я никогда не работал в Windows с ГУИ на низком уровне. Почти все мои приложения консольные. Если уж без ГУИ никуда - использовал VCL либо Qt. Встала задача: провести мышкой над некой активной областью в другом приложении из моего приложения. Я думал все будет просто, SendMessage (hwnd, WM_MOUSEMOVE, 0, MAKEWPARAM(x, y)) Но чужое приложение не реагирует на это сообщение. Получилось сделать только через send_input(), но это меня не устраивает. Заметил интересную особенность: если реальной мышкой навести курсор на приложение (в любую его часть), то вся моя логика работает, моя программа проводит-таки мышкой над чужим окном. Но если реально курсор вне чужого приложения - ничего не работает... Может надо еще что-то слать программе? Или я чего-то не знаю... П.С. hwnd основного окна, и hwnd его дочки (над которой и надо провести мышкой) у меня есть. Спасибо всем кто поможет.
Нет, пробовал делать фокус на парента, а затем на само окно. SetFocus(hwnd) Фокус есть, а толку нет) Еще раз напишу: все начинает работать, когда я настоящей мышкой навожу на нужный контрол.
http://www.delphikingdom.com/asp/answer.asp?IDAnswer=37219 WM_MOUSEMOVE мышь не двигает, так что вызов GetCursorPos вернет старые координаты, Наверно в этом дело? Пошукай по поисковикам, думаю найдешь свой случай.
Span делаешь снимок окна считаешь в пикселях смещения координат invoke GetWindowPlacement,hwnd,offset winplc где winplc структура куда заносятся данные об окне потом делаешь mov eax,winplc.rcNormalPosition.left mov ebx,winplc.rcNormalPosition.top add eax,x ; где х- это смещение в пикселях относительно левой верхней точки начала окна add ebx,y ; для у то же самое invoke SetCursorPos,eax,ebx
cresta, deadly83, valterg спасибо. Придется делать без ивентов. Есть ли гарантии, что если я вызову WindowFromPoint, а потом сделаю 2 mouse_eventa (UP/DOWN) подряд, чужое приложение не отрисует еще окно под курсором? Я думал делать через события, как раз чтобы при "плотной" работе приложений все было четко, т.к. планируется очень быстрое изменение рабочего стола разными приложениями.
Гарантий нет делай проверку сам, например юзаешь сперва функцию GetWindowPlacement вычисляешь точные координаты того места над которым надо мышкой порулить, ставишь туда курсор и смотришь по WindowFromPoint изменился ли hwnd если нет то выполняешь движения мышкой какие надо, если hwnd изменился то делаешь activewindow с нужным hwnd и двигаешь мышку.
Span Смотри в сторону SendInput Она изрядно кривая - штатный таймер не работает, абсолютные координаты в 1/65535 от экрана, относительные непонятно в чём, но гораздо грубее чем пиксели, колесо мыши даже в ХР только заглушка, но всё равно лучше предложенных здесь извращений Аттач рисует эллипс нажатой мышью - если запущен paint (и не перекрыт в стартовой точке рисования другими окнами), то результат будет им зафиксирован независимо от того куда указывает фокус в момент запуска проги.