Что нового

Console: Расчет координат и размеров консольного окна

snoitaleR

AutoIT Гуру
Сообщения
855
Репутация
223
Я хочу автоматизировать процесс настройки расположения и размеров консольных окон (в том числе FAR) с учетом текущего разрешения, скрытия панели задач и скрытия значков на рабочем столе...
Хотелось бы, чтобы расстояние от границ экрана до сторон окна было одинаковым, к примеру 10 пикселей, можно чуть больше, чуть меньше...
1. Как учесть размеры границ, заголовка и другие атрибуты окна?
2. Как учесть автоматически скрывающуюся панель задач?
Создан рабочий скрипт (могу выложить текст), но консольные окна смещены чуть вправо и чуть вниз, и я не знаю как добиться симметричности...
 
Автор
snoitaleR

snoitaleR

AutoIT Гуру
Сообщения
855
Репутация
223
Подскажите, пожалуйста, что означают отрицательные параметры в разделе реестра:
[HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics]?

Например, "BorderWidth"="-15"

Как получить реальное значение?
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
snoitaleR сказал(а):
Хотелось бы, чтобы расстояние от границ экрана до сторон окна было одинаковым, к примеру 10 пикселей, можно чуть больше, чуть меньше...

Код:
#Include <WinAPIEx.au3>

$hForm = GUICreate('MyGUI')
GUISetState()

$tRect = _WinAPI_GetWorkArea()
$iX = DllStructGetData($tRect, 1) + 10
$iY = DllStructGetData($tRect, 2) + 10
$iWidth = DllStructGetData($tRect, 3) - DllStructGetData($tRect, 1) - 20
$iHeight = DllStructGetData($tRect, 4) - DllStructGetData($tRect, 2) - 20
WinMove($hForm, '', $iX, $iY, $iWidth, $iHeight)

Do
Until GUIGetMsg() = -3


WinAPIEx.au3
 
Автор
snoitaleR

snoitaleR

AutoIT Гуру
Сообщения
855
Репутация
223
Yashied, спасибо за пример...
Я разобрался, как он работает...
Но мне нужно таким же образом расположить окно Far Manager...
Обычно это приходится делать через свойства окна, а потом вручную передвигать окно "на глазок", затем снова открывать меню окна и сохранять параметры...
А если еще на разных машинах это делать...

Я нашел в реестре ключ для хранения настроек консольных окон:
[HKEY_CURRENT_USER\Console]
"FaceName"="Terminal"
"FontFamily"=dword:00000030
"FontSize"=dword:0012000a
"FontWeight"=dword:00000190
"FullScreen"=dword:00000000
"ScreenBufferSize"=dword:0029007c
"WindowPosition"=dword:000f000f
"WindowSize"=dword:0029007c

Мне удалось менять эти параметры из скрипта...
Проблема возникла при расчете координат консольного окна...
Для максимально точного центрирования нужно знать толщину границ окна...
Ключ есть во втором сообщении...
Однако, я не знаю, как считать толщину границы окна из реестра...
Добавлено:
Сообщение автоматически объединено:

Yashied, посмотри пожалуйста вот этот код:
Код:
; BEGIN

; Настройка консольных окон под стандартные разрешения

$CONSOLE="HKEY_CURRENT_USER\Console"
$POLICIES="HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer"
$S="0x001e004d"
$P="0x000d000a"

if RegRead($POLICIES,"NoDesktop")="1" then
 $D="1"
elseif RegRead($POLICIES,"NoDesktop")="0" then
 $D="0"
else
 $D="0"
endif

RegDelete($CONSOLE)

; Установка постоянных значений

RegWrite($CONSOLE,"FaceName","REG_SZ","Terminal")
RegWrite($CONSOLE,"FontFamily","REG_DWORD","0x00000030")
RegWrite($CONSOLE,"FullScreen","REG_DWORD","0x00000000")
RegWrite($CONSOLE,"FontSize","REG_DWORD","0x0012000a")
RegWrite($CONSOLE,"FontWeight","REG_DWORD","0x00000190")

; Расчет количества символов по ширине и высоте

$KW=int(@DesktopWidth/10)-4
$KH=int(@DesktopHeight/18)-3

; Составление бинарных значений размеров и координат

$S="0x"&Hex($KH,4)&Hex($KW,4)
$P="0x"&Hex(int((@DesktopHeight-18*($KH)-18)/2),4)&Hex(int((@DesktopWidth-10*($KW))/2),4)

; Установка переменных значений

RegWrite($CONSOLE,"ScreenBufferSize","REG_DWORD",$S)
RegWrite($CONSOLE,"WindowSize","REG_DWORD",$S)
RegWrite($CONSOLE,"WindowPosition","REG_DWORD",$P)

; END
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Размеры бордюров и заголовка можно узнать так:

$DX = _WinAPI_GetSystemMetrics($SM_C:rofl:LGFRAME) - Толщина горизонтальных бордюров
$DY = _WinAPI_GetSystemMetrics($SM_C:rofl:LGFRAME) - Толщина вертикальных бордюров
$DTitle = _WinAPI_GetSystemMetrics($SM_CYCAPTION) - Высота заголовка

Таким образом поправки будут равны:

$DWidth = 2 * $DX
$DHeight = 2 * $DY + $DTitle

Вроде так. :smile:

Добавлено:
Сообщение автоматически объединено:

Высоту Taskbar'а можно узнать с помощью нижеприведенной функции.

Код:
Func _TaskbarHeight()

	Local $tRECT = DllStructCreate($tagRECT)
	Local $Ret = DllCall('user32.dll', 'int', 'SystemParametersInfo', 'uint', 48, 'uint', 0, 'ptr', DllStructGetPtr($tRECT), 'uint', 0)

	If (@error) Or ($Ret[0] = 0) Then
		Return SetError(1, 0, 0)
	EndIf
	Return @DesktopHeight - DllStructGetData($tRECT, 4)
EndFunc   ;==>_TaskbarHeight
 
Автор
snoitaleR

snoitaleR

AutoIT Гуру
Сообщения
855
Репутация
223
Yashied, скрипт не находит переменную:
$SM_C:rofl:LGFRAME
Где она расположена?
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,487

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
CreatoR сказал(а):
А чем оно отличается от WinGetPos...

В принципе ничем, только класс Shell_TrayWnd, если я не ошибаюсь, в Vista и Win7 называется по другому.

:smile:
 
Автор
snoitaleR

snoitaleR

AutoIT Гуру
Сообщения
855
Репутация
223
Yashied, CreatoR, спасибо...
Дальше сам...

Добавлено:
Сообщение автоматически объединено:

Yashied, с координатами разобрался...
Осталась еще одна проблема...
Как определить: включено ли автоматическое скрывание панели задач?
 
Автор
snoitaleR

snoitaleR

AutoIT Гуру
Сообщения
855
Репутация
223
Yashied, спасибо за нужную полезняшку... :smile:
Жаль, что форум не дает возможности поставить плюсик...
Добавлено:
Сообщение автоматически объединено:

CreatoR, твой пример для определения положения и размеров панели задач тоже пригодился, спасибо...
Это важно, так как панель задач может располагаться и внизу, и вверху, как в моем случае...
Добавлено:
Сообщение автоматически объединено:

В результате:

[Script] Автоматическая настройка консольных окон
 
Верх