Что нового

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,671
Репутация
2,481
Yashied [?]
Высоту Taskbar'а можно узнать с помощью нижеприведенной функции
А чем оно отличается от WinGetPos:

Код:
$aTaskBar_Pos = WinGetPos("[CLASS:Shell_TrayWnd]")

ConsoleWrite(_TaskbarHeight() & @CRLF)
ConsoleWrite($aTaskBar_Pos[3] & @CRLF)

?
:whistle:
 

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] Автоматическая настройка консольных окон
 
Верх