Что нового

[Мышь, клавиатура] Вопрос по удерживанию клавиши мыши в свернутом окне

GreyWerewolf

То тут, то там...
Сообщения
23
Репутация
0
Долго искал, на иностранных форумах тоже, толком ответа не нашел.

Возможна ли реализация удержания клавиши мыши в СВЕРНУТОМ окне приложения? Необходимо нажимать на кнопку в приложении в течении пяти секунд, при этом приложение на экране не видно.
Код:
ControlClick
не подходит - он кликает заданное количество раз. Увеличивать интервалы между кликами пробовал - похоже на клики в свернутые окна они не действуют. User32.dll примеры тоже смотрел, работать отказались, нажималась клавиша как по клику или печаталась раз 10 и останавливалась.
 
Автор
GreyWerewolf

GreyWerewolf

То тут, то там...
Сообщения
23
Репутация
0
InnI сказал(а):

Спасибо большое, подобное пробовал, но может в этом варианте прокатит. Завтра отпишу результат.

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

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
а ты отправляешь то нажатие и отжатие или чисто нажатие?
 
Автор
GreyWerewolf

GreyWerewolf

То тут, то там...
Сообщения
23
Репутация
0
Belfigor сказал(а):
а ты отправляешь то нажатие и отжатие или чисто нажатие?

Вопрос хороший) Думал и в эту сторону - пробовал и только с нажатием и обоими функциями, посередине пауза - все равно срабатывает или 1 раз или несколько раз подряд, но не в течении слипа, а за более короткий промежуток(через user32.dll вышло несколько нажатий мыши, но почему то прекратились раньше чем надо). К сожалению код не сохранял - не выходило - пробовал заново.

Пробую функцию из ответа - к сожалению не работает, даже с не свернутым окном. В свернутом окне работать не будет из-за того что есть SetCursor - значит хотим установить курсор на нужное место(а его нет, т.к. окно свернуто). Почему не работает с развернутым мне пока не ясно(выяснил - не верно указал хэндл контрола, но к сожалению клик сработал 1 раз, удержания не было).

В итоге преобразовал функцию, спасибо за ссылку, воспользовался тем что там было. В SW_HIDE окне работает. Не нравится, что все не как у людей сделано, но терзают смутные сомнения, что само по себе удержание клавиши мыши реализовано в таком же стиле, т.е. сигнал от мыши просто передается постоянно, но тут мне лучше почитать литературу чтобы убедиться.
Код:
Func MouseLeftHold($hWnd, $X, $Y, $Time); hWnd - хэндл окна или контрола, x,y - координаты щелчка, Time - время удержания в секундах.
  Local Const $MK_LBUTTON = 0x0001
  while $Time>0
  _WinAPI_PostMessage($hWnd, $WM_SETCURSOR, $hWnd, _WinAPI_MakeLong($HTCLIENT, $WM_LBUTTONDOWN))
  _WinAPI_PostMessage($hWnd, $WM_LBUTTONDOWN, $MK_LBUTTON, _WinAPI_MakeLong($X, $Y))
  Sleep(10)
  $Time=$Time-0.01;
  WEnd
  _WinAPI_PostMessage($hWnd, $WM_SETCURSOR, $hWnd, _WinAPI_MakeLong($HTCLIENT, $WM_LBUTTONUP))
  _WinAPI_PostMessage($hWnd, $WM_LBUTTONUP, 0, _WinAPI_MakeLong($X, $Y))
EndFunc


И небольшой вопрос вне темы - как считаете, есть возможность каким то образом игровому приложению "спалить" то, что команды для экранной клавиатуры посылаются через скрипт?
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Теоретически приложение может определить свое состояние и определить наличие процесса экранной клавиатуры. Вопрос реализовано ли это в самом приложении - это уже на рассмотрение разработчиков.
 
Автор
GreyWerewolf

GreyWerewolf

То тут, то там...
Сообщения
23
Репутация
0
Belfigor сказал(а):
Теоретически приложение может определить свое состояние и определить наличие процесса экранной клавиатуры. Вопрос реализовано ли это в самом приложении - это уже на рассмотрение разработчиков.

Спасибо за ответ, немного иное имел ввиду. То что приложение перехватит процесс экранной клавиатуры - это не страшно, в конце концов на то она и сделана - помогать тем, у кого нету клавы. Тобишь можно отмазаться)

Хотя в общем то скорее всего никто не будет следить за всеми процессами во всех приложениях, на что я и рассчитываю. По факту я манипулирую экранной клавиатурой на любом уровне, на каком мне удобно(свернуто, открыто, спрятано), а уже она отдает команды в игру или приложение. Видел тут темки такие, но развития почему то особо не было. Ведь визуальный бот имеет меньше шансов спалить себя чем бот, вмешивающийся в процессы приложения?
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
GreyWerewolf [?]
Ведь визуальный бот имеет меньше шансов спалить себя чем бот, вмешивающийся в процессы приложения?
Так и есть. Исключение вмешательства в процесс или трафик приложения минимизирует шанс спалиться. Ибо для того чтобы вмешиваться в процесс или трафик, нужно настолько хорошо владеть техниками реверс инжиниринга, чтобы на уровне ассемблера выпиливать все проверочные заглушки которые разработчики ставят на свои приложения. Грубо говоря вмешаться в процесс - не проблема. Проблема сделать так чтобы вмешательство не отследили.
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
GreyWerewolf
Функция из приведённого мной примера будет удерживать клавишу виртуальной клавиатуры только, если курсор мыши находится над кнопкой клавиатуры. Причём удерживаться будет именно та клавиша, над которой находится курсор, независимо от переданных в функции координат. Видимо, виртуальная клавиатура использует физическое положение курсора и игнорирует координаты в сообщении мыши. Поэтому нужно использовать MouseClick() или перемещать курсор на нужную кнопку.
А ваша функция не удерживает клавишу, а в цикле нажимает её. Игры, в отличие от текстовых редакторов, подобное поведение различают.
 
Автор
GreyWerewolf

GreyWerewolf

То тут, то там...
Сообщения
23
Репутация
0
InnI сказал(а):
InnI
Функция из приведённого мной примера будет удерживать клавишу виртуальной клавиатуры только, если курсор мыши находится над кнопкой клавиатуры. Причём удерживаться будет именно та клавиша, над которой находится курсор, независимо от переданных в функции координат. Видимо, виртуальная клавиатура использует физическое положение курсора и игнорирует координаты в сообщении мыши. Поэтому нужно использовать MouseClick() или перемещать курсор на нужную кнопку.
А ваша функция не удерживает клавишу, а в цикле нажимает её. Игры, в отличие от текстовых редакторов, подобное поведение различают.

Ну в скрытом окне клики не игнорирует, хотя координаты курсора не соответствуют координатам в функции.
Перемещение курсора - да, вариант, но значит что клавиатура должна будет висеть впереди, кроме того тогда обеспечены заморочки с переводом координат из контролов в абсолютные.

Да, моя нажимает кучу раз по факту, НО. Я отсылаю ее в виртуальную клавиатуру, а не в приложение игры. Неужели приложение, пока оно включено, может проверять что там творят с мышью в других окнах?
 
Верх