1 (изменено: Alexey_cake, 2021-10-01 10:19:47)

Тема: AHK: Имитация Lazymouse (Zbrush)

Здравствуйте. Хочу спросить экспертного мнения, возможно-ли сделать на ahk аналог следующего:

Постараюсь объяснить более-менее понятно, извините, я дилетант.
В графическом редакторе Zbrush есть такой инструмент, называется Lazymouse. Смысл в том, что при нажатии и удерживании LButton, курсор запоминает своё местоположение (назовем его Pos_1) и прикрепляет от Pos_1 к самому себе некий "поводок", длина которого в пикселях заранее указывается в .ini файле. Далее теперь при движении курсора, поводок постепенно "натягивается", и при предельном натяжении (которое указано в .ini), Pos_1 начинает двигаться за курсором, одновременно имитируя нажатую LButton (ну то есть рисует).

Это подобно тому, как будто тянешь камень за нитку по песку, и при движении он оставляет за собой след.

При отпускании LButton, Pos_1 сбрасывается.

Это очень интересная техника, которая позволяет сгладить микродвижения мыши, позволяя рисовать ровные линии.
Я думал сделать что-то подобное для 2D редакторов на ahk с помощью таймеров, запоминания позиций и тд, но что-то совсем запутался. Поэтому решил спросить тут, может я бьюсь об стену? Может заодно дам кому пищу для ума.

Спасибо за внимание.

2

Re: AHK: Имитация Lazymouse (Zbrush)

подобное для 2D редакторов

  Для всех сразу или для начала для какого-то одного конкретного?

3

Re: AHK: Имитация Lazymouse (Zbrush)

Foma пишет:

подобное для 2D редакторов

  Для всех сразу или для начала для какого-то одного конкретного?

Это не играет роли. Холст может быть любым, хоть Paint, хоть что угодно. Смысл везде один.

4

Re: AHK: Имитация Lazymouse (Zbrush)

Интересная идея, но, думаю, реализовать такое извне приложения, в котором собираемся рисовать, не получится, так как если перехватывать движения мыши, то и координаты не будут изменяться.

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

5

Re: AHK: Имитация Lazymouse (Zbrush)

А перехватывать необязательно.
Можно заменять системный курсор на точку и пририсовывать свой.

6

Re: AHK: Имитация Lazymouse (Zbrush)

Не очень понял идею, а что это даст? Приложение будет реагировать на события мыши, реальные или инжектированные.

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

7

Re: AHK: Имитация Lazymouse (Zbrush)

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

8

Re: AHK: Имитация Lazymouse (Zbrush)

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

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

9

Re: AHK: Имитация Lazymouse (Zbrush)

Ну он и будет рисовать.
Ты все время и управляешь задним, а передний это просто картинка.
Мы сравниваем позицию переднего и заднего и в зависимости от нее рисуем точку или не рисуем.

10

Re: AHK: Имитация Lazymouse (Zbrush)

А передним кто будет управлять?

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

11

Re: AHK: Имитация Lazymouse (Zbrush)

Автор вопроса. Вместе с задним.

12

Re: AHK: Имитация Lazymouse (Zbrush)

Только задний будет спрятан.

13

Re: AHK: Имитация Lazymouse (Zbrush)

Я не понимаю твою мысль. Напиши код, хук, если нужно, есть в Коллекции.

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

14

Re: AHK: Имитация Lazymouse (Zbrush)

Код лень писать. Идею вечером покажу. Сейчас не у компа.

15

Re: AHK: Имитация Lazymouse (Zbrush)

Алгоритм такой.
Нажимаем на кнопку Lazymouse, нажимаем левую кнопку мыши, прячем курсор, рисуем картинку курсора и точку.
После чего при каждом движении мыши сравниваем разность позициий курсора и точки.
Если она нас удовлетворяет посылаем нажатие левой кнопки мыши (рисуем).
Сам бы написал евро за 200.

16

Re: AHK: Имитация Lazymouse (Zbrush)

А что за кнопка Lazymouse?

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

17

Re: AHK: Имитация Lazymouse (Zbrush)

Ну это я образно назвал, кнопку активации подобного режима.

18

Re: AHK: Имитация Lazymouse (Zbrush)

Malcev пишет:

Если она нас удовлетворяет посылаем нажатие левой кнопки мыши

Ну и будет рисовать в позиции реального курсора, а нужно-то в позиции задней точки.

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

19

Re: AHK: Имитация Lazymouse (Zbrush)

Так мы сместим невидимый курсор на позицию задней точки.
А позицию видимого курсора оставим на месте.

20

Re: AHK: Имитация Lazymouse (Zbrush)

В смысле — сместим? Задача такая: мышь двигается, как обычно, за ней на некотором расстоянии двигается задняя точка (где происходит рисование), но не повторяя движения мыши, а всегда по кратчайшему пути, что сглаживает линию. Не важно, где находится картинка курсора, и видим он, или нет. Важен сам принцип.

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

21

Re: AHK: Имитация Lazymouse (Zbrush)

Так я про него и говорю.
У нас есть невидимый реальный курсор и 2 картинки точка и стрелка.
Этими двумя картинками мы и опереруем в зависимости от их положения по отношению друг к другу.
Сам рисунок передается в окно через wm_setcursor+wm_lbuttondown, которые мы тоже можем посылать когда нам захочется.

22

Re: AHK: Имитация Lazymouse (Zbrush)

А что помешает приложению посылать эти сообщения для реального курсора?

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

23

Re: AHK: Имитация Lazymouse (Zbrush)

Мы. Хуком или созданием своего окна поверх нужного.

24

Re: AHK: Имитация Lazymouse (Zbrush)

Если имеешь в виду хук на WM_MOUSEMOVE, то курсор просто не будет двигаться. Если окно поверх нужного будет в фокусе (активным) — рисовать скорее всего не будет.

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

25

Re: AHK: Имитация Lazymouse (Zbrush)

teadrinker пишет:

Если имеешь в виду хук на WM_MOUSEMOVE

Я имею в виду WH_GETMESSAGE.

teadrinker пишет:

Если окно поверх нужного будет в фокусе (активным) — рисовать скорее всего не будет.

Надо пробовать, просто мне эта тема неинтересна.

26

Re: AHK: Имитация Lazymouse (Zbrush)

Malcev пишет:

Я имею в виду WH_GETMESSAGE

А как на AHK его установить?

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

27

Re: AHK: Имитация Lazymouse (Zbrush)

Скомпилировать dll.
https://www.autoitscript.com/forum/topi … owshookex/

28

Re: AHK: Имитация Lazymouse (Zbrush)

Если окно поверх нужного будет в фокусе (активным) — рисовать скорее всего не будет

Только что проверил - ControlClick в Paint работает.

29

Re: AHK: Имитация Lazymouse (Zbrush)

Насколько я понимаю, для рисования WM_MOUSEMOVE нужно передавать. Сомневаюсь, что при неактивном окне будет работать.

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

30 (изменено: Malcev, 2021-10-01 21:44:45)

Re: AHK: Имитация Lazymouse (Zbrush)

В пейнте достаточно передавать WM_LBUTTONDOWN в цикле и можно не активировать.

31

Re: AHK: Имитация Lazymouse (Zbrush)

Да, но тогда начинает рисовать даже сквозь промежуточное окно.

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

32

Re: AHK: Имитация Lazymouse (Zbrush)

Что ты имеешь в виду?

33

Re: AHK: Имитация Lazymouse (Zbrush)

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

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

34

Re: AHK: Имитация Lazymouse (Zbrush)

Почему? Мы создаем окно с изображением пейнта поверх пейнта и проверяем нужно ли посылать WM_LBUTTONDOWN в пейнт.
Если нужно, то посылаем + обновляем наше окно.

35

Re: AHK: Имитация Lazymouse (Zbrush)

Звучит сложно. В общем мне кажется, что всё это в реальности будет работать криво. Но у тебя есть шанс меня переубедить.

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

36

Re: AHK: Имитация Lazymouse (Zbrush)

teadrinker пишет:

В общем мне кажется, что всё это в реальности будет работать криво

Возможно.
Поэтому лично мне было бы неинтересно и утомительно заниматься таким заданием.
Может топик-стартер возьмет какие-нибудь идеи из нашего разговора и попытается их воплотить.

37

Re: AHK: Имитация Lazymouse (Zbrush)

Хотя нет, воспользуюсь шансом.
Переубеждаю.
https://lazynezumi.com/

38

Re: AHK: Имитация Lazymouse (Zbrush)

Теперь верю. Но на чистом AHK всё же решения нет из-за невозможности перехвата сообщений без dll.

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

39

Re: AHK: Имитация Lazymouse (Zbrush)

Ради интереса поставил, вижу там инжект dll делается. Пока действительно криво получается:
 
 https://i.imgur.com/Mb3Ah92.png

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

40

Re: AHK: Имитация Lazymouse (Zbrush)

Как я и писал можно и без хука.

x := 0
y := 200
w := 500
h := 500
global hpaint := 0x34094e

OnMessage(0x200, "WM_MOUSEMOVE")
OnMessage(0x201, "WM_LBUTTONDOWN")
OnMessage(0x202, "WM_LBUTTONUP")
Gui, +HWNDhGui +AlwaysOnTop
DllCall("GetWindowBand", "ptr", hGui, "uint*", band)
Gui, Destroy
hGui := ""
if (band = 1)
{
   If (A_PtrSize = 8)
      RunWait "C:\Program Files\AutoHotkey\AutoHotkeyU64_UIA.exe" "%A_ScriptFullPath%"
   Else If A_IsUnicode
      RunWait "C:\Program Files\AutoHotkey\AutoHotkeyU32_UIA.exe" "%A_ScriptFullPath%"
   Else
      RunWait "C:\Program Files\AutoHotkey\AutoHotkeyA32_UIA.exe" "%A_ScriptFullPath%"
}
#SingleInstance Force
SetBatchLines -1
SetWinDelay -1
OnExit, Uninitialize 
Gui, +HWNDhGui -DPIScale -Caption +AlwaysOnTop +E0x02000000 +E0x00080000 ;  WS_EX_COMPOSITED := E0x02000000  WS_EX_LAYERED := E0x00080000
Gui, Show, x%x% y%y% w%w% h%h% NA

DllCall("LoadLibrary", "str", "magnification.dll")
DllCall("magnification.dll\MagInitialize")
hChildMagnifier := DllCall("CreateWindowEx", "UInt", 0, "Str", "Magnifier", "Str", "MagnifierWindow", "UInt", WS_CHILD := 0x40000000|4, "Int", 0, "Int", 0, "Int", w, "Int", h, "Ptr", hGui, "UInt", 0, "Ptr", DllCall("GetWindowLong" (A_PtrSize=8 ? "Ptr" : ""), "Ptr", hGui, "Int", GWL_HINSTANCE := -6 , "ptr"), "UInt", 0, "ptr")
WinShow, ahk_id %hChildMagnifier%
Loop
{
   if (A_PtrSize = 8)
   {
      VarSetCapacity(RECT, 16, 0)
      NumPut(x, RECT, 0, "Int")
      NumPut(y, RECT, 4, "Int")
      NumPut(w, RECT, 8, "Int")
      NumPut(h, RECT, 12, "Int")
      DllCall("magnification.dll\MagSetWindowSource", "Ptr", hChildMagnifier, "Ptr", &RECT)
   }
   else
      DllCall("magnification.dll\MagSetWindowSource", "Ptr", hChildMagnifier, "Int", x, "Int", y, "Int", w, "Int", h)
}
Return 

Uninitialize: 	
DllCall("magnification.dll\MagUninitialize")
ExitApp

WM_LBUTTONDOWN(wParam, lParam, Msg, hWnd)
{
   Critical
   PostMessage, Msg, wParam, lParam,, ahk_id %hpaint%
}

WM_LBUTTONUP(wParam, lParam, Msg, hWnd)
{
   Critical
   PostMessage, Msg, wParam, lParam,, ahk_id %hpaint% 
}

WM_MOUSEMOVE(wParam, lParam, Msg, hWnd)
{
   Critical
   PostMessage, Msg, wParam, lParam,, ahk_id %hpaint%
}

41

Re: AHK: Имитация Lazymouse (Zbrush)

У меня это не работает, просто мышь начинает глючить. Кроме того, не очень понимаю, почему это вообще должно работать — где у тебя вычисление координат видимой мыши?

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

42

Re: AHK: Имитация Lazymouse (Zbrush)

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

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

43

Re: AHK: Имитация Lazymouse (Zbrush)

У меня такого не наблюдается.
Но например с фотошопом таким способом не получится, так как перед посылом левой кнопки мыши его надо активировать.
Так что инжектить dll наиболее верный вариант.

44 (изменено: Foma, 2021-10-02 18:08:58)

Re: AHK: Имитация Lazymouse (Zbrush)

с фотошопом таким способом не получится

Потому я и спрашивал, для какого приложения. Для всех сразу - много совсем другой работы, не связанной с самим алгоритмом.

45

Re: AHK: Имитация Lazymouse (Zbrush)

Malcev пишет:

Может топик-стартер возьмет какие-нибудь идеи из нашего разговора и попытается их воплотить.

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

Foma пишет:

с фотошопом таким способом не получится

Потому я и спрашивал, для какого приложения. Для всех сразу - много совсем другой работы, не связанной с самим алгоритмом.

Ну хотя бы для начала начать с простого, с Paint.

46 (изменено: Foma, 2021-10-04 10:00:08)

Re: AHK: Имитация Lazymouse (Zbrush)

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

47 (изменено: Alexey_cake, 2021-10-04 15:15:17)

Re: AHK: Имитация Lazymouse (Zbrush)

Foma, я вообще пошёл путём самурая:

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

В программировании я очень слаб, поэтому вывел формулу в excel (не смеяться. Я сказал не смеяться!), с помощью которой подобная идея работает.

Далее идея состояла в том, чтобы разница между координатами курсора и координатами "рисующего" курсора была Offset'ом для имитации LButton, чтобы там шла линия. Пока искал как это сделать, нашёл необходимый готовый инструмент на Github'e, так что кажется это уже не актуально.

Но всё равно всем спасибо за подсказки и внимание к теме.

Post's attachments

5p6u3z.gif
5p6u3z.gif 248.69 kb, 1 downloads since 2021-10-04 

You don't have the permssions to download the attachments of this post.

48

Re: AHK: Имитация Lazymouse (Zbrush)

Alexey_cake пишет:

нашёл необходимый готовый инструмент на Github'e

Нашли — поделитесь.

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

49 (изменено: teadrinker, 2021-10-04 16:12:44)

Re: AHK: Имитация Lazymouse (Zbrush)

Если разрешено давать ссылки, тогда пожалуйста, вот - https://github.com/stoicshark/silkyshark/releases.
(Не Ahk, но именно то, что нужно.)

50

Re: AHK: Имитация Lazymouse (Zbrush)

Спасибо, только изучите правила оформления, обратите внимание на избыточное цитирование, оформление ссылок и точки в конце предложений. Я отредактировал ваш пост.

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

51 (изменено: Malcev, 2021-10-04 19:47:50)

Re: AHK: Имитация Lazymouse (Zbrush)

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

52

Re: AHK: Имитация Lazymouse (Zbrush)

Пока не было времени посмотреть, но там требования Windows 8.1, Windows 10, так что может не так всё просто.

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

53

Re: AHK: Имитация Lazymouse (Zbrush)

Но это как-раз несложно проверить тому у кого она есть.
Вон у пользователя на семерке везде работает, кроме как в фотошопе.
https://www.reddit.com/r/photoshop/comm … oshop_cs6/

54

Re: AHK: Имитация Lazymouse (Zbrush)

Да, проверил на семёрке, в пайнте работает.

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