标题: [系统相关] 如何用批处理获取powershell生成的参数值? [打印本页]
作者: kidzgy 时间: 2022-6-7 14:48 标题: 如何用批处理获取powershell生成的参数值?
- [System.Reflection.Assembly]::LoadWithPartialName("system.windows.forms")|out-null;
- [System.Windows.Forms.Screen]::AllScreens;
复制代码
例如,我用powershell运行上述命令,则输出如下:- BitsPerPixel : 32
- Bounds : {X=0,Y=0,Width=1920,Height=1080}
- DeviceName : \\.\DISPLAY1
- Primary : True
- WorkingArea : {X=0,Y=0,Width=1920,Height=1030}
复制代码
我想把【bounds】里的width中的1920设置为【%w1%】,height中的1080设置为【%h1%】,
把WorkingArea里的width中的1920设置为【%w2%】,height中的1030设置为【%h2%】。
不知如何实现呢?
作者: flashercs 时间: 2022-6-7 21:19
本帖最后由 flashercs 于 2022-6-7 21:30 编辑
设置这个没任何作用,不会改变屏幕分辨率.- @echo off
- powershell -c "Add-Type -Assembly Add-Type -AssemblyName system.windows.forms;[System.Windows.Forms.Screen]::AllScreens|ForEach-Object{$_.Bounds.Width=%w1%;$_.Bounds.Height=%h1%;$_.WorkingArea.Width=%w2%;$_.WorkingArea.Height=%h2%;}"
复制代码
作者: kidzgy 时间: 2022-6-7 21:57
设置这个没任何作用,不会改变屏幕分辨率.
flashercs 发表于 2022-6-7 21:19
感谢解答!!
这个是有用的,我最近在研究一个魔兽争霸防止字体重叠的工具,但是我又不会其他编程,只能借助批处理,还需要借助nircmd。
在遇到高分屏的时候,魔兽争霸3会有字体重叠的问题,如果对全屏的魔兽争霸3则是毫无办法。但如果是窗口模式,则可以采取伪全屏,每隔一分钟会给窗口增加一个高度像素,用于重置字体,这样就能有效避免字体重叠了。
1920*1080是不会有字体重叠问题的,代码只是用来测试。
关于字体重叠的问题,可以参考https://tieba.baidu.com/p/6843446427给出的图片。
我现在在用以下代码测试,在1920分辨率下没有问题,目前存在以下问题:
(1)经小新pro13笔记本上测试,分辨率2560*1600,缩放200%,运行批处理后,被解析成分辨率是1280*800。
(2)wmic无法获取真正的分辨率,如我小新笔记本是2560*1600,我换成1920的分辨率后,wmic获得的结果仍然是2560*1600。
现在有个问题就是,怎么样获取缩放率这个参数值,这样就进一步解决高分屏的问题了。- @echo off
- REM 魔兽争霸必须为窗口模式,参数-windows
- setlocal enabledelayedexpansion
- title FixWarFont
- tasklist|find /i "war3.exe" >nul 2>nul||if exist "E:\Warcraft III\war3.exe" start "" "E:\Warcraft III\war3.exe" -windows
- tasklist|find /i "war3.exe" >nul 2>nul||if exist "F:\Warcraft III\war3.exe" start "" "F:\Warcraft III\war3.exe" -windows
- Mode con cols=40 lines=5
-
- REM 获取BorderWidth
- for /f "tokens=2*" %%i in ('reg query "HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics" /v "BorderWidth" 2^>nul') do (
- for %%k in (%%j) do (
- set BorderWidth=%%k
- )
- )
-
- REM 获取PaddedBorderWidth
- for /f "tokens=2*" %%i in ('reg query "HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics" /v "PaddedBorderWidth" 2^>nul') do (
- for %%k in (%%j) do (
- set PaddedBorderWidth=%%k
- )
- )
-
- set/a BorderWidth=(!BorderWidth!+4)/(-15)
- set/a PaddedBorderWidth=(!PaddedBorderWidth!-4)/(-15)
-
- REM 获取桌面分辨率
- >"%temp%\_Resolution.ps1" echo $PSDefaultParameterValues['Out-File:Encoding'] = 'DEFAULT'
- >>"%temp%\_Resolution.ps1" echo Add-Type -Assembly System.Windows.Forms
- >>"%temp%\_Resolution.ps1" echo $scrW = [System.Windows.Forms.SystemInformation]::VirtualScreen.Width
- >>"%temp%\_Resolution.ps1" echo $scrH = [System.Windows.Forms.SystemInformation]::VirtualScreen.Height
- >>"%temp%\_Resolution.ps1" echo $workH = [System.Windows.Forms.SystemInformation]::WorkingArea.Height
- >>"%temp%\_Resolution.ps1" echo Write-Output $scrW" "$scrH" "$workH ^|Out-file -FilePath "$env:temp\_Resolution.txt"
- PowerShell -NoProfile -ExecutionPolicy Bypass -Command "& '%temp%\_Resolution.ps1'"
- for /f "tokens=1-3 delims= " %%i in (%temp%\_Resolution.txt) do (
- set width=%%i
- set height=%%j
- set workHeight=%%k
- )
- pause
- del /f /q "%temp%\_Resolution.ps1"
- del /f /q "%temp%\_Resolution.txt"
-
- REM !BorderWidth!
- REM !PaddedBorderWidth!
- REM !width! 当前分辨率宽度
- REM !height! 当前分辨率高度
- REM !workHeight! 当前分辨率去除任务栏的高度
-
-
- set/a border = 3
- if !width!==1920 set/a border = 3
- if !width!==2560 set/a border = 4
- goto setting
- exit
-
- :setting
- set/a border_ = !border!+!BorderWidth!*2+!PaddedBorderWidth!*2
- set/a width_ = !width!+2*!border_!
- set/a height_ = !height!+2*!border_!+1
- goto start
-
- :start
- timeout /t 2
- tasklist|find /i "war3.exe" >nul 2>nul && goto running || goto not
-
-
- :running
- cls&echo 探测到War3.exe已运行
- nircmd win -style class "Warcraft III" 0x00C00000
- nircmd win normal class "Warcraft III"
- nircmd win settopmost class "Warcraft III" 1
- nircmd win setsize class "Warcraft III" -!border_! -!border_! !width_! !height_!
- ::nircmd win setsize class "Warcraft III" 0 0 1680 1050
- timeout /t 3
- nircmd win -style class "Warcraft III" 0x00C00000
- nircmd win max class "Warcraft III"
- nircmd win settopmost class "Warcraft III" 0
- timeout /t 3
- tasklist|find /i "war3.exe" >nul 2>nul && goto running || goto not
-
- :not
- cls&echo War3.exe未运行
- timeout /t 3
- tasklist|find /i "war3.exe" >nul 2>nul && goto running || goto not
-
-
- :bak
- for /f delims^= %%I in ('
- wmic.exe path Win32_VideoController get CurrentHorizontalResolution^,CurrentVerticalResolution^|findstr /b [0-9]
- ')do for /f tokens^=1-2 %%a in ('echo\%%I')do set "width=%%a" && set "height=%%b"
- echo !BorderWidth!
- echo !PaddedBorderWidth!
- echo !width!x!height!
- pause
复制代码
作者: kidzgy 时间: 2022-6-7 22:02
回复 2# flashercs
你的运行结果是这样的哦,我的win版本是10.0.17763.1217
作者: flashercs 时间: 2022-6-7 23:19
- @echo off
- for /f "tokens=1-4" %%A in ('powershell -c "Add-Type -AssemblyName system.windows.forms;[System.Windows.Forms.Screen]::AllScreens|ForEach-Object{$w1=$_.Bounds.Width;$h1=$_.Bounds.Height;$w2=$_.WorkingArea.Width;$h2=$_.WorkingArea.Height;\"$w1 $h1 $w2 $h2\";}"') do (
- set w1=%%A
- set h1=%%B
- set w2=%%C
- set h2=%%D
- )
- echo %w1% %h1% %w2% %h2%
- pause
复制代码
作者: kidzgy 时间: 2022-6-8 16:14
本帖最后由 kidzgy 于 2022-6-8 16:19 编辑
回复 5# flashercs
感谢!有效!
我在研究的时候发现另外些问题,开启自定义缩放和不开启自定义缩放获取的分辨率是有差别的。
注册表Win8DpiScaling=1时为开启自定义缩放,0为关闭自定义缩放。即在桌面右键菜单【显示设置】-【高级缩放设置】-输入自定义缩放的百分比,如上图所示,即开启自定义缩放,缩放比例为125%,对应的注册表值如下代码框(若手动修改注册表,必须注销使其生效)。该数值是记载在LogPixels上,以16位进制表示,下面的78转为10进制为120,对应的缩放比例是125%。附上微软官方的解释对应缩放比例:- [HKEY_CURRENT_USER\Control Panel\Desktop]
- "Win8DpiScaling"=dword:00000001
- "LogPixels"=dword:00000078
复制代码
我目前状态是1920*1080,开启自定义缩放125%,则获取的屏幕分辨率是1920*1080。
如果关闭自定义缩放,缩放比例依旧是125%,则通过脚本获取的分辨率是1536*864,实际上就是1920/125%,1080/125%。
关键的问题来了,当我关闭自定义缩放时,我该如何通过第三方工具、注册表值或文件获取这个缩放比例呢?起码在开启自定义缩放时,缩放比例是记录在LogPixels上。
作者: flashercs 时间: 2022-6-8 16:42
回复 6# kidzgy
关闭缩放时 ,注册表里 不能获取值吗
作者: kidzgy 时间: 2022-6-8 16:53
回复 7# flashercs
关闭自定义缩放时,无论你缩放150%还是125%,LogPixels值不会变。
只有开启自定义缩放时,LogPixels值才有意义。
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |