Board logo

标题: [系统相关] 如何用批处理获取powershell生成的参数值? [打印本页]

作者: kidzgy    时间: 2022-6-7 14:48     标题: 如何用批处理获取powershell生成的参数值?

  1. [System.Reflection.Assembly]::LoadWithPartialName("system.windows.forms")|out-null;
  2. [System.Windows.Forms.Screen]::AllScreens;
复制代码
例如,我用powershell运行上述命令,则输出如下:
  1. BitsPerPixel : 32
  2. Bounds       : {X=0,Y=0,Width=1920,Height=1080}
  3. DeviceName   : \\.\DISPLAY1
  4. Primary      : True
  5. 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 编辑

设置这个没任何作用,不会改变屏幕分辨率.
  1. @echo off
  2. 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。

现在有个问题就是,怎么样获取缩放率这个参数值,这样就进一步解决高分屏的问题了。
  1. @echo off
  2. REM 魔兽争霸必须为窗口模式,参数-windows
  3. setlocal enabledelayedexpansion
  4. title FixWarFont
  5. tasklist|find /i "war3.exe" >nul 2>nul||if exist "E:\Warcraft III\war3.exe" start "" "E:\Warcraft III\war3.exe" -windows
  6. tasklist|find /i "war3.exe" >nul 2>nul||if exist "F:\Warcraft III\war3.exe" start "" "F:\Warcraft III\war3.exe" -windows
  7. Mode con cols=40 lines=5
  8. REM 获取BorderWidth
  9. for /f "tokens=2*" %%i in ('reg query "HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics" /v "BorderWidth" 2^>nul') do (
  10. for %%k in (%%j) do (
  11. set BorderWidth=%%k
  12. )
  13. )
  14. REM 获取PaddedBorderWidth
  15. for /f "tokens=2*" %%i in ('reg query "HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics" /v "PaddedBorderWidth" 2^>nul') do (
  16. for %%k in (%%j) do (
  17. set PaddedBorderWidth=%%k
  18. )
  19. )
  20. set/a BorderWidth=(!BorderWidth!+4)/(-15)
  21. set/a PaddedBorderWidth=(!PaddedBorderWidth!-4)/(-15)
  22. REM 获取桌面分辨率
  23. >"%temp%\_Resolution.ps1" echo $PSDefaultParameterValues['Out-File:Encoding'] = 'DEFAULT'
  24. >>"%temp%\_Resolution.ps1" echo Add-Type -Assembly System.Windows.Forms
  25. >>"%temp%\_Resolution.ps1" echo $scrW = [System.Windows.Forms.SystemInformation]::VirtualScreen.Width
  26. >>"%temp%\_Resolution.ps1" echo $scrH = [System.Windows.Forms.SystemInformation]::VirtualScreen.Height
  27. >>"%temp%\_Resolution.ps1" echo $workH = [System.Windows.Forms.SystemInformation]::WorkingArea.Height
  28. >>"%temp%\_Resolution.ps1" echo Write-Output $scrW" "$scrH" "$workH ^|Out-file -FilePath "$env:temp\_Resolution.txt"
  29. PowerShell -NoProfile -ExecutionPolicy Bypass -Command "& '%temp%\_Resolution.ps1'"
  30. for /f "tokens=1-3 delims= " %%i in (%temp%\_Resolution.txt) do (
  31. set width=%%i
  32. set height=%%j
  33. set workHeight=%%k
  34. )
  35. pause
  36. del /f /q "%temp%\_Resolution.ps1"
  37. del /f /q "%temp%\_Resolution.txt"
  38. REM !BorderWidth!  
  39. REM !PaddedBorderWidth!
  40. REM !width! 当前分辨率宽度
  41. REM !height!  当前分辨率高度
  42. REM !workHeight!  当前分辨率去除任务栏的高度
  43. set/a border = 3
  44. if !width!==1920 set/a border = 3
  45. if !width!==2560 set/a border = 4
  46. goto setting
  47. exit
  48. :setting
  49. set/a border_ = !border!+!BorderWidth!*2+!PaddedBorderWidth!*2
  50. set/a width_ = !width!+2*!border_!
  51. set/a height_ = !height!+2*!border_!+1
  52. goto start
  53. :start
  54. timeout /t 2
  55. tasklist|find /i "war3.exe" >nul 2>nul && goto running || goto not
  56. :running
  57. cls&echo 探测到War3.exe已运行
  58. nircmd win -style class "Warcraft III" 0x00C00000
  59. nircmd win normal class "Warcraft III"
  60. nircmd win settopmost class "Warcraft III" 1
  61. nircmd win setsize class "Warcraft III" -!border_! -!border_! !width_! !height_!
  62. ::nircmd win setsize class "Warcraft III" 0 0 1680 1050
  63. timeout /t 3
  64. nircmd win -style class "Warcraft III" 0x00C00000
  65. nircmd win max class "Warcraft III"
  66. nircmd win settopmost class "Warcraft III" 0
  67. timeout /t 3
  68. tasklist|find /i "war3.exe" >nul 2>nul && goto running || goto not
  69. :not
  70. cls&echo War3.exe未运行
  71. timeout /t 3
  72. tasklist|find /i "war3.exe" >nul 2>nul && goto running || goto not
  73. :bak
  74. for /f delims^= %%I in ('
  75. wmic.exe path Win32_VideoController get CurrentHorizontalResolution^,CurrentVerticalResolution^|findstr /b [0-9]
  76. ')do for /f tokens^=1-2 %%a in ('echo\%%I')do set "width=%%a" && set "height=%%b"
  77. echo !BorderWidth!
  78. echo !PaddedBorderWidth!
  79. echo !width!x!height!
  80. pause
复制代码

作者: kidzgy    时间: 2022-6-7 22:02

回复 2# flashercs


你的运行结果是这样的哦,我的win版本是10.0.17763.1217
作者: flashercs    时间: 2022-6-7 23:19

  1. @echo off
  2. 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 (
  3.   set w1=%%A
  4.   set h1=%%B
  5.   set w2=%%C
  6.   set h2=%%D
  7. )
  8. echo %w1% %h1% %w2% %h2%
  9. 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%。附上微软官方的解释对应缩放比例:
  1. [HKEY_CURRENT_USER\Control Panel\Desktop]
  2. "Win8DpiScaling"=dword:00000001
  3. "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://www.bathome.net/) Powered by Discuz! 7.2