Board logo

标题: [其他] 命令行窗口自动居中之批处理版(2009-03-17更新) [打印本页]

作者: Batcher    时间: 2009-3-4 16:07     标题: 命令行窗口自动居中之批处理版(2009-03-17更新)

【方案一】比较原始的方法,思路比较容易理解。
  1. @echo off
  2. ::Batcher@bbs.bathome.net
  3. ::2009-03-04
  4. ::命令行窗口自动居中之批处理版@CMD@XP
  5. ::http://bbs.bathome.net/thread-3582-1-1.html
  6. setlocal enabledelayedexpansion
  7. ::指定命令行窗口字体大小(默认是8*16)
  8. set FontWidth=8
  9. set FontHeight=16
  10. ::指定命令行窗口大小(默认是80*25)
  11. set WinCol=80
  12. set WinRow=25
  13. ::ClearOldConf
  14. for /f "tokens=3 delims=\" %%a in ('reg query HKEY_CURRENT_USER\Console^|findstr "_system32_cmd.exe"') do (
  15. if "%%a" neq "" (
  16. reg delete HKEY_CURRENT_USER\Console\%%a /va /f
  17. )
  18. )
  19. ::SetFontSize
  20. call :Dec2Hex %FontWidth% FontWidthH
  21. call :Dec2Hex %FontHeight% FontHeightH
  22. set FontWidthH=0000%FontWidthH%
  23. set FontWidthH=%FontWidthH:~-4%
  24. reg add HKEY_CURRENT_USER\Console /v FontSize /t reg_dword /d 0x%FontHeightH%%FontWidthH% /f
  25. ::SetWinSize
  26. call :Dec2Hex %WinCol% WinColH
  27. call :Dec2Hex %WinRow% WinRowtH
  28. set WinColH=0000%WinColH%
  29. set WinColH=%WinColH:~-4%
  30. reg add HKEY_CURRENT_USER\Console /v WindowSize /t reg_dword /d 0x%WinRowtH%%WinColH% /f
  31. ::GetWinSize
  32. set /a WinWidth=WinCol*FontWidth+33
  33. set /a WinHeight=WinRow*FontHeight+45
  34. ::GetSrcSize
  35. for /f "tokens=2 delims==" %%a in ('wmic desktopmonitor get screenwidth /value') do (
  36. set ScrWidth=%%a
  37. goto :GetSrcHeight
  38. )
  39. :GetSrcHeight
  40. for /f "tokens=2 delims==" %%a in ('wmic desktopmonitor get screenheight /value') do (
  41. set ScrHeight=%%a
  42. goto :GetPosition
  43. )
  44. :GetPosition
  45. set /a PosLeft=(ScrWidth-WinWidth)/2
  46. set /a PosTop=(ScrHeight-WinHeight)/2
  47. call :Dec2Hex %PosLeft% PosLeftH
  48. call :Dec2Hex %PosTop% PosTopH
  49. set PosLeftH=0000%PosLeftH%
  50. set PosLeftH=%PosLeftH:~-4%
  51. set PosTopH=0000%PosTopH%
  52. set PosTopH=%PosTopH:~-4%
  53. reg add HKEY_CURRENT_USER\Console /v WindowPosition /t reg_dword /d 0x%PosTopH%%PosLeftH% /f
  54. start cmd
  55. goto :eof
  56. :Dec2Hex
  57. set num=%1
  58. set str=0123456789ABCDEF
  59. set numDiv=%num%
  60. set numConn=
  61. :LoopD2H
  62. set /a numMod=numDiv%%16
  63. set numMod=!str:~%numMod%,1!
  64. set /a numDiv/=16
  65. set numConn=%numMod%%numConn%
  66. if %numDiv% equ 0 (
  67. set %2=%numConn%
  68. goto :eof
  69. )
  70. goto :LoopD2H
复制代码
【方案二】采用18楼pusofalse兄的方法:移位+或,可以缩短代码、提高执行效率。
  1. @echo off
  2. ::Batcher@bbs.bathome.net
  3. ::2009-03-17
  4. ::命令行窗口自动居中之批处理版@CMD@XP
  5. ::http://bbs.bathome.net/thread-3582-1-1.html
  6. setlocal enabledelayedexpansion
  7. ::指定命令行窗口字体大小(默认是8*16)
  8. set FontWidth=8
  9. set FontHeight=16
  10. ::指定命令行窗口大小(默认是80*25)
  11. set WinCol=80
  12. set WinRow=25
  13. ::SetFontSize
  14. set /a "FontSizeD=FontHeight<<16|FontWidth"
  15. call :Dec2Hex %FontSizeD% FontSizeH
  16. reg add HKEY_CURRENT_USER\Console /v FontSize /t reg_dword /d 0x%FontSizeH% /f
  17. ::SetWinSize
  18. set /a "WinSizeD=WinRow<<16|WinCol"
  19. call :Dec2Hex %WinSizeD% WinSizeH
  20. reg add HKEY_CURRENT_USER\Console /v WindowSize /t reg_dword /d 0x%WinSizeH% /f
  21. ::GetWinSize
  22. set /a WinWidth=WinCol*FontWidth+33
  23. set /a WinHeight=WinRow*FontHeight+45
  24. ::GetSrcSize
  25. for /f "tokens=2 delims==" %%a in ('wmic desktopmonitor get screenwidth /value') do (
  26. set ScrWidth=%%a
  27. goto :GetSrcHeight
  28. )
  29. :GetSrcHeight
  30. for /f "tokens=2 delims==" %%a in ('wmic desktopmonitor get screenheight /value') do (
  31. set ScrHeight=%%a
  32. goto :GetPosition
  33. )
  34. :GetPosition
  35. set /a PosLeft=(ScrWidth-WinWidth)/2
  36. set /a PosTop=(ScrHeight-WinHeight)/2
  37. echo %PosLeft% %PosTop%
  38. set /a "PosD=PosTop<<16|PosLeft"
  39. call :Dec2Hex %PosD% PosH
  40. reg add HKEY_CURRENT_USER\Console /v WindowPosition /t reg_dword /d 0x%PosH% /f
  41. start cmd
  42. goto :eof
  43. :Dec2Hex
  44. set num=%1
  45. set str=0123456789ABCDEF
  46. set numDiv=%num%
  47. set numConn=
  48. :LoopD2H
  49. set /a numMod=numDiv%%16
  50. set numMod=!str:~%numMod%,1!
  51. set /a numDiv/=16
  52. set numConn=%numMod%%numConn%
  53. if %numDiv% equ 0 (
  54. set %2=%numConn%
  55. goto :eof
  56. )
  57. goto :LoopD2H
复制代码

作者: BBCC    时间: 2009-3-4 18:56

为了要实现这个居中...竟然要那么多的代码啊...
作者: Batcher    时间: 2009-3-4 19:58     标题: 回复 2楼 的帖子

Just for fun : )
作者: 小勇12    时间: 2009-3-4 22:41

收下了 ,学习学习
作者: BAT1    时间: 2009-3-5 18:23

因为搞不懂  指定命令行窗口字体大小  是指什么,所以改动了下数字,做下试验。
运行N次 出现N种不同结果:
第一次  直接执行      
在屏幕左上方回显两行操作成功结束  就停那里N久不动了(点X关掉)
第二次   改动          指定命令行窗口字体大小 8改16  16改32   
         在屏幕左上方回显两行操作成功结束   还是停那里N久不动 (点X关掉)
第三次  改动           指定命令行窗口大小   80改40  25改10
         在屏幕左上方回显操作结束   新建窗口居中
第四次   没有改动      回显两行操作成功结束   在左上角新建一个窗口
第五次   (同上次)
希望楼主能教下  指定命令行窗口字体大小  的作用是什么(是指在BAT运行时显示的字符吗)?  网上跟本论坛里都没这方面的贴子。
作者: Batcher    时间: 2009-3-5 20:32

指定命令行窗口字体大小  的作用是什么(是指在BAT运行时显示的字符吗)?

是的
作者: sjminh    时间: 2009-3-5 21:20

说实话,用处不大,还得改注册表,程序本身做不到吗?用手机上的,先收藏,有时间上网再研究吧!
作者: Batcher    时间: 2009-3-5 21:36

说实话,用处不大

同感,见三楼描述。
其中获取显示器分辨率的模块可能有时会用到,最近比较忙,过几天有时间再总结一下。
还得改注册表,程序本身做不到吗?

是的。
作者: Batcher    时间: 2009-3-7 00:56

第一次  直接执行      
在屏幕左上方回显两行操作成功结束  就停那里N久不动了(点X关掉)

运行这个批处理之前,你是不是从来没有在本机使用过WMIC命令?
是的话,这就是原因所在了。
作者: defanive    时间: 2009-3-7 01:02

要实现窗口居中的话,可以用CIdo,里面有/cts参数,可以使窗口居中。。。
作者: Batcher    时间: 2009-3-7 01:29     标题: 回复 10楼 的帖子

是的,除此之外还有不少第三方命令行工具可以实现。
顶楼的代码只是为了挑战纯批处理而已。
作者: defanive    时间: 2009-3-7 11:47

这个的原理我也明白,对每一个窗口都可以在注册表里面保存信息,通过更改这些信息再重新启动批处理即可。只是做起来太浪费时间罢了,效果也不一定好。。。
作者: Batcher    时间: 2009-3-7 12:45     标题: 回复 12楼 的帖子

同意。
见3楼描述。
作者: pusofalse    时间: 2009-3-7 23:02

计算字体大小那里,可以简化为:
  1. set /a FontWidth=8, FontHeight=16
  2. set /a FontSize=(FontHeight "<<" 16) + FontWidth
复制代码
直接对FontSize进行转16进制运算就好了,窗口大小同是。
貌似涉及到LowWord/HighWord(低位/高位?)
作者: Batcher    时间: 2009-3-7 23:41     标题: 回复 14楼 的帖子

感谢指点,明天有时间的话,修改一下代码。
=============================================

[2009-03-09]今天花时间看了一下,你给的公式是不正确的。

计算机中的8*16是十进制表示,我需要把它们转换成十六进制存放到注册表里面。高四位代表宽,低四位代表高,如果低四位转换的结果不满四位则需要在左侧补零。


[ 本帖最后由 Batcher 于 2009-3-9 10:44 编辑 ]
作者: wxcute    时间: 2009-3-8 19:31

要还原的话要删除相应注册表项,最好能批处理之。
作者: Batcher    时间: 2009-3-9 10:49     标题: 回复 16楼 的帖子

删除相应注册表项是恢复的方法之一,另一个方法是手工修改命令行窗口的属性然后保存即可。

如果要用批处理来恢复,需要增加一个功能模块来保存修改前的设置,代码变得更长了,已经超出我“Just for fun”的范围,我不想写了,留个有兴趣的朋友玩吧^_^
作者: pusofalse    时间: 2009-3-17 14:42     标题: 回复 15楼 的帖子

不好意思,现在才看到兄的回复。公式的确错了,应该是:
  1. set /a FontWidth=8, FontHeight=16
  2. set /a FontSize=(FontHeight "<<" 16) "|" FontWidth
复制代码
另外测试不必补零也可以啊~
是否在读取宽/高的时候写错了,测试代码:
设置.bat
  1. @echo Off & setlocal EnableDelayedExpansion
  2. Set /a FontWidth=8, FontHeight=16
  3. Set /a FontSize=(FontHeight "<<" 16) "|" FontWidth
  4. Call :Dec2Hex %FontSize% iFontSize
  5. Echo 0x%iFontSize%
  6. Reg Add hkcu\console /v FontSize /t reg_dword /d 0x%iFontSize%
  7. Pause>nul & Exit /b
  8. :Dec2Hex
  9. set num=%1
  10. set str=0123456789ABCDEF
  11. set numDiv=%num%
  12. set numConn=
  13. :LoopD2H
  14. set /a numMod=numDiv%%16
  15. set numMod=!str:~%numMod%,1!
  16. set /a numDiv/=16
  17. set numConn=%numMod%%numConn%
  18. if %numDiv% equ 0 (
  19.   set %2=%numConn%
  20.   goto :eof
  21. )
  22. goto :LoopD2H
复制代码
读取.bat
  1. @echo Off
  2. For /f "skip=4 tokens=3" %%a in ('reg query hkcu\console\ /v FontSize') do set /a FontSize=%%a
  3. Set /a FontHeight=FontSize ">>" 16, FontWidth=FontSize "&" 0xffff
  4. Echo FontWidth: %FontWidth% FontHeight: %FontHeight%
  5. Pause>nul
复制代码

作者: Batcher    时间: 2009-3-17 22:52     标题: 回复 18楼 的帖子

我说的补零是指我原来采用的那个笨办法,你这个移位的方法是不需要补零的。
感谢分享!
作者: zhong365    时间: 2013-11-2 16:01

实现这个功能好长啊
作者: Hodson124    时间: 2014-3-8 18:23

不懂啊!!!
作者: ShenMian    时间: 2016-10-12 23:03

回复 5# BAT1


    本人第一次就行了,执行速度很满意。
作者: 1139054012    时间: 2019-9-14 18:33

你好,楼主,请问删除哪个注册表项才能恢复原来,用了你1楼的代码,我所有bat和cmd都无法正常打开显示桌面了,一直闪退最小化,我真不知道该怎么办才好
作者: LJY4.0    时间: 2022-5-2 12:49

回复 23# 1139054012
这个事件就告诉我们,RUN脚本的时候,要备份注册表
作者: sds    时间: 2023-1-15 20:28

64位系统运行后窗口消失了!怎么解决???




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2