1

Тема: AHK: Вопрос по A_ScreenWidth

Здравствуйте, форумчане!

Вопрос следующий:
Имею скрипт, который должен исполнять одни и те же действия только по разным координатам в зависимости от разрешения экрана.
Иногда приходится меня разрешение программы на меньшее чем разрешение моего монитора (от чего она не на весь экран), а как мы знаем A_ScreenWidth проверяет именно размер монитора.
Можно ли как-то добавить проверку разрешения не монитора, а отдельного окна?

Заранее благодарен за Вашу обратную связь!

2

Re: AHK: Вопрос по A_ScreenWidth

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

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

3

Re: AHK: Вопрос по A_ScreenWidth

KusochekDobra

Перечитал и ru и eng статьи так и не понял как сделать проверку на размер разрешения окна, чтобы запустить то или иное действие. Может быть Ahk не может это сделать?

4

Re: AHK: Вопрос по A_ScreenWidth

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

Если хотите помощи, приведите пример кода. Как Вы пытались описать свою попытку.

5 (изменено: efremov30ev, 2020-05-12 16:11:38)

Re: AHK: Вопрос по A_ScreenWidth

KusochekDobra
Снова здравствуйте!
Вот данный код (максимально сократил и упростил для наглядности). Что только не пытался сделать, но все равно возвращаюсь к тому что нужно вручную выбирать параметр в ListBox'e. Все никак не могу научить его самого определять какое разрешение имеет запущенное окно и выполнять в зависимоти от разрешения ту или иную функцию

Gui, Font, ,
Gui, Add, ListBox, x20 y30 w75 h80 vList AltSubmit, 2560x1440|1920x1080
Gui, Add, Button, x122 y30 w60 h25 gFunction, Функция
Gui, Show, w205 h170, Window
Gui, Color, 4682B4
return

Function:
Gui, Submit, NoHide
if List=1
z:=1
if List=2
z:=2
y:=1
return

sc29::
if (y=1 and z=1)
Click 685, 580
sleep, 500
Click 685, 698

if (y=1 and z=2)
Click 369, 415
sleep, 500
Click 369, 530
return

6 (изменено: KusochekDobra, 2020-05-12 19:45:59)

Re: AHK: Вопрос по A_ScreenWidth

И Вам, здоровья!
В первом посте упоминается:

efremov30ev пишет:

Можно ли как-то добавить проверку разрешения не монитора, а отдельного окна?

В последнем примере нет ни намёка на взаимодействие с окном.

Чтобы не получилось так, что мы говорим о разных вещах, процитирую Вас, как я понял суть вопроса.

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

Если всё так, то обсуждение должно называться иначе, так как название не совсем, или даже совсем не отражает то, с чем у Вас возникли трудности.
Или перефразируйте пожалуйста так, чтобы было понятно.

Если всё же мне не показалось, то для взаимодействия с окнами, всегда требуются их идентификаторы. Узнать идентификатор нужного окна можно кликнув правой кнопкой мыши по иконке(в трее) любого запущенного AHK-сценария и выбрать в контекстном меню "Window Spy". Появится окошко, в верхней части которого, под "Window Title, Class and Process:" будет расположен блок, содержащий все идентификаторы активного окна. Кликните в любом месте нужного Вам окна и этот блок автоматически заполнится искомыми значениями в порядке:
- Заголовок окна.
- Класс окна.
- Процесс, которому принадлежит окно.
- Идентификатор процесса.

Выберите любую строчку с понравившимся идентификатором и поместите его в переменную сценария. Теперь, чтобы получить какие-либо данные о положении и размере окна, нужно передать имя этой переменной в качестве аргумента соответствующей встроенной функции AHK, работающей с окнами. Приведу пример с браузером Chrome:

#NoEnv
#SingleInstance, Force

chrome_window := "ahk_class Chrome_WidgetWin_1"

; Проверяем существование окна браузера Chrome
if (WinExist(chrome_window)) {
	; Окно найдено. Получаем его координаты и размер
	WinGetPos, x, y, w, h,% chrome_window
	MsgBox,Окно браузера найдено в координатах:`n`tx = %x%`n`ty = %y%`nЕго размеры составляют:`n`tширина = %w%`n`tвысота = %h%
} else {
	MsgBox,16,Ошибочка,Не удалось найти окно браузера Chrome.
}

Попробуйте применить это в своей поделке и приходите вновь, если что-то будет непонятно.

7 (изменено: efremov30ev, 2020-05-13 10:31:19)

Re: AHK: Вопрос по A_ScreenWidth

KusochekDobra

Приветствую!
Да, цель макроса нажимать на один и тот же элемент в программе в зависимости от разрешения экрана в котором она запущена. К примеру у меня монитор 2560х1440, но иногда приходится менять разрешение в программе отчего она становится не во весь экран. Автоматически научить макрос реагировать на разрешение окна, к сожалению, так и не выходит.
Делал следующие попытки и все равно не помогло:

Gui, Font, ,
Gui, Add, Button, x122 y30 w60 h25 gFunction, Функция
Gui, Show, w205 h170, Window
Gui, Color, 4682B4
return

prog_window := "ahk_class prog"

Function:
Gui, Submit, NoHide
if (WinExist(prog_window)) {
WinGetPos, , , 2560, 1440,% prog_window
z:=1
}
if (WinExist(prog_window)) {
WinGetPos, , , 1920, 1080,% prog_window
z:=2
}
y:=1
return

sc29::
if (y=1 and z=1)
Click 685, 580
Click 685, 698

if (y=1 and z=2)
Click 369, 415
Click 369, 530
return
Gui, Font, ,
Gui, Add, Button, x122 y30 w60 h25 gFunction, Функция
Gui, Show, w205 h170, Window
Gui, Color, 4682B4
return

Function:
Gui, Submit, NoHide
y:=1
return

sc29::
if (y=1)
if (WinExist(prog_window)) {
WinGetPos, , , 1920, 1080,% prog_window
Click 685, 580
Click 685, 698
}

if (y=1)
if (WinExist(prog_window)) {
WinGetPos, , , 1920, 1080,% prog_window
Click 369, 415
Click 369, 530
}
return

8

Re: AHK: Вопрос по A_ScreenWidth

Что значит "разрешение окна"?

9

Re: AHK: Вопрос по A_ScreenWidth

Тогда, возможно сделать всё даже проще. Сценарии AHK могут нажимать на кнопки программ, собранных из компонентов Windows. Примером такой программы может быть "Калькулятор". Следующий пример запускает калькулятор и через две секунды, с интервалом в одну секунду, нажимает цифровые кнопки от 1 до 0:


#NoEnv
#SingleInstance, Force
#Persistent

calc_class := "ahk_class CalcFrame"
button_number := 1
buttons := [7, 13, 18, 6, 12, 17, 5, 11, 16, 8]

RunWait, calc.exe

SetTimer, PressButton, -2000
Return

PressButton:
	ControlClick,% "Button" . buttons[ button_number++ ],% calc_class
	if ( button_number <= buttons.Count() )
		SetTimer, PressButton, -1000
	else
		ExitApp
Return

Дело в том, что такие кнопки тоже считаются своего рода "окнами" и имеют стандартизированные идентификаторы, которые так же можно найти при помощи "Window Spy". В случае примера выше, это идентификаторы состоящие из слова "Button" и следующей цифры, обозначающей порядковый номер, по счёту добавления в интерфейс. Например, цифра 1 на калькуляторе имеет идентификатор "Button7", а 2 = "Button13". Таким образом, ControlClick может отправлять событие клика таким элементам.

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

10 (изменено: serzh82saratov, 2020-05-14 03:15:25)

Re: AHK: Вопрос по A_ScreenWidth


sc29::
	WinGetPos, , , W, H,% prog_window 
	switch W "x" H
	{
		case "2560x1440": 
			Click 685, 580
			Click 685, 698
			
		case "1920x1080": 
			Click 369, 415
			Click 369, 530
			
		Default:
			MsgBox нет такого разрешения
	}
	return
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

11

Re: AHK: Вопрос по A_ScreenWidth

KusochekDobra
serzh82saratov
Спасибо, друзья!
Все получилось, оказалось было все просто, нужно было сделать как serzh82saratov показал.