无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站广告联系 微信:wuyouceo QQ:184822951
楼主: houxiren
打印 上一主题 下一主题

[已解决] 获取仍在连接的最大显示器的分辨率(单、多显示器通用)

[复制链接]
跳转到指定楼层
1#
发表于 2016-12-10 17:17:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 houxiren 于 2016-12-11 16:48 编辑

感谢11楼的  不知  坛友。完美地解决了问题。
不知 坛友的不仅代码编得漂亮,更有代码,有图,有验证文件。帮助解决问题的方式,让人易于学习。非常感谢~!

只要是电脑曾经连接过的显示器,就会在注册表里留下痕迹,且就算该显示器已经断开了,痕迹仍然在。
以WIN7以及WIN10为例,痕迹在HKLM\SYSTEM\CurrentControlSet\Hardware Profiles\UnitedVideo\CONTROL\VIDEO\{84F85163-5FAD-4F8A-9541-40996D6481C1}
({84F85163-5FAD-4F8A-9541-40996D6481C1}这个名字不同电脑,不同)
如我的电脑共连接过两台显示器,其中一台已断开。用命令Reg Query "HKLM\SYSTEM\CurrentControlSet\Hardware Profiles\UnitedVideo\CONTROL\VIDEO" /s
返回以下数据:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Hardware Profiles\UnitedVideo\CONTRO
L\VIDEO\{84F85163-5FAD-4F8A-9541-40996D6481C1}

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Hardware Profiles\UnitedVideo\CONTRO
L\VIDEO\{84F85163-5FAD-4F8A-9541-40996D6481C1}\0000
    Attach.ToDesktop    REG_DWORD    0x1
    DefaultSettings.BitsPerPel    REG_DWORD    0x20
    DefaultSettings.XResolution    REG_DWORD    0x556
    DefaultSettings.YResolution    REG_DWORD    0x300
    DefaultSettings.VRefresh    REG_DWORD    0x3c
    DefaultSettings.Flags    REG_DWORD    0x0
    DefaultSettings.XPanning    REG_DWORD    0x0
    DefaultSettings.YPanning    REG_DWORD    0x0
    DefaultSettings.Orientation    REG_DWORD    0x0
    DefaultSettings.FixedOutput    REG_DWORD    0x0
    Attach.RelativeX    REG_DWORD    0xfffffaaa
    Attach.RelativeY    REG_DWORD    0x0
    DefaultSettings.DriverExtra    REG_BINARY    3C00000001000000150000000100000
00000000000010000000000000100000000000000FF0000009C05000023030000560500000003000
03C00000001000000206F21049C05000000000000206F21040000000001000000000000000000000
00000000001000000010000000100000000000000040000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000200000000000000

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Hardware Profiles\UnitedVideo\CONTRO
L\VIDEO\{84F85163-5FAD-4F8A-9541-40996D6481C1}\0001
    Attach.ToDesktop    REG_DWORD    0x0
    DefaultSettings.BitsPerPel    REG_DWORD    0x20
    DefaultSettings.XResolution    REG_DWORD    0x780
    DefaultSettings.YResolution    REG_DWORD    0x438
    DefaultSettings.VRefresh    REG_DWORD    0x3c
    DefaultSettings.Flags    REG_DWORD    0x0
    DefaultSettings.XPanning    REG_DWORD    0x0
    DefaultSettings.YPanning    REG_DWORD    0x0
    DefaultSettings.Orientation    REG_DWORD    0x0
    DefaultSettings.FixedOutput    REG_DWORD    0x0
    Attach.RelativeX    REG_DWORD    0x0
    Attach.RelativeY    REG_DWORD    0x0
    DefaultSettings.DriverExtra    REG_BINARY    3C00000001000000150000000100000
00000000002010000000000000100000000000000190000009808000065040000800700003804000
03C0000000100000020EED908980800000000000020EED9080000000001000000000000000000000
00000000002000000010000000100000001000000040000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000200000000000000


备注:1,Attach.ToDesktop 的值表示该显示器是否仍处于连接状态,0x0已断开,0x1连接中。
      2,分辨率是十六进制的,如以上的,转化成十进制就是
         DefaultSettings.XResolution    REG_DWORD    0x556   1366
         DefaultSettings.YResolution    REG_DWORD    0x300   768
         DefaultSettings.XResolution    REG_DWORD    0x780   1920
         DefaultSettings.YResolution    REG_DWORD    0x438   1080

目的:如何对比 Attach.ToDesktop*DefaultSettings.XResolution*DefaultSettings.YResolution 值,返回最大的值
      如以上就是1*1366*768 > 0*1920*1080 所以返回
      X=1366
      Y=768

求助坛友前辈,谢谢了!!

{84F85163-5FAD-4F8A-9541-40996D6481C1}.zip

869 Bytes, 下载次数: 9

2#
发表于 2016-12-10 17:55:22 | 只看该作者
虽然我对楼主说的还是有些迷迷糊糊的,也没有楼主的条件(多显示器)。但楼主说的第二个方法里的有些过程是可以通过批处理实现的。
1.数学计算:
set /A (数学表达式)



2.进行数字比较。
if /I 表达式 命令






点评

你就把我公布的注册表内容当成一个txt文本来,你怎么计算呢?  详情 回复 发表于 2016-12-10 21:10
回复

使用道具 举报

3#
发表于 2016-12-10 19:54:41 | 只看该作者
  1. set X_org=00000780
  2. set Y_org=00000438
  3. set /a X=0x%X_org%
  4. set /a Y=0x%Y_org%
  5. echo %X% %Y%
复制代码

点评

好像没什么用,但谢谢回复。  详情 回复 发表于 2016-12-10 21:11
回复

使用道具 举报

4#
 楼主| 发表于 2016-12-10 21:10:30 | 只看该作者
不知 发表于 2016-12-10 17:55
虽然我对楼主说的还是有些迷迷糊糊的,也没有楼主的条件(多显示器)。但楼主说的第二个方法里的有些过程是 ...

你就把我公布的注册表内容当成一个txt文本来,你怎么计算呢?

点评

由于方便计算,我把第一个值改为了00000001 reg.txt的内容: [attachimg]255176[/attachimg] 计算.cmd的内容: @echo off setlocal DISABLEDELAYEDEXPANSION SET ret=1 for /f "skip=1 tokens=1,2 delims=: "  详情 回复 发表于 2016-12-10 22:30
回复

使用道具 举报

5#
 楼主| 发表于 2016-12-10 21:11:18 | 只看该作者

好像没什么用,但谢谢回复。
回复

使用道具 举报

6#
发表于 2016-12-10 21:33:00 | 只看该作者
这样再运行上面的代码就一定能获取有效的分辨率。


楼主这是想干嘛?我记得多显示器重新连接好像会记住设置的
回复

使用道具 举报

7#
发表于 2016-12-10 22:30:29 | 只看该作者
本帖最后由 不知 于 2016-12-10 22:33 编辑
houxiren 发表于 2016-12-10 21:10
你就把我公布的注册表内容当成一个txt文本来,你怎么计算呢?

由于方便计算,我把第一个值改为了00000001
reg.txt的内容:

计算.cmd的内容:
@echo off
setlocal DISABLEDELAYEDEXPANSION
SET ret=1
for /f "skip=1 tokens=1,2 delims=: " %%i in (reg.txt) do call :run %%j
echo 计算的结果是%ret%
if /I %ret% EQU 0 echo 计算值等于0
pause
exit

rem 以下代码需放到末尾
:run
echo %1
set /A temp = 0x%1
echo %temp%
set /A  ret *= 0x%1

结果:

未修改为0时的结果:

文件:
计算.7z (608 Bytes, 下载次数: 3)


点评

太感谢您了。问题还没解决,是我表述不清,已重新写了情况及要求,期盼您再看一下,谢谢。  详情 回复 发表于 2016-12-11 08:52
回复

使用道具 举报

8#
 楼主| 发表于 2016-12-11 08:52:20 | 只看该作者
不知 发表于 2016-12-10 22:30
由于方便计算,我把第一个值改为了00000001
reg.txt的内容:

太感谢您了。问题还没解决,是我表述不清,已重新写了情况及要求,期盼您再看一下,谢谢。
回复

使用道具 举报

9#
发表于 2016-12-11 09:45:50 | 只看该作者
楼主的意思是这样的吗?

查找HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Hardware Profiles\UnitedVideo\CONTRO
L\VIDEO\{84F85163-5FAD-4F8A-9541-40996D6481C1}所有,Attach.ToDesktop数据为0x1的子项,找出这些子项中DefaultSettings.XResolution和DefaultSettings.YResolution最大的一对,算成10进制,需不需要提供最大值所在的组册表路径,最大值以XResolution还是以YResolution为准?
回复

使用道具 举报

10#
发表于 2016-12-11 11:12:21 | 只看该作者
私下认为对于这种计算使用VBS比批处理更适合点,一是不出现黑框,二是速度更快,三是可以直接使用穷举来读取注册表并进行比较。
回复

使用道具 举报

11#
发表于 2016-12-11 12:45:16 | 只看该作者
重新写了一下批出理。
内容:
@echo off
set ret1=0
set ret2=0
set defX=1
set tempA=0
set tempX=0
set tempY=0
for /f "skip=1 tokens=1,2 delims=:" %%i in ('type v.reg') do call :run "%%i" %%j
echo  %key% X= %X% Y= %Y%
pause
exit
:run
set temp=%1
set temp1=%2

if %ret1% GTR %ret2% (
set /a X= 0x%tempX%
set /a Y= 0x%tempY%
set key=%tempkey%
set ret2=%ret1%
)
if "%temp:~2,4%"=="HKEY" set tempkey=%temp:~2,131%
if "%temp:~2,16%"=="Attach.ToDesktop" set tempA=%temp1%
if "%temp:~19,1%"=="R" (
if %defX%==1 (
set tempX=%temp1%
set defX=2
)
if %defX%==2 (
set tempY=%temp1%
set defX=3
)
)
if "%temp:~19,1%"=="R" (
if %defX%==4 (
set /A ret1 = 0x%tempA% * 0x%tempX% * 0x%tempY%
rem echo %tempX% %tempY%
set defX=1
)
if %defX%==3 set defX=4
)
结果:

试验文件:
计算.7z (1.11 KB, 下载次数: 13)


点评

太感谢了。完美解决问题。谢谢您。 另,不仅是问题解决得完美,而解决时,还带贴出代码,更附有试验文件,让我以及对此问题也有兴趣的坛友可以更快速直观的学习。 谢谢!!!!!!!!!!!!  详情 回复 发表于 2016-12-11 16:41
回复

使用道具 举报

12#
 楼主| 发表于 2016-12-11 16:41:26 | 只看该作者
不知 发表于 2016-12-11 12:45
重新写了一下批出理。
内容:
@echo off

太感谢了。完美解决问题。谢谢您。

另,不仅是问题解决得完美,而解决时,还带贴出代码,更附有试验文件,让我以及对此问题也有兴趣的坛友可以更快速直观的学习。

谢谢!!!!!!!!!!!!
回复

使用道具 举报

13#
发表于 2016-12-11 17:08:29 | 只看该作者


  1. @echo off
  2. color 3f
  3. rem 查找%regpath%中所有子项中%regname%的数据是%regdata%时,DefaultSettings.XResolution和DefaultSettings.YResolution的大小,并对结果两者的乘积从大到小排序
  4. rem 鉴于reg命令XP和Win7+不同,故需要Win7以上系统,Win8.1测试通过!
  5. setlocal enabledelayedexpansion
  6. set regpath=HKLM\SYSTEM\CurrentControlSet\Hardware Profiles\UnitedVideo\CONTROL\VIDEO
  7. set regname=Attach.ToDesktop
  8. set regdata=0x1
  9. del %temp%\abcd.tmp /f /q >nul 2>nul
  10. rem 查找指定键值和数据所在的项
  11. rem 查找所有子项
  12. for /f "delims=" %%X in ('reg query "%regpath%" /s /f * /k') do (
  13.         rem 在所有子项中查找含有指定键值的项
  14.         for /f "tokens=1,2 delims=:" %%Y in ('reg query "%%X" /v "%regname%" 2^>nul ^| findstr /n .') do (
  15.                 rem 在含有指定键值的项中查找含有特定数据的项
  16.                 if %%Y==2 set regpathok=%%Z
  17.                 if %%Y==3 (
  18.                         echo %%Z | findstr /i /c:"%regdata%" >nul 2>&1
  19.                         if !errorlevel!==0 (
  20.                                 rem 查找完毕,此处的变量regpathok就是指定键值和数据所在的项
  21.                                 for /f "tokens=1,2 delims=:" %%a in ('reg query "!regpathok!" /v "DefaultSettings.?Resolution" ^| findstr /n .') do (
  22.                                         if %%a==2 set AAA=%%b
  23.                                         if %%a==3 for /f "tokens=3" %%c in ("%%b") do set /a XRES=%%c
  24.                                         if %%a==4 for /f "tokens=3" %%d in ("%%b") do set /a YRES=%%d
  25.                                         if %%a==6 set /A XYRES=!XRES!*!YRES! && echo !XYRES!          !XRES!×!YRES!                          !AAA! >>%temp%\abcd.tmp
  26.                                 )
  27.                         )
  28.                 )
  29.         )
  30. )
  31. sort %temp%\abcd.tmp /o %temp%\abcd_sort.txt
  32. echo 计算结果          分辨率                          注册表路径 >%temp%\abcd_sortb.txt
  33. type %temp%\abcd_sort.txt>>%temp%\abcd_sortb.txt
  34. start %temp%\abcd_sortb.txt
  35. exit
复制代码

点评

太感谢您的回复了。你的代码也能完美实现目的。 您的代码的思路,对于我的另一个目的有关联。还想请您再帮助。 1,在Extensions目录下,存在着一些子目录,名称不固定。 2,这些子目录下,都各自存在一个子目  详情 回复 发表于 2016-12-12 10:34
回复

使用道具 举报

14#
发表于 2016-12-11 17:10:52 | 只看该作者
  1. 测试结果

  2. 计算结果          分辨率                          注册表路径
  3. 2073600          1920×1080                          HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Hardware Profiles\UnitedVideo\CONTROL\VIDEO\{2756EFE0-141B-417C-8C60-EBE9120A8CE4}\0000  
  4. 2073600          1920×1080                          HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Hardware Profiles\UnitedVideo\CONTROL\VIDEO\{2756EFE0-141B-417C-8C60-EBE9120A8CE4}\0000\Mon040F0400  
  5. 2073600          1920×1080                          HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Hardware Profiles\UnitedVideo\CONTROL\VIDEO\{68406533-4ED4-4540-9848-B9D678A7B02C}\0000  
  6. 2073600          1920×1080                          HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Hardware Profiles\UnitedVideo\CONTROL\VIDEO\{B1FA947A-67EB-4A40-93DB-691D2D5B10B4}\0000  
  7. 2073600          1920×1080                          HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Hardware Profiles\UnitedVideo\CONTROL\VIDEO\{D1AE77D7-21DA-4BC8-9393-A893FFA87807}\0000  
  8. 2073600          1920×1080                          HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Hardware Profiles\UnitedVideo\CONTROL\VIDEO\{D1AE77D7-21DA-4BC8-9393-A893FFA87807}\0000\Mon040F0400  
  9. 2073600          1920×1080                          HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Hardware Profiles\UnitedVideo\CONTROL\VIDEO\{DC19E068-0AD4-4D51-ACBE-67C7CB00CED0}\0000  
  10. 786432          1024×768                          HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Hardware Profiles\UnitedVideo\CONTROL\VIDEO\{0790EF58-A28C-4FE8-8D55-C0EF3DCB17C0}\0000  
  11. 786432          1024×768                          HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Hardware Profiles\UnitedVideo\CONTROL\VIDEO\{2776978B-DD19-4AA0-A9F6-C0CD9ABA7DE0}\0000  
  12. 786432          1024×768                          HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Hardware Profiles\UnitedVideo\CONTROL\VIDEO\{2776978B-DD19-4AA0-A9F6-C0CD9ABA7DE0}\0000\Mon54445648  
复制代码
回复

使用道具 举报

15#
 楼主| 发表于 2016-12-12 10:34:29 | 只看该作者


太感谢您的回复了。你的代码也能完美实现目的。

您的代码的思路,对于我的另一个目的有关联。还想请您再帮助。

1,在Extensions目录下,存在着一些子目录,名称不固定。
2,这些子目录下,都各自存在一个子目录,名称也不固定。
3,这些子目录下,存在一个 _locales 目录(极个别会没有这个目录,比如图中的lmplhafgobijlmngdfmpgliebgkkalpn目录下就没有)

要求:_locales 目录下,如果存在en目录和ZH_CN目录一律保留,其余的同级目录删除。
         如果_locales 目录下,没有en目录,而有en_GB目录,则保留en_GB目录。

2016-12-12_102851.png (16.22 KB, 下载次数: 84)

2016-12-12_102851.png

点评

说白了就是精简掉多余的语言文件? 搜索一下,删除不就可以了……  详情 回复 发表于 2016-12-12 17:26
批处理内容: @echo off set root=.\Extensions rem 目录遍历 for /f %%i in ('dir /A:D /B "%root%"') do ( if exist "%root%\%%i\_locales" call :del "%root%\%%i\_locales" ) goto :EOF :del fo  详情 回复 发表于 2016-12-12 12:42
回复

使用道具 举报

16#
发表于 2016-12-12 12:42:03 | 只看该作者
houxiren 发表于 2016-12-12 10:34
太感谢您的回复了。你的代码也能完美实现目的。

您的代码的思路,对于我的另一个目的有关联。还想请 ...

批处理内容:
@echo off
set root=.\Extensions

rem 目录遍历
for /f %%i in ('dir /A:D /B "%root%"') do (
if exist "%root%\%%i\_locales" call :del  "%root%\%%i\_locales"
)

goto :EOF

:del
for /f %%i in ('dir /A:D /B %1') do (
if /I not %%i==ZH_CN if /I not %%i==en  if /I not %%i==en_GB rd /s /q %1\%%i
if exist %1\en if exist %1\en_GB rd /s /q %1\en_GB
)

pause
测试文件:
test.7z (537 Bytes, 下载次数: 1)

点评

少遍历了一级,下午改。  详情 回复 发表于 2016-12-12 13:15
我上传个测试文件,您再帮忙看一下。谢谢  详情 回复 发表于 2016-12-12 13:15
回复

使用道具 举报

17#
 楼主| 发表于 2016-12-12 13:15:42 | 只看该作者
本帖最后由 houxiren 于 2016-12-12 13:17 编辑
不知 发表于 2016-12-12 12:42
批处理内容:
@echo off
set root=.\Extensions


我上传个测试文件,您再帮忙看一下。谢谢

Documents.zip

138.76 KB, 下载次数: 2

点评

修改了一下,支持多级目录遍历。 内容: @echo off set root=%CD% call :find "%CD%" rem 目录遍历 :find CD %1 for /f "delims=/" %%i in ('dir /A:D /B') do ( if exist "%%i\_locales" call :del "%%i\  详情 回复 发表于 2016-12-12 17:13
回复

使用道具 举报

18#
发表于 2016-12-12 13:15:52 来自手机 | 只看该作者
不知 发表于 2016-12-12 12:42
批处理内容:
@echo off
set root=.\Extensions

少遍历了一级,下午改。
回复

使用道具 举报

19#
发表于 2016-12-12 17:13:49 | 只看该作者
houxiren 发表于 2016-12-12 13:15
我上传个测试文件,您再帮忙看一下。谢谢

修改了一下,支持多级目录遍历。
内容:
@echo off
set root=%CD%
call :find "%CD%"
rem 目录遍历
:find
CD %1
for /f "delims=/" %%i in ('dir /A:D /B') do (
if exist "%%i\_locales" call :del  "%%i\_locales"
if  not exist "%%i\_locales"  call :find "%%i"
)

if not "%root%"=="%CD%" CD ..
if "%root%"=="%CD%" pause && exit
goto :EOF

:del
for /f %%i in ('dir /A:D /B %1') do (
if /I not %%i==ZH_CN if /I not %%i==en  if /I not %%i==en_GB rd /s /q %1\%%i
if exist %1\en if exist %1\en_GB rd /s /q %1\en_GB
)
echo cleaning %CD%\%1

文件:
clean.7z (31.55 KB, 下载次数: 7)

点评

谢谢不知先生,完美解决。  详情 回复 发表于 2016-12-13 08:51
回复

使用道具 举报

20#
发表于 2016-12-12 17:26:46 来自手机 | 只看该作者
houxiren 发表于 2016-12-12 10:34
太感谢您的回复了。你的代码也能完美实现目的。

您的代码的思路,对于我的另一个目的有关联。还想请 ...

说白了就是精简掉多余的语言文件?

搜索一下,删除不就可以了……
回复

使用道具 举报

21#
 楼主| 发表于 2016-12-13 08:51:01 | 只看该作者
不知 发表于 2016-12-12 17:13
修改了一下,支持多级目录遍历。
内容:
@echo off

谢谢不知先生,完美解决。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2024-4-27 03:54

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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