Batch file 查找活动控制台窗口的字体大小

Batch file 查找活动控制台窗口的字体大小,batch-file,cmd,Batch File,Cmd,第一个脚本目标是我无法找到自己的解决方案 到目前为止,关于如何查找当前字体大小的尝试和研究: 正在检查wmic的可用值: wmic path Win32\u视频控制器get*/format:value 公认的解决方案包括: for/f“tokens=3”%A在('reg query“HKEY\u CURRENT\u USER\Control Panel\Desktop\WindowMetrics”/v AppliedDPI)中执行回显%A 无论我的计算机上的字体大小如何,此解决方案都会返回相

第一个脚本目标是我无法找到自己的解决方案

到目前为止,关于如何查找当前字体大小的尝试和研究:

  • 正在检查wmic的可用值:

    wmic path Win32\u视频控制器get*/format:value

  • 公认的解决方案包括:

    for/f“tokens=3”%A在('reg query“HKEY\u CURRENT\u USER\Control Panel\Desktop\WindowMetrics”/v AppliedDPI)中执行回显%A

    • 无论我的计算机上的字体大小如何,此解决方案都会返回相同的结果-0x12
  • 搜索问答在这里

  • 搜寻

  • 使用外部可执行文件强制字体大小(BG.exe)

    • 并非我在本文中使用的所有脚本都保证用户需要下载支持的可执行文件
脚本执行适用于支持ASCII转义码的Windows 10系统

需要当前字体大小的上下文:

我已经开发了一个用于控制控制台大小和位置的例程,它在不同分辨率下保持精确,但是它目前取决于基于假定字体大小16x8的最大行和列的值

有了一种确定字体大小的可靠方法,我可以摆脱这种假设,利用实际字体大小、最大行/列和屏幕分辨率之间的关系来确定位置。 我仍然需要确定上述关系-如果有人已经知道,请随意分享

:{将wmic命令的输出处理为屏幕尺寸(分辨率)的可用变量的子例程
:-基于ConsoleAS 16x8字体的公式
:更换控制台
获取屏幕尺寸
对于/f“delims=“%%#in('”wmic路径Win32_VideoController获取CurrentHorizontalResolution,CurrentVerticalResolution/format:value“'),执行以下操作:(
设置“%%#”>nul
)
:-计算相对于屏幕分辨率和控制台大小的X轴。分辨率缩放到最大列数~165
设置/A XresScale=CurrentHorizontalResolution/165
设置/A水平中心=当前水平分辨率/2
Set/A CentreX=(HorzCentre-(((%2*xrescale)/2))-8
:-计算相对于屏幕分辨率和控制台大小的Y轴。分辨率缩放到最大行数~43
设置/A Y分辨率=当前垂直分辨率/43
设置/A垂直中心=当前垂直分辨率/2
设置/A中心=垂直中心-(((%1*y刻度)/2)
:-可选第4个参数可用于对齐屏幕左上角的控制台,而不是屏幕中心
如果不是“%~4”==”(设置/A中心=0,中心=8)
:-创建一个批处理文件,使用带有参数的调用重新打开主脚本,以定义控制台更改的属性和要从中恢复的标签。
(
回声。@Mode Con:lines=%~1 cols=%~2
回声。@标题%ProgName%
Echo。@调用“%AlignFile%”%~1“%~2”%~3“%AlignFile%”
)>%temp%\ChangeConsole.bat
:-.Vbs脚本创建
(
Echo.Set objWMIService=GetObject^(“winmgmts:\\.\root\cimv2”^)
Echo.Set objConfig=objWMIService.Get^(“Win32_ProcessStartup”^)
Echo.objConfig.spawn实例_
Echo.objConfig.X=%CentreX%
Echo.objConfig.Y=%CentreY%
Echo.Set objNewProcess=objWMIService.Get^(“Win32_进程”^)
Echo.intReturn=objNewProcess.Create^(“%temp%\ChangeConsole.bat”,Null,objConfig,intProcessID^)
)>%temp%\Consolepos.vbs
:-.Vbs启动配套批处理脚本以更改控制台属性,结束父脚本。
启动“”%temp%\Consolepos.vbs”&退出
::: }

我编写了这个小型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
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
有了Aacini,我已经能够在控制台大小和位置计算方面解决剩下的问题

剩下的谜题是在显示器的缩放因子中,直到在

中出现的时候我才考虑到它。 捕获缩放屏幕大小/位置所需的变量值

::{用于从自行创建的调整大小批处理调用此脚本的变量。
设置“ThisFile=%~F0”
::: }
:{获取屏幕尺寸
对于/f“delims=“%%#in('”wmic路径Win32_VideoController获取CurrentHorizontalResolution,CurrentVerticalResolution/format:value“'),执行以下操作:(
设置“%%#”>nul
)
:-计算有效的比例因子。如果比例已更改,则注册表值需要重新启动才能更新。
对于/F“Tokens=3 Delims=“%%A in('REG QUERY“HKCU\Control Panel\Desktop\WindowMetrics”/V AppliedDPI')Do Set/A SF=%%A/100+1
获取字体大小
(对于/F“Delims=“%%S in('dir GetFontSize.exe/B/S')Do(%%S))2>Nul
设置/A“Font.H=%errorlevel%>>16,Font.W=%errorlevel%&0xFF”
设置/A最大宽度=(当前水平分辨率/(Font.W*SF))
rem//标题和开始栏的帐户
设置/A最大高度=((当前垂直分辨率/Font.H)/SF)-4
::: }
:{调用子例程来调整控制台的大小和位置
调用:ChangeConsole%Max.Height%%Max.Width%Matrix TL
::: }
用于计算窗口位置、创建和启动配套文件以重新打开具有所需属性的脚本的子例程

:变更控制台
:-计算相对于屏幕分辨率和控制台大小的X轴。分辨率缩放到最大列数。
设置/A X分辨率=当前水平分辨率/最大宽度
设置/A水平中心=当前水平分辨率/2
集合/A中心=(水平中心-((%2*Xrescale)/2))
:-计算相对于屏幕分辨率和控制台大小的Y轴。分辨率缩放到最大线。
设置/A Y分辨率=当前垂直分辨率/最大高度
设置/A垂直中心=当前垂直分辨率/2
设置/A中心=垂直中心-(((%1*y刻度)/2)
:-可以使用可选的第四个参数
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