Тема: AHK: Проверка и изменение масштаба и разверстки
Как проверить, что значение не 100% и его поменять на 100% если истина?
http://prntscr.com/i3z7z9
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Как проверить, что значение не 100% и его поменять на 100% если истина?
http://prntscr.com/i3z7z9
stealzy, я догадывался что через MSDN в принципе, но не умею им пользоваться. Предполагаю SendMessage нужен тут? А как текущее значение получить в переменную установленного размера?
Поиском тоже пользовался, такой вопрос не поднимался.
Как не поднимался, я даже проверил прежде чем писать: "Масштаб" - одна тема на этом форуме. Ну или куча тем в гугле, если перевести на ангийский.
Действительно поднимался, но гуглил этот вопрос я еще до декабря, поэтому так написал ранее Уверен раз Вы заверяете с гуглом, там тоже есть, но я не находил. Возможно не правильно слова на английском вставлял.
RegRead DisplayScale, HKEY_CURRENT_USER, Control Panel\Desktop\WindowMetrics, AppliedDPI
MsgBox % DisplayScale / 96
MsgBox % GetScalingRatio()
MsgBox % A_ScreenDPI / 96
GetScalingRatio() {
hDC := DllCall("GetDC", Ptr, 0, Ptr)
hDPI := DllCall("GetDeviceCaps", Ptr, hDC, Int, LOGPIXELSX := 88)
DllCall("ReleaseDC", Ptr, 0, Ptr, hDC)
Return hDPI/24*25/100
}
Функция не пашет. 125% втыкал, разницы никакой в возвращаемом значении. Возможно она относится к топику другого ТС'а по расчету формулы масштабирования.
Единственное, что выдает результат DisplayScale из регистра, и то показывает тоже не правильно, 96 значение, которое тоже не меняется если воткнуть 125%.
Насчет поменять я уже ответил выше.
Чтобы менять сначала нужно понять, что у пользователя установлен масштаб и разметка не в 100%.
Кстати, причем тут разверстка?
Не при чем, разверстка не нужна. Мне нужно получить значение вот отсюда http://prntscr.com/i3z7z9. А как еще сделать если не из текста, так сразу понятно что требуется.
Зачем менять системный масштаб из ahk?
Если "Изменение размера текста, приложений и других элементов" не такое же как 100% у меня, то у других пользователей (у которых 125%, 150% и т.д.) размеры элементов управления больше и пиксель соответственно не находится поскольку элементы сдвигаются, они по сути становятся в разы больше.
Масштаб и разметка* не правильно я написал в первом посте.
stealzy, Вы такой странный, конечно, как Вы настроите под других если элементы игры не пропорционально увеличению растягиваются по экрану в зависимости от разрешения?
RegRead, DPI_value, HKEY_CURRENT_USER, Control Panel\Desktop\WindowMetrics, AppliedDPI
Я так понял из реестра это значение отвечает за "Масштаб и разметку", но почему-то когда я его меняю все равно показывает значение 96.
А вы что хотите еще свое разрешение экрана установить пользователям ?
Я такую задачу решал один раз, координаты любой точки можно описать формулой:
x := a + b*DisplayScalingRatio + c*WindowClientWidth, где a, b — целые, а c — действительное число. Если положение не зависит от ширины окна c = 0, если не зависит от масштаба b = 0.
В случае адаптивного дизайна, когда при смене разрешения/отношения сторон расположение элементов резко изменяется относительно друг друга, координаты будут описываться разными формулами в зависимости от условий.
Сюда же относятся минимальные размеры элементов.
В случае адаптивного дизайна, когда при смене разрешения/отношения сторон расположение элементов резко изменяется относительно друг друга, координаты будут описываться разными формулами в зависимости от условий.
Сюда же относятся минимальные размеры элементов.
Да да верно) Вот только можно все упростить, если наши пиксели находятся в левом верхнем углу, от 0,0. В таком случае они меняются только от увеличения "Масштаба и разметки".
x := a + b*DPI_Scale + c*Width, где a, b — целые, а c — действительное число.
x := x + (DPI_Scale-96)
Тогда код получается такой. Вычитаем 96 поскольку координаты задавались из параметра 100% в "Масштабе и разметки" и плюсуем уже то на сколько сместился увеличением пиксель.
За Win 10 точно не скажу, там ввели еще один новый способ масштабирования, проверьте что показывают другие способы определения DPI.
RegRead, LogPixels, HKEY_LOCAL_MACHINE, SOFTWARE\Microsoft\Windows NT\CurrentVersion\FontDPI, LogPixels ; Одно и то же
RegRead, DPI_value, HKEY_LOCAL_MACHINE, Config\0001\Display\Settings, DPILogicalX ; вообще пусто
Да, для изменений в реестре данного параметра в Win10 придется выполнить перезагрузку.
Т.е. масштаб в Win 10 изменяется сразу, без завершения сеанса пользователя (перезагрузки)?
Точнее с выходом из системы, перезагружать полностью не нужно. Формулу подправлю, сейчас буду дорабатывать.
RegRead, DPI_value, HKEY_LOCAL_MACHINE, Config\0001\Display\Settings, DPILogicalX ; вообще пусто
Только это возвращает пустое значение.
RegRead, DPI_value, HKEY_CURRENT_USER, Control Panel\Desktop\WindowMetrics, AppliedDPI
Вот тут воткнул 125%, вышел и зашел в систему, показал результат 120.
x := b*DisplayScalingRatio + c*WindowClientWidth, если положение не зависит от ширину окна c = 0, если не зависит от масштаба b = 0.
Там в процентном соотношении разница. 120 от 96, это +20% а не 25%, если сравнивать между 100% и 125% выбранными значениями. Значит нужно b брать как координату и к ней плюсовать появившийся процент, предварительно его "отформатировав", то есть если переменная DisplayScalingRatio = 120, то выставить вместо нее 25% процент при условии, что b координата взята из 100%/
x := 10
MsgBox, % Convert(x)
Convert(coordinate) {
RegRead, DPI_value, HKEY_CURRENT_USER, Control Panel\Desktop\WindowMetrics, AppliedDPI
;~ DPI_value = 120
Return coordinate * DPI_value // 96
}
Как-то странно, если координата у нас 10, то прибавив +25% (если вместо 100%, стоит 125% в "Масштаб и разметка") получится 12,5, а не 12, или в масштабируемости округление идет с остатка больше 5 ?
Как вы себе представляете пиксель по дробной координате?
Вот именно что никак, как тогда быть? Я получаю соотношение 1.25 , во столько раз оно больше, и даже на него умножая 10, все равно получается дробное число.
Есть координаты записанные при настройках "Масштаба и разметки" в 100%, как их конвертировать при другом масштабе?
есть в справке по операторам, можете заменить на округление, если вам оно лучше подходит.
Я не знаю даст мне округление истинное значение или нет.
Что есть истина и как ее проверить? В любом случае переходите на клиентские координаты, если окно не полноэкранное, удачи
Истина - позиция координаты взятая из масштаба 100% без дробного вида в другой опции масштаба. Помогите, подтолкните на решение с дробной координатой )
Вот поэтому всем пользователям проще установить масштаб в 100%, поскольку нельзя конвертировать формулой координату из 100% масштаба в 125%, появляется дробь.
Если даже так, надо спрашивать у вашей игры, как она округляет координаты
К сожалению, игра действительно не предсказуемо округляет, вывести точную формулу не получится. Придется через реестр менять всем в 100%, так зато надежнее.
SetWindowsSettings()
SetWindowsSettings() {
RegRead, DPI_value, HKEY_CURRENT_USER, Control Panel\Desktop\WindowMetrics, AppliedDPI
If (DPI_value != "120") {
MsgBox 0x40024, % "Change Windows Scale?", % "Your current Windows UI Scale is " DPI_value//24*25 ". If you do not change it to 125`% scripts will not work. Do you want me to do this for you now?"
IfMsgBox Yes, {
RegWrite, REG_SZ, HKEY_CURRENT_USER, Control Panel\Desktop\WindowMetrics, AppliedDPI, 120
DllCall("ExitWindowsEx")
Reload
} Else IfMsgBox No, {
ExitApp
}
}
}
Написал код, который должен менять "Масштаб и разметку" в 125% и затем делать выход из системы для применения. Я вижу, что раздел в реестре меняется, но фактического эффекта нет. Что не так? Подскажите умные люди
Странникх, я же вам ссылку привёл.
Не вижу, чтоб вы с ней ознакомились.
Malcev, в принципе разобрался, нужно было отметить флажок Win8DpiScaling разрешающий установить пользовательское масштабирование.
SetWindowsSettings()
SetWindowsSettings() {
RegRead, DPI_value, HKEY_CURRENT_USER, Control Panel\Desktop\WindowMetrics, AppliedDPI
If (DPI_value != "120") {
MsgBox 0x40024, % "Change Windows Scale?", % "Your current Windows UI Scale is " DPI_value//24*25 ". If you do not change it to 125`% scripts will not work. Do you want me to do this for you now?"
IfMsgBox Yes, {
RegWrite, REG_DWORD, HKEY_CURRENT_USER\Control Panel\Desktop, Win8DpiScaling, 1
RegWrite, REG_DWORD, HKEY_CURRENT_USER\Control Panel\Desktop, LogPixels, 120
RegWrite, REG_DWORD, HKEY_CURRENT_USER, Control Panel\Desktop\WindowMetrics, AppliedDPI, 120
DllCall("ExitWindowsEx")
Reload
} Else IfMsgBox No, {
ExitApp
}
}
}
Но возникает следующая проблема http://prntscr.com/i5xjik. Скрипт этим флажком пользователю потом вручную не дает менять из выпадающего списка масштабирование, только ручной ввод. Если после всех изменений записать в реестр Win8DpiScaling в 0, то все настройки слетают Это можно как-то убрать?
А зачем пользователю вручную после вашего скрипта что-то изменять?
Пусть ваш скрипт этим и занимается.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться