1

Тема: AHK: Скрипт для перевода координат на другое разрешение

My_ScreenWidth := 1920
My_ScreenHeight := 1080

InputBox, UserInput
Return

F1::                                                               ; Перевод по ширине
x := ((%UserInput%*674)/100)+668                       ; Получаем координату на моем разрешении
MsgBox, Координата на Вашем разрешении(%My_ScreenWidth%) = %x%. Сейчас скрипт переведет координату на другое разрешение.. 
x2 := (%My_ScreenWidth%*%x%)/A_ScreenWidth    ; Переводим координату на другом разрешении
MsgBox, Ваша координата %x% успешно переведена и ее значение на Вашем разрешении = %x2%
Return



; Формула: (Мое разрешение*Координата)/Другое разрешение = Получаем значение координаты как она находилась бы на другом разрешении

Столкнулся с несколькими проблемами:
1) При вводе нецелого числа выдает ошибку (если писать 1.1 или 1,1)
2) Если вводить целое число, то в MsgBox переменная x - пустая
А также хочу спросить - будет ли такой перевод верен? Например, я получил координаты середины пуска на разрешении 1920 на 1080 и в соотношении сторон 16:9. Затем я запустил скрипт на разрешении 1280 на 960 с соотношением 4:3. Я получу точную координату центра пуска на разрешении 1280х960 с соотношением 4:3?

2 (изменено: Alectric, 2014-07-31 16:27:55)

Re: AHK: Скрипт для перевода координат на другое разрешение

В выражениях не нужно использовать знаки процента "%".

My_ScreenWidth := 1920
My_ScreenHeight := 1080

InputBox, UserInput
Return

F1::                                                               ; Перевод по ширине
x := ((UserInput*674)/100)+668                       ; Получаем координату на моем разрешении
MsgBox, Координата на Вашем разрешении(%My_ScreenWidth%) = %x%. Сейчас скрипт переведет координату на другое разрешение.. 
x2 := (My_ScreenWidth*x)/A_ScreenWidth    ; Переводим координату на другом разрешении
MsgBox, Ваша координата %x% успешно переведена и ее значение на Вашем разрешении = %x2%
Return

Вот простой пример:

a=30
b=a
c:=%b%
msgbox,%a%`n%b%`n%c%

Можно использовать в работе с массивами.


Странникх пишет:

я получил координаты середины пуска...

Имеется ввиду кнопка "Пуск"?

Win 10 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

3 (изменено: Странникх, 2014-07-31 16:34:40)

Re: AHK: Скрипт для перевода координат на другое разрешение

Спасибо, немного подправил.

To_ScreenWidth := 1280
To_ScreenHeight := 960
Return

F1::                            ; Перевод по ширине
InputBox, Coord_Width
x := ((Coord_Width*674)//100)+668            ; Получаем координату на моем разрешении по заданной формуле
MsgBox, Координата на Вашем разрешении(%A_ScreenWidth%) = %x%. Теперь AHK переведет ее на разрешение %To_ScreenWidth%..
x2 := (A_ScreenWidth*x)//To_ScreenWidth            ; Переводим координату на другое разрешение
MsgBox, Ваша координата %x% успешно переведена и ее значение на разрешении(%To_ScreenWidth%) = %x2%
Return



; Формула: (Мое разрешение*Координата)/Другое разрешение = Получаем значение координаты как она находилась бы на другом разрешении

Скрипт почему-то не округляет числа. Если есть число 668,999, то он его выдаст как 668, а не 669. По правилам округления если остаток 5 или больше, то округлить (прибавить к целому +1), если 4 или меньше, то не округлять.
Даже если убрать двойную // и поставить одиночную / , то все равно в остатке мы не будем видеть настоящий остаток, только нули.

Имеется ввиду кнопка "Пуск"?

Да, это самый просто пример.

4 (изменено: Alectric, 2014-07-31 16:47:09)

Re: AHK: Скрипт для перевода координат на другое разрешение

Странникх пишет:

Да, это самый просто пример.

По моему проще воспользоваться "wingetpos".

И откуда взято это число: +668? И это: *674?

Win 10 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

5 (изменено: Странникх, 2014-07-31 16:52:08)

Re: AHK: Скрипт для перевода координат на другое разрешение

Что-то не пойму, как "wingetpos" поможет мне в этом. Если у нас есть такой код:

PixelSearch,,,  1600 , 1000 , 1700 , 1100 , 0x3C3EEE    
if ErrorLevel = 0

А разрешение на другом компьютере 1280х960, где мы хотим запустить такой же код. Как в этом случае перевести через "wingetpos"?
Я не вижу лучшего решения, чем переписать все координаты по этой формуле. Хочу перенести скрипты на ноутбук со стационарного компьютера, а на ноуте другое разрешение. Не будете же вы искать на ноуте вручную каждое разрешение и месторасположение каких-то нужных вам участков на экране.

И откуда взято это число: +668? И это: *674?

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

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

6 (изменено: Alectric, 2014-07-31 16:53:14)

Re: AHK: Скрипт для перевода координат на другое разрешение

Странникх пишет:

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

А "PixelSearch" разве не сделает это за Вас?

Или Вы про участки...

Win 10 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

7

Re: AHK: Скрипт для перевода координат на другое разрешение

А "PixelSearch" разве не сделает это за Вас?

Как Вы представляете себе искать в местах 1600 , 1000 , 1700 , 1100, когда разрешение компьютера, где запущен скрипт всего лишь 1280х960?

8

Re: AHK: Скрипт для перевода координат на другое разрешение

Понятно. Вам просто нужна формула "масштаба", в зависимости от старого разрешения к новому.

Win 10 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

9

Re: AHK: Скрипт для перевода координат на другое разрешение

Так вот же она:

; Формула: (Мое разрешение*Координата)/Другое разрешение = Получаем значение координаты как она находилась бы на другом разрешении

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

10 (изменено: Alectric, 2014-07-31 17:08:46)

Re: AHK: Скрипт для перевода координат на другое разрешение

Вот формула:

x := To_ScreenWidth/A_ScreenWidth*Coord_Width
координата=старое разрешение/новое разрешение*старая координата

Перепутал, нужно наоборот:

x := A_ScreenWidth/To_ScreenWidth*Coord_Width
координата=новое разрешение/старое разрешение*старая координата

А насчет округления - думаю 1 пиксель роли не сыграет.

Win 10 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

11 (изменено: Странникх, 2014-07-31 17:16:55)

Re: AHK: Скрипт для перевода координат на другое разрешение

Если искать строго в одном участке, то разница колоссальная, поэтому округление нужно.
Например, слева у вас синий цвет, справа красный. Все это в разности в 1 пиксель.

По формуле так корректнее:


; To_ScreenWidth - Новое разрешение
; A_ScreenWidth - Старое разрешение
x := To_ScreenWidth/A_ScreenWidth*Coord_Width
координата=новое разрешение/старое разрешение*старая координата

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

12 (изменено: Alectric, 2014-07-31 17:16:45)

Re: AHK: Скрипт для перевода координат на другое разрешение

В смене разрешения тоже будет разница по смещениям пикселей.
Функция округления:

Round(x)
Win 10 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

13 (изменено: Странникх, 2014-07-31 17:20:18)

Re: AHK: Скрипт для перевода координат на другое разрешение

Цвет кнопки Пуск не меняется если одна и та же ОС, просто меняются координаты, в котором находится этот цвет. Сама кнопка уменьшается по масштабу пропорционально сетке пикселей.

14 (изменено: Alectric, 2014-07-31 17:27:10)

Re: AHK: Скрипт для перевода координат на другое разрешение

Думаю Ваша проблема решена...

OFF: Но лучше всего писать скрипты как можно более универсальные, использовать опорные точки которые есть в любом разрешении экрана.

Win 10 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

15

Re: AHK: Скрипт для перевода координат на другое разрешение

Не решена..

To_ScreenWidth := 1920
To_ScreenHeight := 960
Return

F1::                            ; Перевод по ширине
InputBox, Coord_Width
x := ((Coord_Width*674)/100)+668            ; Получаем координату на моем разрешении по заданной формуле
Round(x, 1)
MsgBox, Координата на Вашем разрешении(%A_ScreenWidth%) = %x%. Теперь AHK переведет ее на разрешение %To_ScreenWidth%..
x2 := (A_ScreenWidth*x)/To_ScreenWidth            ; Переводим координату на другое разрешение
Round(x2, 1)
MsgBox, Ваша координата %x% успешно переведена и ее значение на разрешении(%To_ScreenWidth%) = %x2%
Return

F2::
MsgBox, %x2%
Return

; Формула: (Мое разрешение*Координата)/Другое разрешение = Получаем значение координаты как она находилась бы на другом разрешении

Использую такой код для теста, пишу 4.45 , а функция "Round" не округляет.

16

Re: AHK: Скрипт для перевода координат на другое разрешение

Забыл как функциями пользоваться, извиняюсь...

x:=Round(x)
Win 10 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

17

Re: AHK: Скрипт для перевода координат на другое разрешение

; Перевести на:
To_ScreenWidth := 1280
To_ScreenHeight := 960
Return

F1::                            ; Перевод по ширине
clipboard =                         ; Очищаем буфер
Send ^{vk0x43}                        ; Координата заносится в буфер
ClipWait, 2
if ErrorLevel = 1
MsgBox, Ошибка с буфером
if ErrorLevel = 0
coord := To_ScreenWidth/A_ScreenWidth*clipboard        ; Координата переводится на позиционирование на другом разрешении
coord := Ceil(coord)                    ; Координата округляется
clipboard = %coord%                    ; Переведенная координата заносится в буфер
Send ^{vk0x56}                        ; Вставка
Return

F2::                            ; Перевод по высоте
clipboard =                         ; Очищаем буфер
Send ^{vk0x43}                        ; Координата заносится в буфер
ClipWait, 2
if ErrorLevel = 1
MsgBox, Ошибка с буфером
if ErrorLevel = 0
coord := To_ScreenHeight/A_ScreenHeight*clipboard    ; Координата переводится на позиционирование на другом разрешении
coord := Ceil(coord)                    ; Координата округляется
clipboard = %coord%                    ; Переведенная координата заносится в буфер
Send ^{vk0x56}                        ; Вставка
Return


; Формула:
; координата=новое разрешение/старое разрешение*старая координата

Сделал один из самых простых вариантов для удобности переписи координат.
Суть: выделяем значение координаты и ждем (F1 - для изменение по ширине, F2 - для изменения по высоте)

Было бы потрясающе если кто-нибудь сделал бы так: выделяем целую строку (например, 1920, 1080, 1920, 1080), потом жмем 1 кнопку и скрипт автоматически меняет значения 1920 по ширине, 1080 по высоте. Естественно на практике будут цифры разные, но по синтаксису они отделяются запятой.

18 (изменено: Alectric, 2014-08-01 12:13:45)

Re: AHK: Скрипт для перевода координат на другое разрешение

Используй цикл и дописывание.
"A_index" используй для определения "X" и "Y".

Loop,parse,clipboard,`,
{
  msgbox,% a_loopfield "`n" a_index
  outvar.=", " . a_loopfield
}
Win 10 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

19 (изменено: serzh82saratov, 2014-08-01 14:37:58)

Re: AHK: Скрипт для перевода координат на другое разрешение

Странникх

Цвет кнопки Пуск не меняется если одна и та же ОС, просто меняются координаты, в котором находится этот цвет. Сама кнопка уменьшается по масштабу пропорционально сетке пикселей.

Циферки подогнать можно. Но Вы же их используете в командах типа PixelSearch. Вот только в "нормальном исполнении", практически всегда в них используются переменные полученные командами типа WinGetPos, как вам уже правильно подсказали, а не координаты заданные заранее.
Приведите хоть один реальный пример, в котором необходимо заранее прописывать координаты относительно экрана.

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

20 (изменено: Странникх, 2014-08-01 14:56:15)

Re: AHK: Скрипт для перевода координат на другое разрешение

serzh82saratov, не уловил мысли. У меня больше 30 команд, в которых фигурируют точные координаты и цвет с этими точными координатами. Как WinGetPos поможет трансформировать, к примеру, координату 1600, 1000 (с разрешения 1920х1080) на разрешение 1366х768?

21 (изменено: serzh82saratov, 2014-08-01 15:34:46)

Re: AHK: Скрипт для перевода координат на другое разрешение

Вот вам для понимания, пример нахождения центра кнопки пуск при любом разрешении:

 
CoordMode, Mouse
WinGetPos, X, Y, W, H, ahk_class Button ahk_exe explorer.exe
MouseMove, X+W/2, Y+H/2

У меня больше 30 команд, в которых фигурируют точные координаты

Тем более будет просто всё же ответить на вопрос:

Приведите хоть один реальный пример, в котором необходимо заранее прописывать координаты относительно экрана.

Как WinGetPos поможет трансформировать, к примеру, координату 1600, 1000 (с разрешения 1920х1080) на разрешение 1366х768?

Мысль о том что трансформировать ничего надо, видимо вызывает когнитивный диссонанс, но всё же подумайте.

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

22 (изменено: Странникх, 2014-08-01 16:06:27)

Re: AHK: Скрипт для перевода координат на другое разрешение

Да, так более понятно. Вы получаете через x,y координату верхнего левого угла, через W, H ширину и высоту (это как координата правого нижнего угла). Затем все делите пополам и попадаете в центр. Таким образом делая масштабирование абсолютно на любом компьютере без указания координат.

Все, конечно, классно, но у меня окно не имеет отдельных объектов, с которых можно было бы получить отдельные участки, как с кнопкой Пуск. У меня окно соответствует разрешению моего монитора и на нем много координат, которые необходимо масштабировать пропорционально другому разрешению. Например, вот координата 1600 по ширине разрешения 1920х1080, как мне ее найти через WinGetPos на разрешении 1366х768?

Add:
1600=0+1920/1.2
1600=x+W/1.2
Кажется так получается..

23

Re: AHK: Скрипт для перевода координат на другое разрешение

Ну так не должно быть 1600!
Должно быть изначально 0.83, коэфициент относительно окна!


WinGetPos, X, Y, W, H, ahk_class Notepad
MsgBox % x := Round(W / 0.83)
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

24

Re: AHK: Скрипт для перевода координат на другое разрешение

Тогда не понятно. Если x,y = 0, почему коэффициент 0.83, а не 1.2?

25

Re: AHK: Скрипт для перевода координат на другое разрешение

А почему 1.2, а не 0.83.
Может потому что 1600 меньше 1920.

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

26

Re: AHK: Скрипт для перевода координат на другое разрешение

serzh82saratov, тогда м.б. все же *0.83, а не /0.83?

27

Re: AHK: Скрипт для перевода координат на другое разрешение

Ну да, конечно умножить, очепятался.

MsgBox % x := Round(W * 0.83)
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

28

Re: AHK: Скрипт для перевода координат на другое разрешение

Я переформулирую свой вопрос - почему нужно делить 1600 на 1920, а не наоборот? При 1.2 и 0.83 одно и тоже получается.

29

Re: AHK: Скрипт для перевода координат на другое разрешение

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

30

Re: AHK: Скрипт для перевода координат на другое разрешение

Просто так намного понятнее, 0.25 первая четверть, 0.5 половина, 0.75 три четверти. 0.83 правее трёх четвертей, это сразу понятно, а 1.2 тяжело понять где это.

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

31

Re: AHK: Скрипт для перевода координат на другое разрешение

А число 1600 при переводе на другое разрешение будет одним и тем же если его делить и на 1.2 и на 0.83? Или тут играет роль что на что делить?

32

Re: AHK: Скрипт для перевода координат на другое разрешение

Ммм... Что?

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

33

Re: AHK: Скрипт для перевода координат на другое разрешение

Есть координата 1600 по ширине с монитора 1920на1080 разрешения. Я хочу перевести эту координату на другое разрешение 1366на768.
Координата 1600 выглядит как = Round(W * 0.83) или Round(W * 1.2), то есть на текущем (моем) мониторе как 1920*0.83 или 1920*1.2, соответственно 1366*1.2 или 1366*0.83. С 1366*1.2 получается больше 1366. С 1366*0.83 получается 1133.78 ~= 1134. 1134 будет истинным или нужно искать другой коэффициент?

34

Re: AHK: Скрипт для перевода координат на другое разрешение

Ну вы же сами видите что 1134 это правильно.

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

35 (изменено: Странникх, 2014-08-01 19:44:46)

Re: AHK: Скрипт для перевода координат на другое разрешение

Коэффициент немного разный, вот и спрашиваю. 1600\1920 = 0.8333 , 1134\1366 = 0.8301. Round округляет с .5 , сотые, тысячные и т.д. берутся в расчет?

36

Re: AHK: Скрипт для перевода координат на другое разрешение

Зачем спрашивать, поместите в функцию разные числа, и увидите сами.

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

37

Re: AHK: Скрипт для перевода координат на другое разрешение

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

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

38 (изменено: serzh82saratov, 2014-08-01 20:35:15)

Re: AHK: Скрипт для перевода координат на другое разрешение

Отредактировано Странникх (Сегодня 19:44:46) пишет:

Round округляет с .5 , сотые, тысячные и т.д. берутся в расчет?

В (даже) русском хелпе написано:

параметр Number округляется до ближайшего целого числа.

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

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

39 (изменено: Странникх, 2014-08-01 20:45:42)

Re: AHK: Скрипт для перевода координат на другое разрешение

Попробовал перенести тестовый скрипт на ноутбук:


WinGetPos, Xm, Ym, Wm, Hm, ahk_class NAME
NumPad2::
PixelSearch,,, Round(Wm*0.0098958333333333), Round(Hm*0.7407407407407407), Round(Wm*0.0098958333333333), Round(Hm*0.7407407407407407), 0x333333,, fast
if !ErrorLevel
MsgBox, Успешно!
Return

И все координаты прекрасно работают!

WinGetPos в цикл тогда напишу, а то если запустить скрипт с отсутствием ahk_class NAME, то WinGetPos вначале скрипта бесполезен будет после запуска ahk_class NAME.

40 (изменено: serzh82saratov, 2014-08-09 02:58:09)

Re: AHK: Скрипт для перевода координат на другое разрешение

В принципе вся эта относительность действительно может иногда понадобится.
Потому в AhkSpy добавил строку "Relative pos to a window".

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

41

Re: AHK: Скрипт для перевода координат на другое разрешение

SetWorkingDir %A_ScriptDir%

text := "PixelSearch,,,"
P := "`," 
O := ";"
Name := "A_RESULT"
Name_Title := "A_RESULT.txt"

vkC0::    ; ~(Ё)
{
MouseGetPos, MouseX, MouseY

WinGetActiveTitle, Title
WinGetPos, Xm, Ym, Wm, Hm, %Title%
InputBox, UserInput

PixelGetColor, color, %MouseX%, %MouseY%

xvar := MouseX/A_ScreenWidth
yVar := MouseY/A_ScreenHeight

x = Round((Xm+Wm)*%xVar%)
y = Round((Ym+Hm)*%yVar%)

FileAppend, %text% %x%%P% %y%%P% %x%%P% %y%%P% %color%%P%%P% fast        %O% (%MouseX%%P% %MouseY%) %UserInput%, %Name_Title%
FileAppend, `nif ErrorLevel = 0, %Name_Title%
FileAppend, `n`n, %Name_Title%

Process, Close, %PID1%    
Run, %Name%.txt,, Min, PID1

WinActivate, %Title%
}
Return

Дописал скрипт, чтобы на будущее "фотографировать" пиксели с алгоритмом масштабирования. Можете дополнить если есть какие идеи.

42

Re: AHK: Скрипт для перевода координат на другое разрешение

А что тут по задумке надо писать в InputBox ?

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

43

Re: AHK: Скрипт для перевода координат на другое разрешение

Комментарий после "; (координаты)" , чтобы проще было ориентироваться к чему относится данный пиксель.