[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]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

为了要实现这个居中...竟然要那么多的代码啊...
for /f "delims=" %%a in ('%0') do (echo %%a)

TOP

回复 2楼 的帖子

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

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

TOP

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

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

TOP

说实话,用处不大,还得改注册表,程序本身做不到吗?用手机上的,先收藏,有时间上网再研究吧!

TOP

说实话,用处不大

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

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

TOP

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

运行这个批处理之前,你是不是从来没有在本机使用过WMIC命令?
是的话,这就是原因所在了。
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

要实现窗口居中的话,可以用CIdo,里面有/cts参数,可以使窗口居中。。。

TOP

回复 10楼 的帖子

是的,除此之外还有不少第三方命令行工具可以实现。
顶楼的代码只是为了挑战纯批处理而已。
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

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

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

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

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

返回列表