Как заставить работать WM_MOUSEMOVE?

Тема в разделе "WASM.BEGINNERS", создана пользователем Span, 2 май 2008.

  1. Span

    Span New Member

    Публикаций:
    0
    Регистрация:
    5 ноя 2006
    Сообщения:
    134
    Доброго времени суток всем.

    Я никогда не работал в Windows с ГУИ на низком уровне. Почти все мои приложения консольные. Если уж без ГУИ никуда - использовал VCL либо Qt.

    Встала задача: провести мышкой над некой активной областью в другом приложении из моего приложения.

    Я думал все будет просто, SendMessage (hwnd, WM_MOUSEMOVE, 0, MAKEWPARAM(x, y))

    Но чужое приложение не реагирует на это сообщение. Получилось сделать только через send_input(), но это меня не устраивает.
    Заметил интересную особенность: если реальной мышкой навести курсор на приложение (в любую его часть), то вся моя логика работает, моя программа проводит-таки мышкой над чужим окном.
    Но если реально курсор вне чужого приложения - ничего не работает...

    Может надо еще что-то слать программе? Или я чего-то не знаю...

    П.С. hwnd основного окна, и hwnd его дочки (над которой и надо провести мышкой) у меня есть.

    Спасибо всем кто поможет.
     
  2. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    Span
    может дело с фокусом?
     
  3. Span

    Span New Member

    Публикаций:
    0
    Регистрация:
    5 ноя 2006
    Сообщения:
    134
    Нет, пробовал делать фокус на парента, а затем на само окно. SetFocus(hwnd)
    Фокус есть, а толку нет)

    Еще раз напишу: все начинает работать, когда я настоящей мышкой навожу на нужный контрол.
     
  4. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    http://www.delphikingdom.com/asp/answer.asp?IDAnswer=37219
    WM_MOUSEMOVE мышь не двигает, так что вызов GetCursorPos вернет старые координаты,
    Наверно в этом дело? Пошукай по поисковикам, думаю найдешь свой случай.
     
  5. deadly83

    deadly83 New Member

    Публикаций:
    0
    Регистрация:
    25 янв 2007
    Сообщения:
    71
    invoke SetCursorPos,x,y
    invoke mouse_event,mouseeventf_move,x,y,0,0
     
  6. Span

    Span New Member

    Публикаций:
    0
    Регистрация:
    5 ноя 2006
    Сообщения:
    134
    Спасибо. Так работает.
    Но мне нужна привязка к конкретному приложению.
     
  7. deadly83

    deadly83 New Member

    Публикаций:
    0
    Регистрация:
    25 янв 2007
    Сообщения:
    71
    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
     
  8. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Span

    Код (Text):
    1. if WindowFromPoint==hwnd
    2.   mouse event
    3. endif
     
  9. Span

    Span New Member

    Публикаций:
    0
    Регистрация:
    5 ноя 2006
    Сообщения:
    134
    cresta, deadly83, valterg

    спасибо.

    Придется делать без ивентов.

    Есть ли гарантии, что если я вызову WindowFromPoint, а потом сделаю 2 mouse_eventa (UP/DOWN) подряд, чужое приложение не отрисует еще окно под курсором?

    Я думал делать через события, как раз чтобы при "плотной" работе приложений все было четко, т.к. планируется очень быстрое изменение рабочего стола разными приложениями.
     
  10. deadly83

    deadly83 New Member

    Публикаций:
    0
    Регистрация:
    25 янв 2007
    Сообщения:
    71
    Гарантий нет делай проверку сам, например юзаешь сперва функцию GetWindowPlacement вычисляешь точные координаты того места над которым надо мышкой порулить, ставишь туда курсор и смотришь по WindowFromPoint изменился ли hwnd если нет то выполняешь движения мышкой какие надо, если hwnd изменился то делаешь activewindow с нужным hwnd и двигаешь мышку.
     
  11. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Span
    Смотри в сторону SendInput
    Она изрядно кривая - штатный таймер не работает, абсолютные координаты в 1/65535 от экрана, относительные непонятно в чём, но гораздо грубее чем пиксели, колесо мыши даже в ХР только заглушка, но всё равно лучше предложенных здесь извращений ;)
    Аттач рисует эллипс нажатой мышью - если запущен paint (и не перекрыт в стартовой точке рисования другими окнами), то результат будет им зафиксирован независимо от того куда указывает фокус в момент запуска проги.