第一个脚本目标,我还没能发掘出自己的解决方案。
到目前为止,对如何找到当前字体大小的尝试和研究。
检查wmic的可用值
wmic path Win32_VideoController get * /format:value
公认的解决方案是 这类似的问题:
for /f "tokens=3" %A in ('reg query "HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics" /v AppliedDPI') do echo %A
在这里搜索Q&A的上 叠叠乐
搜索 Dostips
使用外部可执行文件强制调整字体大小(BG.exe)
脚本执行适用于支持ASCII转义码的Windows 10系统。
需要当前字体大小的背景。
我已经开发了一个控制控制台大小和位置的程序,在不同的分辨率下都能保持准确,但是目前它依赖于最大行和列的值,而这个值是基于16x8的假设字体大小。
有了确定字体大小的可靠手段,我就可以不做这个假设,而是利用实际字体大小、最大行数列和屏幕分辨率之间的关系来制定定位.我仍然需要确定上述关系--如果有人已经知道,请随时分享。
::: { Subroutine to process output of wmic command into usable variables for screen dimensions (resolution)
::: - Formula based on Consolas 16x8 Font
:ChangeConsole <Lines> <Columns> <Label to Resume From> <If a 4th parameter is Defined, Aligns screen at top left>
::: - Get screen Dimensions
For /f "delims=" %%# in ('"wmic path Win32_VideoController get CurrentHorizontalResolution,CurrentVerticalResolution /format:value"') do (
Set "%%#">nul
)
::: - Calculation of X axis relative to screen resolution and console size. Resolution scales to Max Columns ~ 165
Set /A XresScale=CurrentHorizontalResolution / 165
Set /A HorzCentre=CurrentHorizontalResolution / 2
Set /A CentreX= ( HorzCentre - ( ( %~2 * XresScale ) / 2 ) ) - 8
::: - Calculation of Y axis relative to screen resolution and console size. Resolution scales to Max Lines ~ 43
Set /A YresScale=CurrentVerticalResolution / 43
Set /A VertCentre=CurrentVerticalResolution / 2
Set /A CentreY=VertCentre - ( ( %~1 * YresScale ) / 2 )
::: - Optional 4th parameter can be used to align console at top left of screen instead of screen centre
If Not "%~4"=="" (Set /A CentreY=0,CentreX=-8)
::: - Creates a batch file to reopen the main script using Call with parameters to define properties for console change and the label to resume from.
(
Echo.@Mode Con: lines=%~1 cols=%~2
Echo.@Title %ProgName%
Echo.@Call "%AlignFile%" "%~1" "%~2" "%~3" "%AlignFile%"
)>"%temp%\ChangeConsole.bat"
::: - .Vbs script creation
(
Echo.Set objWMIService = GetObject^("winmgmts:\\.\root\cimv2"^)
Echo.Set objConfig = objWMIService.Get^("Win32_ProcessStartup"^)
Echo.objConfig.SpawnInstance_
Echo.objConfig.X = %CentreX%
Echo.objConfig.Y = %CentreY%
Echo.Set objNewProcess = objWMIService.Get^("Win32_Process"^)
Echo.intReturn = objNewProcess.Create^("%temp%\ChangeConsole.bat", Null, objConfig, intProcessID^)
)>"%temp%\Consolepos.vbs"
::: - .Vbs Starts the companion batch script to Change Console properties, ends the parent.
Start "" "%temp%\Consolepos.vbs" & Exit
::: }
我写了这个小的MASM32汇编语言程序来获取当前cmd.exe窗口的字体大小。
; FontSize.asm: Returns the current font size of cmd.exe window - Antonio Perez Ayala
include \masm32\include\masm32rt.inc
.data
CONSOLE_FONT_INFO STRUCT
nFont DWORD ?
dwFontSize COORD <>
CONSOLE_FONT_INFO ENDS
hConsoleOutput DD ?
ConsoleCurrentFont CONSOLE_FONT_INFO <>
.code
Main PROC
invoke GetStdHandle, STD_OUTPUT_HANDLE ;EAX = console output handle
mov hConsoleOutput, eax ;store it
invoke GetCurrentConsoleFont, eax, FALSE, ADDR ConsoleCurrentFont ;get current font info
invoke GetConsoleFontSize, hConsoleOutput, ConsoleCurrentFont.nFont ;EAX = font size
invoke ExitProcess, eax ;return it in ERRORLEVEL
Main ENDP
end Main
你可以在以下网站上查看WIN32 API函数的使用文档 本网站.
要获得可执行程序,请将这段代码复制到以下位置 fontsize.asm
源程序,并通过 MASM32 SDK包. 你也可以执行下面的.bat批处理文件,并从创建的文件中解压。fontsize.zip
文件。
@certutil -decode "%~F0" fontsize.zip & goto :EOF
-----BEGIN CERTIFICATE-----
UEsDBBQAAAAIAMtAvVDPMRDXlAEAAAAKAAAMAAAAZm9udHNpemUuZXhl7ZI9LwRB
GMf/644cDidRUGC8JarNhaiQXOK1IDZOJYh1O3F79mZlbyTiMyjkGgWdTqVQiIoP
cIVvoJFcq1DKmtkXTgiFKMj+ss/zn+f/PDO7k+zi6hFiAOIiXBe4gk8G33MhorX3
uhWXjZW+K2Wh0reSN0tk17G3Hb1IcjpjNidblDh7jJiMTC9lSdE2qNrS0jQYnLG+
VrztmoyVwzjuT5V7hD50t5c7hS6bubz0w3dqM8CCEkMlcbcRevdoU5qV+iTq4F9E
kgqCyCLjr+ve2qF6Fw2KWLgxVauv4tFBgGH8AkSc/UVb5XSfC52XRQp4d9cAAmyq
jqFzHTgPDG+u4f1cRjyqP4akNNLBXOLD3A0i/jWFp+q4kDOkM8jHRSpAqw4Ixx2T
lTsmG1X5l2hVOe8OJYmwh+DluJcTIkf8TTYIwEUcitCI702Qt/6pXNfUtXy29wQz
+ybXHDtHSyU8Yo7yKZuVbIvO2oxnzQMKPHvunuNQVttEQRF+lhvzOjMsMbdDHUat
0RHVsKzPvyAiIuInvABQSwECFAAUAAAACADLQL1QzzEQ15QBAAAACgAADAAAAAAA
AAAAACAAAAAAAAAAZm9udHNpemUuZXhlUEsFBgAAAAABAAEAOgAAAL4BAAAAAA==
-----END CERTIFICATE-----
fontsize.exe
程序通过%ERRORLEVEL%值返回字体大小。比如说
C:\Users\Antonio\Documents\ASMB\MASM32 Assembler for Windows
> fontsize.exe
C:\Users\Antonio\Documents\ASMB\MASM32 Assembler for Windows
> set /A "height=%errorlevel% >> 16, width=%errorlevel% & 0xFF"
8
C:\Users\Antonio\Documents\ASMB\MASM32 Assembler for Windows
> echo The font size is %width% x %height%
The font size is 8 x 16
用 编译后的.exe Aacini很友善地 手艺我已经能够将控制台尺寸和位置计算的剩余问题具体化。
剩下的一块拼图是在显示器的缩放因子,我没有考虑到的东西,直到它在 本次讨论
采集屏幕尺寸位置缩放所需的变量值。
::: { Variable used in calling this script from the Self created resizing Batch.
Set "ThisFile=%~F0"
::: }
::: { Get screen Dimensions
For /f "delims=" %%# in ('"wmic path Win32_VideoController get CurrentHorizontalResolution,CurrentVerticalResolution /format:value"') do (
Set "%%#">nul
)
::: - Calculate scale Factor in effect. Registry value requires restart to update if scale has changed.
For /F "Tokens=3 Delims= " %%A in ('REG QUERY "HKCU\Control Panel\Desktop\WindowMetrics" /V AppliedDPI') Do Set /A SF=%%A / 100 + 1
::: - Get Font Size
(For /F "Delims=" %%S in ('dir GetFontSize.exe /B /S') Do (%%S)) 2> Nul
Set /A "Font.H=%errorlevel% >> 16, Font.W=%errorlevel% & 0xFF"
Set /A Max.Width= ( CurrentHorizontalResolution / ( Font.W * SF ) )
rem // account for title and start bar
Set /A Max.Height= ( ( CurrentVerticalResolution / Font.H ) / SF ) - 4
::: }
::: { Call Subroutine to Resize and Position the Console
Call :ChangeConsole %Max.Height% %Max.Width% Matrix TL
::: }
计算窗口位置的子程序,创建和启动同伴文件,以所需属性重新打开脚本。
:ChangeConsole <Lines> <Columns> <Label to Resume From> <If a 4th parameter is Defined, Aligns screen at top left>
::: - Calculation of X axis relative to screen resolution and console size. Resolution scales to Max Columns.
Set /A XresScale= CurrentHorizontalResolution / Max.Width
Set /A HorzCentre= CurrentHorizontalResolution / 2
Set /A CentreX= ( HorzCentre - ( ( %~2 * XresScale ) / 2 ) )
::: - Calculation of Y axis relative to screen resolution and console size. Resolution scales to Max Lines.
Set /A YresScale= CurrentVerticalResolution / Max.Height
Set /A VertCentre= CurrentVerticalResolution / 2
Set /A CentreY= VertCentre - ( ( %~1 * YresScale ) / 2 )
::: - Optional 4th parameter can be used to align console at top left of screen instead of screen centre
If Not "%~4"=="" (Set /A CentreY=0,CentreX=-8)
::: - Creates a batch file to reopen the main script using Call with parameters to define properties for console change and the label to resume from.
(
Echo.@Mode Con: lines=%~1 cols=%~2
Echo.@Title %ProgName%
Echo.@Call "%ThisFile%" "%~1" "%~2" "%~3" "%ThisFile%"
)>"%temp%\ChangeConsole.bat"
::: - .Vbs script creation
(
Echo.Set objWMIService = GetObject^("winmgmts:\\.\root\cimv2"^)
Echo.Set objConfig = objWMIService.Get^("Win32_ProcessStartup"^)
Echo.objConfig.SpawnInstance_
Echo.objConfig.X = %CentreX%
Echo.objConfig.Y = %CentreY%
Echo.Set objNewProcess = objWMIService.Get^("Win32_Process"^)
Echo.intReturn = objNewProcess.Create^("%temp%\ChangeConsole.bat", Null, objConfig, intProcessID^)
)>"%temp%\Consolepos.vbs"
::: - .Vbs Starts the companion batch script to Change Console properties, ends the parent.
Start "" "%temp%\Consolepos.vbs" & Exit
::: }