1 (изменено: S.shipilov, 2014-07-11 22:03:59)

Тема: AHK:[Dllcall] Вопрос по синтаксису Dllcall ("Sendinput"...)

Добрый день!

Прошу помощи разобраться в синтаксисе написания функции обращения к dll Sendinput

Суть вопроса:
[*]Есть задача: посредством курсора нарисовать некую Графическую функцию (Круг, Элипс и т.п.) с заданной скоростью перемещения при этом оставля возможность управления курсором посредством физического перемещения мыши[/*]

В ходе решения данной задачи столкнулся со следующими проблемами:
1. Использование команды Mousemove не позволяет одновременно работать и скрипту и мыши точнее физические движения мыши выполняются после выполнения скрипта.
2. Использование функции на основе dllcall


mouseXY(x,y) 
{ 
DllCall("mouse_event",uint,1,int,x,int,y,uint,0,int,0) 
}

совершает мгновенное перемещение курсора и не имеет атрибутов для регулирования скорости, но позволяет одновременное управление указателем и посредством скрипта и посредством мыши.
3. Согласно статье "cтатья по функции mouse_event" эта функция устарела и рекомендуют использование функции Sendinput  С которой собственно и возникли сложности. точнее настоящие проблемы ибо как работать с этой функцией я просто ума не приложу.

Собственно в качестве ответа хотелось бы получить следующее:


MouseXYS(x,y,s) ; 
{

}

;Где: MouseXYS(x,y,s) - Название вызываемой скриптом функции с параметрами относительного перемещения курсора x, y  и скоростью движения курсора s

Буду благодарен за пример в ответах. Спасибо.

2

Re: AHK:[Dllcall] Вопрос по синтаксису Dllcall ("Sendinput"...)

Winapi функция SendInput также не предоставляет возможности управления скоростью перемещения курсора между двумя точками.

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

3 (изменено: Irbis, 2014-07-12 15:42:09)

Re: AHK:[Dllcall] Вопрос по синтаксису Dllcall ("Sendinput"...)

Возможно, есть более красивый метод, но как вариант можно разбить отрезок на множество частей и перемещать в цикле.
Чем меньше s (от 1 до ... ), тем больше скорость перемещения.

; SetBatchLines -1
F1::
mouseXY(100,-100,1000)
Return

mouseXY(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) 
   }
}

4

Re: AHK:[Dllcall] Вопрос по синтаксису Dllcall ("Sendinput"...)

Тогда уж и DllCall упразднить.


SetBatchLines -1 

1:: 
    mouseXY(1111,-555,111) 
    Return

mouseXY(x,y,s)  {
    Loop % s + (dx:=dy:=dx0:=dy0:=0)
        SendEvent % "{Click, " (dx0:=Round(dx:=dx+x/s-dx0)) "," 
            . (dy0:=Round(dy:=dy+y/s-dy0)) ", 0, Rel}"
}
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

5

Re: AHK:[Dllcall] Вопрос по синтаксису Dllcall ("Sendinput"...)

Irbis:

F1::
MouseMove, 100, 600
Sleep, 1000

mouseXY(100,-100,10)
MouseGetPos, X1, Y1
Sleep, 1000

mouseXY(100,-100, 1000)
MouseGetPos, X2, Y2

MsgBox, % "Пройденный путь 1: " Round(((X1 - 100)**2 + (Y1 + (-600))**2)**0.5)
      . "`nПройденный путь 2: " Round(((X2 - X1)**2 + (Y2 + (-Y1))**2)**0.5)
Return

mouseXY(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) 
   }
}

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

6

Re: AHK:[Dllcall] Вопрос по синтаксису Dllcall ("Sendinput"...)

Как-то странно ведет себя DllCall("mouse_event"...
Если заменить на SendEvent, как предложил serzh82saratov, то при абсолютно том же алгоритме результат получается корректным.

7

Re: AHK:[Dllcall] Вопрос по синтаксису Dllcall ("Sendinput"...)

Функция mouse_event используется для интерпретации движений мыши. Можно провести такой эксперимент. Установим курсор примерно в центр экрана возле какой-либо точки, от которой можно вести отсчёт. Теперь сдвинем мышь (не курсор, а именно мышь) влево на сантиметр, но не сразу, а маленькими отдельными движениями. Курсор сдвигается влево на определённое расстояние, зависящее от системных настроек скорости мыши. Теперь сдвинем мышь (не курсор, а именно мышь) на то же расстояние вправо, только одним быстрым движением. Курсор не вернётся в исходную точку, а переместится гораздо правее. Вот здесь описан алгоритм расчёта движения курсора.

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

8

Re: AHK:[Dllcall] Вопрос по синтаксису Dllcall ("Sendinput"...)

teadrinker тяжело для не окрепшей психики, можешь выводы привести, а то не даётся...

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

9

Re: AHK:[Dllcall] Вопрос по синтаксису Dllcall ("Sendinput"...)

Вывод: winapi функции mouse_event и SendInput с указанием относительных координат не годятся для цели, обозначенной ТС.

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

10 (изменено: S.shipilov, 2014-07-14 17:24:46)

Re: AHK:[Dllcall] Вопрос по синтаксису Dllcall ("Sendinput"...)

teadrinker пишет:

Winapi функция SendInput также не предоставляет возможности управления скоростью перемещения курсора между двумя точками.

Спасибо. Далее вопрос имеет сугубо академический характер нежели практический поскольку основное пожелание к работе с Winapi  функцией SendInput не выполнимо.

11

Re: AHK:[Dllcall] Вопрос по синтаксису Dllcall ("Sendinput"...)

API_SendInputMouse(500, 500)

API_SendInputMouse(x, y)
{
   static INPUT_MOUSE := 0, MOUSEEVENTF_ABSOLUTE := 0x8000, MOUSEEVENTF_MOVE := 1
   
   VarSetCapacity(INPUT, SizeOfINPUT := A_PtrSize + 4*4 + 2*A_PtrSize)
   NumPut(INPUT_MOUSE, INPUT, "UInt")
   NumPut(Round(x/A_ScreenWidth*0xFFFF), INPUT, A_PtrSize, "UInt")
   NumPut(Round(y/A_ScreenHeight*0xFFFF), INPUT, A_PtrSize + 4, "UInt")
   NumPut(0, INPUT, A_PtrSize + 4*2, "UInt")
   NumPut(MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE, INPUT, A_PtrSize + 4*3, "UInt")
   NumPut(0, INPUT, A_PtrSize + 4*4, "UInt")
   NumPut(0, INPUT, A_PtrSize + 4*4 + A_PtrSize)
   
   DllCall("SendInput", UInt, 1, Ptr, &INPUT, Int, SizeOfINPUT)
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

12

Re: AHK:[Dllcall] Вопрос по синтаксису Dllcall ("Sendinput"...)

teadrinker пишет:
API_SendInputMouse(500, 500)

API_SendInputMouse(x, y)
{
   static INPUT_MOUSE := 0, MOUSEEVENTF_ABSOLUTE := 0x8000, MOUSEEVENTF_MOVE := 1
   
   VarSetCapacity(INPUT, SizeOfINPUT := A_PtrSize + 4*4 + 2*A_PtrSize)
   NumPut(INPUT_MOUSE, INPUT, "UInt")
   NumPut(Round(x/A_ScreenWidth*0xFFFF), INPUT, A_PtrSize, "UInt")
   NumPut(Round(y/A_ScreenHeight*0xFFFF), INPUT, A_PtrSize + 4, "UInt")
   NumPut(0, INPUT, A_PtrSize + 4*2, "UInt")
   NumPut(MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE, INPUT, A_PtrSize + 4*3, "UInt")
   NumPut(0, INPUT, A_PtrSize + 4*4, "UInt")
   NumPut(0, INPUT, A_PtrSize + 4*4 + A_PtrSize)
   
   DllCall("SendInput", UInt, 1, Ptr, &INPUT, Int, SizeOfINPUT)
}

прошу прощения, но каков должен быть результат запуска данного кода?

13

Re: AHK:[Dllcall] Вопрос по синтаксису Dllcall ("Sendinput"...)

Курсор должен быть перемещён в точку (500, 500) в экранных координатах. А у вас что получается?

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

14

Re: AHK:[Dllcall] Вопрос по синтаксису Dllcall ("Sendinput"...)

Добрый день.

teadrinker пишет:

Курсор должен быть перемещён в точку (500, 500) в экранных координатах. А у вас что получается?

Ничего не происходит.

15

Re: AHK:[Dllcall] Вопрос по синтаксису Dllcall ("Sendinput"...)

Обновите AHK.

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

16

Re: AHK:[Dllcall] Вопрос по синтаксису Dllcall ("Sendinput"...)

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

sy:= A_ScreenHeight*(990/1024)
sx:= A_ScreenWidth*(30/1280)
MouseGetPos x, y
MouseClick R, %sx%, %sy%, 1, 0
MouseMove %x%, %y%, 0

17

Re: AHK:[Dllcall] Вопрос по синтаксису Dllcall ("Sendinput"...)

Тимур, а какое отношение ваш вопрос имеет к этой теме?

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

18

Re: AHK:[Dllcall] Вопрос по синтаксису Dllcall ("Sendinput"...)

teadrinker, Просто похожие вопросы. Думал ответ легче будет найти в этой теме.  Наверное, будет лучше создать отдельную тему. Прошу прощения.