1 (изменено: deadskiy sad, 2021-05-18 22:10:06)

Тема: AHK: Переместить курсор с помощью DllCall, с координатами от MouseMove

Всем привет. Не получается заменить перемещение курсора с MouseMove на DllCall.
Конкретный код с MouseMove:

~*LButton:: 
MouseGetPos, X, Y
While, GetKeyState("LButton", "P") {
MouseMove, X, Y, 0
}
Return

На рабочем столе работает, в игре - нет.
Вообще говоря, MouseMove в некоторых играх не перемещает курсор адекватным образом, а вот через DllCall, в целом, работает хорошо.
Идея в том, чтобы заменить функцию перемещения с MouseMove на DllCall.
Я пробовал это так:

MouseMoving() {
 DllCall("mouse_event", "UInt", 0x01, "UInt", X, "UInt", Y)
}

Или так:

MouseMoving() {
 DllCall("mouse_event", "UInt", 0x01, "UInt", (A_ScreenWight / 2), "UInt", (A_ScreenHeight / 2))
}

К сожалению, ничего не сработало. Помогите пожалуйста.

2

Re: AHK: Переместить курсор с помощью DllCall, с координатами от MouseMove

deadskiy sad, исправьте заголовок темы.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

3

Re: AHK: Переместить курсор с помощью DllCall, с координатами от MouseMove

teadrinker, Сделано.

4

Re: AHK: Переместить курсор с помощью DllCall, с координатами от MouseMove

Теперь открою страшную тайну: существует поиск по сайту, в том числе и на https://autohotkey.com/.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

5

Re: AHK: Переместить курсор с помощью DllCall, с координатами от MouseMove

Как переместить курсор через DllCall я знаю. Меня конкретно интересует как задать постоянное перемещение в центр экрана через DllCall, кроме тех способов, которые пробовал я. Они не сработали.
Я искал такое на форумах. Но конкретно это не нашел. Может кто-то более опытный подскажет или оставит ссылку на то, как конкретно такое можно сделать.

6

Re: AHK: Переместить курсор с помощью DllCall, с координатами от MouseMove

Обычно игры перехватывают курсор мыши так, что положение координат не относится к пикселям монитора напрямую, другими словами только игра знает куда будет смотреть камера персонажа при X=0 и на сколько она будет смещена при X=10.
Другое дело если высчитать эти смещения от 0 до 360 и делить на необходимое смещение в игре.
Это всё относиться к точному позиционированию, если оно необходимо.
При этом в полноэкранном режиме игра может полностью перехватить управление и ничего уже не поделать простым способом.

Win10x64, AHK v1.1.37.01 (Unicode 64-bit) | AHK-Wiki | Переменные и выражения | RegEx101

7

Re: AHK: Переместить курсор с помощью DllCall, с координатами от MouseMove

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

Создал тему я для того, чтобы разобраться с вопросом, который я описал в первом посте.

MouseMove в принципе не работает в игре. DllCall воспринимается и работает должным образом. Хотя бы, чтобы работало на рабочем столе, только через DllCall.

Цель: перемещать при помощи DllCall, также, как и MouseMove из первого поста.

Прошу вашей помощи. Заранее спасибо за любую помощь.

8

Re: AHK: Переместить курсор с помощью DllCall, с координатами от MouseMove

Если задача переместить курсор обратно после отпуска, можно так:

CoordMode, Mouse, Screen

MouseMoving(X, Y, S := 1000){
 DX := 0, DY := 0, DX0 := 0, DY0 := 0
 Loop % S
  DllCall("mouse_event",UInt,1,Int, DX0:=Round(DX:=DX+X/S-DX0),Int, DY0:=Round(DY:=DY+Y/S-DY0),UInt,0,Int,0) 
}

~vk1::
MouseGetPos, X, Y
KeyWait, vk1, U
MouseGetPos, X2, Y2
MouseMoving(X-X2, Y-Y2)
Return

Скорость перемещения курсора можно менять через 'S' параметр, чем меньше - тем быстрее перемещение.

Win10x64, AHK v1.1.37.01 (Unicode 64-bit) | AHK-Wiki | Переменные и выражения | RegEx101

9 (изменено: __Михаил__, 2021-05-19 22:23:10)

Re: AHK: Переместить курсор с помощью DllCall, с координатами от MouseMove

Полностью через DllCall:

;[Irbis] 12.07.2014	http://forum.script-coding.com/viewtopic.php?pid=84720#p84720
MouseMoving(X, Y, S := 1000){	; Переместить курсор в позицию X, Y. S - чем меньше - тем быстрее.
 DX := 0, DY := 0, DX0 := 0, DY0 := 0
 Loop % S
  DllCall("mouse_event",UInt,1,Int, DX0:=Round(DX:=DX+X/S-DX0),Int, DY0:=Round(DY:=DY+Y/S-DY0),UInt,0,Int,0) 
}

;https://github.com/jNizM/AHK_DllCall_WinAPI/blob/master/src/Cursor%20Functions/GetCursorPos.ahk
GetCursorPos(ByRef X, ByRef Y){
 static POINT, init := VarSetCapacity(POINT, 8, 0) && NumPut(8, POINT, "Int")
 if !(DllCall("user32.dll\GetCursorPos", "Ptr", &POINT))
  Return DllCall("kernel32.dll\GetLastError")
 X := NumGet(POINT, 0, "Int"), Y := NumGet(POINT, 4, "Int")
}


*~vk1::	; Возврат курсора обратно при удержании ЛКМ:
GetCursorPos(X,Y)
Loop 
{
 State:=DllCall("GetAsyncKeyState", "Int", 1, "UShort") ; 1 = 0x1 = VK_LButton
 If !State
   Break
 GetCursorPos(X2,Y2)
 MouseMoving(X-X2, Y-Y2, 10)
}
Return
Win10x64, AHK v1.1.37.01 (Unicode 64-bit) | AHK-Wiki | Переменные и выражения | RegEx101

10 (изменено: deadskiy sad, 2021-05-19 23:51:14)

Re: AHK: Переместить курсор с помощью DllCall, с координатами от MouseMove

__Михаил__, большое вам спасибо. Все работает прекраснейшим образом.