找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 88052|回复: 24

[其他] 命令行窗口自动居中之批处理版(2009-03-17更新)

[复制链接]
发表于 2009-3-4 16:07:50 | 显示全部楼层 |阅读模式
【方案一】比较原始的方法,思路比较容易理解。
  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
复制代码

评分

参与人数 1PB +8 收起 理由
wxcute + 8 多谢分享。好像要删除注册表项才能还原了, ...

查看全部评分

发表于 2009-3-4 18:56:39 | 显示全部楼层
为了要实现这个居中...竟然要那么多的代码啊...
 楼主| 发表于 2009-3-4 19:58:10 | 显示全部楼层

回复 2楼 的帖子

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

是的
发表于 2009-3-5 21:20:48 | 显示全部楼层
说实话,用处不大,还得改注册表,程序本身做不到吗?用手机上的,先收藏,有时间上网再研究吧!
 楼主| 发表于 2009-3-5 21:36:15 | 显示全部楼层
说实话,用处不大

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

是的。
 楼主| 发表于 2009-3-7 00:56:55 | 显示全部楼层
第一次  直接执行      
在屏幕左上方回显两行操作成功结束  就停那里N久不动了(点X关掉)

运行这个批处理之前,你是不是从来没有在本机使用过WMIC命令?
是的话,这就是原因所在了。
发表于 2009-3-7 01:02:22 | 显示全部楼层
要实现窗口居中的话,可以用CIdo,里面有/cts参数,可以使窗口居中。。。
 楼主| 发表于 2009-3-7 01:29:56 | 显示全部楼层

回复 10楼 的帖子

是的,除此之外还有不少第三方命令行工具可以实现。
顶楼的代码只是为了挑战纯批处理而已。
发表于 2009-3-7 11:47:28 | 显示全部楼层
这个的原理我也明白,对每一个窗口都可以在注册表里面保存信息,通过更改这些信息再重新启动批处理即可。只是做起来太浪费时间罢了,效果也不一定好。。。
 楼主| 发表于 2009-3-7 12:45:20 | 显示全部楼层

回复 12楼 的帖子

同意。
见3楼描述。
发表于 2009-3-7 23:02:06 | 显示全部楼层
计算字体大小那里,可以简化为:
  1. set /a FontWidth=8, FontHeight=16
  2. set /a FontSize=(FontHeight "<<" 16) + FontWidth
复制代码
直接对FontSize进行转16进制运算就好了,窗口大小同是。
貌似涉及到LowWord/HighWord(低位/高位?)
 楼主| 发表于 2009-3-7 23:41:14 | 显示全部楼层

回复 14楼 的帖子

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

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

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


[ 本帖最后由 Batcher 于 2009-3-9 10:44 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 00:15 , Processed in 0.023556 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表