[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[其他] 命令行窗口自动居中之批处理版(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
复制代码
1

评分人数

    • wxcute: 多谢分享。好像要删除注册表项才能还原了, ...PB + 8
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

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

TOP

回复 23# 1139054012
这个事件就告诉我们,RUN脚本的时候,要备份注册表
https://pc.woozooo.com/mydisk.php

TOP

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

TOP

回复 5# BAT1


    本人第一次就行了,执行速度很满意。

TOP

不懂啊!!!

TOP

实现这个功能好长啊

TOP

回复 18楼 的帖子

我说的补零是指我原来采用的那个笨办法,你这个移位的方法是不需要补零的。
感谢分享!
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 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
复制代码
1

评分人数

    • Batcher: 感谢分享PB + 10 技术 + 1
心绪平和,眼藏静谧。

TOP

回复 16楼 的帖子

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

如果要用批处理来恢复,需要增加一个功能模块来保存修改前的设置,代码变得更长了,已经超出我“Just for fun”的范围,我不想写了,留个有兴趣的朋友玩吧^_^
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

要还原的话要删除相应注册表项,最好能批处理之。

TOP

回复 14楼 的帖子

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

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

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


[ 本帖最后由 Batcher 于 2009-3-9 10:44 编辑 ]
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

计算字体大小那里,可以简化为:
  1. set /a FontWidth=8, FontHeight=16
  2. set /a FontSize=(FontHeight "<<" 16) + FontWidth
复制代码
直接对FontSize进行转16进制运算就好了,窗口大小同是。
貌似涉及到LowWord/HighWord(低位/高位?)
心绪平和,眼藏静谧。

TOP

回复 12楼 的帖子

同意。
见3楼描述。
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

这个的原理我也明白,对每一个窗口都可以在注册表里面保存信息,通过更改这些信息再重新启动批处理即可。只是做起来太浪费时间罢了,效果也不一定好。。。

TOP

返回列表