1

Тема: AHK: Перемещение курсора

Пытаюсь в полноэкранной игре от первого лица осуществить некоторые действия по перемещению курсора(прицела), который обычно находится ровно в центре экрана.
Пробовал использовать
MouseMove
и
DllCall("SetCursorPos"...,

игрался с настройками

SendMode,
SetDefaultMouseSpeed,
SetMouseDelay

и скоростью перемещения в самом MouseMove.
  В результате наблюдал всего два эффекта
1. Курсор вообще не двигается.
2. Курсор отклоняется в нужную сторону и тут же возвращается назад. То есть  курсор немного движется и вся картинка движется ему навстречу, а потом как и положено, курсор возвращается в центр, а картинка, как ни странно - в прежнее положение, ничуть не сдвинувшись.

Прошу помочь. Возможно есть у кого-то какие-то соображения, как можно добиться нормального движения курсора, подразумевающего нужное смещение всей картинки и наведение курсора на нужное место в ней?

2

Re: AHK: Перемещение курсора

Foma

Приведите свой код, может в нём ошибки есть.

3

Re: AHK: Перемещение курсора

http://forum.script-coding.com/viewtopi … 63#p123063

0xFFFFFF
0xFF0000
0xFFFFFF

4 (изменено: Foma, 2020-08-31 16:34:19)

Re: AHK: Перемещение курсора

__Михаил__, вот самый простой вариант:

#SingleInstance Force
#NoEnv
ListLines Off
SetBatchLines -1
CoordMode,Pixel,Screen
CoordMode,Mouse,Screen
CoordMode,ToolTip,Screen

!Numpad6::
MouseMove,925,555
Return

Раньше думал что показалось, но снова увидел применив этот код, который укоротил для форума.
Один раз срабатывает ровно как надо - курсор сдвигается, точнее сама картинка. Дальше просто дёргается и возвращается назад. Как я понимаю игра после первого раза определяет, что сигнал не от мыши и вот таким образом блокирует работу скрипта.

stealzy, спасибо, почитал. Там правда ничего не говорится о том варианте, когда только один раз срабатывает, но я постараюсь хоть что-то понять в тех библиотеках, которые применяться в п.4 для камуфлирования работы скрипта.

Оказалось ещё интереснее. 2 раза не срабатывает одно и тоже перемещение, даже если курсор был после этого смещён мышкой. Если вписать в скрипт ещё один MouseMove на другой хоткей, то при нажатии поочерёдно они срабатывают как и должны.
Попробую копнуть дальше: удастся ли создать два MouseMove, которые по очереди будут двигать курсор по очереди куда нужно на одном хоткее.

5 (изменено: Foma, 2020-09-03 14:26:58)

Re: AHK: Перемещение курсора

Самым интересным показался вариант с библиотекой LLMOuse https://www.autohotkey.com/boards/viewtopic.php?t=26137

Но почему-то очень медленно движет курсор. Особенно велика пауза между первым и вторым срабатыванием. Не понимаю почему так. Может кто-то пояснит?

; =========== Sample script ============================================================
#SingleInstance,Force
SetBatchLines -1
SetKeyDelay,-1


F12::
Random,iks,-20,-30
Random,igr,-10,-20
LLMouse.Move(iks, igr, 1, 1)
return




; =======================================================================================
; LLMouse - A library to send Low Level Mouse input

; Note that many functions have time and rate parameters.
; These all work the same way:
; times	- How many times to send the requested action. Optional, default is 1
; rate	- The rate (in ms) to send the action at. Optional, default rate varies
; Note that if you use a value for rate of less than 10, special code will kick in.
; QPX is used for rates of <10ms as the AHK Sleep command does not support sleeps this short
; More CPU will be used in this mode.
class LLMouse {
	static MOUSEEVENTF_MOVE := 0x1
	static MOUSEEVENTF_WHEEL := 0x800
	
	; ======================= Functions for the user to call ============================
	; Move the mouse
	; All values are Signed Integers (Whole numbers, Positive or Negative)
	; x		- How much to move in the x axis. + is right, - is left
	; y		- How much to move in the y axis. + is down, - is up
	Move(x, y, times := 1, rate := 1){
		this._MouseEvent(times, rate, this.MOUSEEVENTF_MOVE, x, y)
	}
	
	; Move the wheel
	; dir	- Which direction to move the wheel. 1 is up, -1 is down
	Wheel(dir, times := 1, rate := 10){
		static WHEEL_DELTA := 120
		this._MouseEvent(times, rate, this.MOUSEEVENTF_WHEEL, , , dir * WHEEL_DELTA)
	}
	
	; ============ Internal functions not intended to be called by end-users ============
	_MouseEvent(times, rate, dwFlags := 0, dx := 0, dy := 0, dwData := 0){
		Loop % times {
			DllCall("mouse_event", uint, dwFlags, int, dx ,int, dy, uint, dwData, int, 0)
			if (A_Index != times){	; Do not delay after last send, or if rate is 0
				if (rate >= 10){
					Sleep % rate
				} else {
					this._Delay(rate * 0.001)
				}
			}
		}
	}
	
	_Delay( D=0.001 ) { ; High Resolution Delay ( High CPU Usage ) by SKAN | CD: 13/Jun/2009
		Static F ; www.autohotkey.com/forum/viewtopic.php?t=52083 | LM: 13/Jun/2009
		Critical
		F ? F : DllCall( "QueryPerformanceFrequency", Int64P,F )
		DllCall( "QueryPerformanceCounter", Int64P,pTick ), cTick := pTick
		While( ( (Tick:=(pTick-cTick)/F)) <D ) {
			DllCall( "QueryPerformanceCounter", Int64P,pTick )
			Sleep -1
		}
		Return Round( Tick,3 )
	}
}

И разницы между паузами в 1мс и 99мс я не заметил. Очевидно как-то влияет скорость повторного срабатывания самой клавиши?

6

Re: AHK: Перемещение курсора

У меня проблем нет и не слышал прежде. Вероятно особенность вашей системы, антивирус м.б.

0xFFFFFF
0xFF0000
0xFFFFFF

7

Re: AHK: Перемещение курсора

Foma пишет:

2 раза не срабатывает одно и тоже перемещение, даже если курсор был после этого смещён мышкой.

Такого тоже нет.

Если вы про игры, то вам нужна эмуляция, стандартные способы которыми вы пытаетесь выше не катят.

0xFFFFFF
0xFF0000
0xFFFFFF

8

Re: AHK: Перемещение курсора

Ну, вот попробовал с LLMouse, странно и медленно работает. Почему - не понятно.

9

Re: AHK: Перемещение курсора

Даже не знаю повторять последнее предложение или не стоит...

0xFFFFFF
0xFF0000
0xFFFFFF

10 (изменено: Foma, 2020-09-04 11:18:58)

Re: AHK: Перемещение курсора

Ну, если Вы считаете применение специально разработанной библиотеки  "стандартным способом", то эмуляция мне скорее всего не по зубам.
А она точно нужна? Всё ведь срабатывает, только чуток медленно, особенно второе срабатывание.
Допустим в блокноте при стандартном вводе тоже так работает, если зажать клавишу - пауза пере вторым, а дальше быстро.
Для скрипта это же должно как-то убираться?

SetKeyDelay,-1

никак не влияет почему-то. Что в игре, что без.

11

Re: AHK: Перемещение курсора

Нельзя сказать не зная проблемы.
У меня приведенный вами код перемещает курсор мгновенно, сколько раз ни нажимай.

0xFFFFFF
0xFF0000
0xFFFFFF

12

Re: AHK: Перемещение курсора

Я что-то совсем растерялся.  LLMOuse тут вообще не при чём.
Вне зависимости от использования LLMOuse, отсылка клавиш даже в блокнот идёт с задержкой, особенно большой после первого нажатия. Даже вот в таком виде:

#SingleInstance,Force
#InstallKeybdHook
SetBatchLines -1
SetKeyDelay,-1
;SendMode,

F2::
Send,B
Return

Ничего не смог изменить используя
SetBatchLines -1
SetKeyDelay,-1
#InstallKeybdHook
и разные варианты
Send
и
SendMode.
  Что за напасть такая?