Здравствуйте, Вумудщзук, Вы писали:
>>Может, все таки, сделать пару банальных пассов руками с помощю WinaAPI: SetCursorPos В>...или SendInput — смотря чего нужно достичь
Нужно двигать курсором, для начала хотя бы в глобальных координатах и что-то "пару банальных пассов" не получается. Пробовал и с SetCursorPos, и с SendInput, симптом один и тот же — курсор не двигается. В SetCursorPos есть что-то про WINSTA_WRITEATTRIBUTES, который должен быть установлен для данного процесса. Установлен ли он там? Пробовал с тем же результатом запускать из-под админа. Для админа на WinSta0 установлен какой-то ModifyState, не знаю, оно ли это. В любом случае курсор не двигается. Вот так вотс... И главное, никаких тебе ошибок, всё чин чинарем, SetCursorPos возвращает не ноль, SendInput — 1.
Re[4]: Перемещение курсора мыши в окне другого потока
>Нужно двигать курсором, для начала хотя бы в глобальных координатах и что-то "пару банальных пассов" не получается. Пробовал и с SetCursorPos, и с SendInput, симптом один и тот же — курсор не двигается. В SetCursorPos есть что-то про WINSTA_WRITEATTRIBUTES, который должен быть установлен для данного процесса. Установлен ли он там? Пробовал с тем же результатом запускать из-под админа. Для админа на WinSta0 установлен какой-то ModifyState, не знаю, оно ли это. В любом случае курсор не двигается. Вот так вотс... И главное, никаких тебе ошибок, всё чин чинарем, SetCursorPos возвращает не ноль, SendInput — 1.
ну, не знаю... в первом попавшемся консольном приложении вот этот код:
for (int i = 0; i < 10000; i++)
{
//SetCursorPos(dx, dy);
mouse_event(MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE,
0xFFFF/2 + double(0.4*0xFFFF)*sin(double(i)/30.0),
0xFFFF/2 + double(0.4*0xFFFF)*sin(double(i)/77.0), 0, 0);
SleepEx(20, TRUE);
}
гоняет мышиный курсор по экрану, что с использованием mouse_event, что через SetCursorPos
Homo sum et nihil humani a me alienum puto...
Re[5]: Перемещение курсора мыши в окне другого потока
Здравствуйте, Вумудщзук, Вы писали:
>>Нужно двигать курсором, для начала хотя бы в глобальных координатах и что-то "пару банальных пассов" не получается. Пробовал и с SetCursorPos, и с SendInput, симптом один и тот же — курсор не двигается. В SetCursorPos есть что-то про WINSTA_WRITEATTRIBUTES, который должен быть установлен для данного процесса. Установлен ли он там? Пробовал с тем же результатом запускать из-под админа. Для админа на WinSta0 установлен какой-то ModifyState, не знаю, оно ли это. В любом случае курсор не двигается. Вот так вотс... И главное, никаких тебе ошибок, всё чин чинарем, SetCursorPos возвращает не ноль, SendInput — 1.
В>ну, не знаю... в первом попавшемся консольном приложении вот этот код: В>
В>гоняет мышиный курсор по экрану, что с использованием mouse_event, что через SetCursorPos
Спасибо за пример. Кажется, я понял в чём заключается проблема. Курсор действительно двигается, но его движение заметно только когда он находится над элементом ввода, когда/если курсор выходит за пределы элемента ввода, выводится прежний курсор (в форме стрелки) в том месте, в которое он был помещён с помощью физического перемещения мыши. Если курсор находится над, скажем, рабочим столом, заметить его смещение можно только выделив некоторую область, не отпуская при этом левую кнопку мыши, тогда область выделения будет изменять свою форму по мере перемещения указателя в программе.
Можно ли произвести монопольный захват курсора мыши, чтобы:
1) его (в том или ином виде) было видно везде, в независимости от того, какое окно находится на переднем плане;
2) (менее важно) движения мышки не влияли на перемещение курсора.
И если да, то как?
Re[6]: Перемещение курсора мыши в окне другого потока
>Курсор действительно двигается, но его движение заметно только когда он находится над элементом ввода, когда/если курсор выходит за пределы элемента ввода, выводится прежний курсор (в форме стрелки) в том месте, в которое он был помещён с помощью физического перемещения мыши. Если курсор находится над, скажем, рабочим столом, заметить его смещение можно только выделив некоторую область, не отпуская при этом левую кнопку мыши, тогда область выделения будет изменять свою форму по мере перемещения указателя в программе.
ну так и есть — и SetCursorPos и SendInput/mouse_event _перемещают_курсор_мыши_ со всеми вытекающими, то есть системе всё равно, каким макаром передвинули курсор — программно или аппаратно, она делает своё дело — устанавливает форму курсора (его иконку) в соответствии с тем, над каким окном он находится
>1) его (в том или ином виде) было видно везде, в независимости от того, какое окно находится на переднем плане;
монопольный захват курсора под виндой — SetCapture, хотя, мне кажется, это не совсем то, что нужно..
>2) (менее важно) движения мышки не влияли на перемещение курсора.
ну, самый простой путь — BlockInput блокирует клаву и мышь, при этом mouse_event нормально посылает эмулирует сообщения мыши. Ещё можно попробовать поставить системный хук на перемещение мыши и выкидывать мышиные сообщения, а курсор ставить через SetCursorPos.
А, кста, что является конечной целью? Ведь если заблокировать сообщения мыши, то приложение не будет получать мышиных сообщений WM_MOUSEMOVE, LBUTTONDOWN, и т.п, какой тогда смысл двигать курсор?
Homo sum et nihil humani a me alienum puto...
Re[7]: Перемещение курсора мыши в окне другого потока
Здравствуйте, Вумудщзук, Вы писали:
>>Курсор действительно двигается, но его движение заметно только когда он находится над элементом ввода, когда/если курсор выходит за пределы элемента ввода, выводится прежний курсор (в форме стрелки) в том месте, в которое он был помещён с помощью физического перемещения мыши. Если курсор находится над, скажем, рабочим столом, заметить его смещение можно только выделив некоторую область, не отпуская при этом левую кнопку мыши, тогда область выделения будет изменять свою форму по мере перемещения указателя в программе. В>ну так и есть — и SetCursorPos и SendInput/mouse_event _перемещают_курсор_мыши_ со всеми вытекающими, то есть системе всё равно, каким макаром передвинули курсор — программно или аппаратно, она делает своё дело — устанавливает форму курсора (его иконку) в соответствии с тем, над каким окном он находится
>>1) его (в том или ином виде) было видно везде, в независимости от того, какое окно находится на переднем плане; В>монопольный захват курсора под виндой — SetCapture, хотя, мне кажется, это не совсем то, что нужно..
>>2) (менее важно) движения мышки не влияли на перемещение курсора. В>ну, самый простой путь — BlockInput блокирует клаву и мышь, при этом mouse_event нормально посылает эмулирует сообщения мыши. Ещё можно попробовать поставить системный хук на перемещение мыши и выкидывать мышиные сообщения, а курсор ставить через SetCursorPos.
В>А, кста, что является конечной целью? Ведь если заблокировать сообщения мыши, то приложение не будет получать мышиных сообщений WM_MOUSEMOVE, LBUTTONDOWN, и т.п, какой тогда смысл двигать курсор?
Конечная цель — эмулирование мыши с помощью клавиатуры, удалённое "мышиное" управление командами из сети и т.п. Кстати, пример работает правильно в WXP Pro sp1 (или 2 — не помню), а в VMWare работает так, как я описал выше.
Ладно, буду разбираться. Спасибо за ответы.