无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
楼主: lxl1638
打印 上一主题 下一主题

AutoDisplay - 轻量级自动设置分辨率工具[V1.3.2011.0223 X86U & X64U]

[复制链接]
241#
发表于 2010-8-5 16:18:31 | 只看该作者
对于液晶暗显示器,所谓的最佳应该就是最大的分辨率吧?
回复

使用道具 举报

242#
 楼主| 发表于 2010-8-5 16:23:23 | 只看该作者
原帖由 仙乃日 于 2010-8-5 16:18 发表
对于液晶暗显示器,所谓的最佳应该就是最大的分辨率吧?

是的,在有显示驱动前题下,最大分辨率就是LCD的最佳分辨率。
最大分辨率可以通过EDID取得,也可以通过API取得。
如果没有显示驱动,通过API取得的最大分辨率永远是4:3的分辨率,但不能用于宽屏显示器。
回复

使用道具 举报

243#
发表于 2010-8-5 16:33:24 | 只看该作者

回复 #242 lxl1638 的帖子

谢谢解答!要判断是否已经正确加载显示驱动读取HKEY_LOCAL_MACHINE\HARDWARE下的信息应该也行的。
可是对于CRT显示器,最大分辨率应该不是最佳的,不知道有啥办法区分CRT和LCD?
回复

使用道具 举报

244#
发表于 2010-8-5 16:38:06 | 只看该作者

自己用AU3写的


  1. #include <WinAPIEx.au3>

  2. Dim $i = 0, $Data, $z, $max
  3. Dim $max = 0
  4. Do
  5.         $Data = _WinAPI_EnumDisplaySettings('', $i)
  6.         If $Data[0] < $max Then ExitLoop
  7.         If $Data[0] > $max Then
  8.                 $max = $Data[0]
  9.         EndIf
  10.         $i += 1
  11. Until IsArray($Data) = 0
  12. $Data = _WinAPI_EnumDisplaySettings('', $i - 1)
  13. If $Data[0] > $Data[1] Then
  14.         If MsgBox(1, "如果是最佳分辨率请按确定,否则按取消!", "         " & $Data[0] & ' x ' & $Data[1] & ' x ' &  '32bit ' & $Data[3] & "HZ") = 1 Then
  15.                 $a = _ChangeScreenRes($Data[0], $Data[1], 32, $Data[3])
  16.                 If @error Then MsgBox(0, "出错啦", "没办法更改此分辨率设置!")
  17.         Else
  18.                 Exit
  19.         EndIf
  20. Else
  21.         If MsgBox(1, "如果是最佳分辨率请按确定,否则按取消!", "           " & $Data[1] & ' x ' & $Data[0] & ' x ' & '32bit ' & $Data[3] & "HZ") = 1 Then
  22.                 $a = _ChangeScreenRes($Data[1], $Data[0], 32, $Data[3])
  23.                 If @error Then MsgBox(0, "出错啦", "没办法更改此分辨率设置!")
  24.         Else
  25.                 Exit
  26.         EndIf
  27. EndIf
  28. Func _ChangeScreenRes($i_Width, $i_Height, $i_BitsPP, $i_RefreshRate)
  29.         Local Const $DM_PELSWIDTH = 0x00080000
  30.         Local Const $DM_PELSHEIGHT = 0x00100000
  31.         Local Const $DM_BITSPERPEL = 0x00040000
  32.         Local Const $DM_DISPLAYFREQUENCY = 0x00400000
  33.         Local Const $CDS_TEST = 0x00000002
  34.         Local Const $CDS_UPDATEREGISTRY = 0x00000001
  35.         Local Const $DISP_CHANGE_RESTART = 1
  36.         Local Const $DISP_CHANGE_SUCCESSFUL = 0
  37.         Local Const $HWND_BROADCAST = 0xffff
  38.         Local Const $WM_DISPLAYCHANGE = 0x007E
  39.         If $i_Width = "" Or $i_Width = -1 Then $i_Width = @DesktopWidth ; default to current setting
  40.         If $i_Height = "" Or $i_Height = -1 Then $i_Height = @DesktopHeight ; default to current setting
  41.         If $i_BitsPP = "" Or $i_BitsPP = -1 Then $i_BitsPP = @DesktopDepth ; default to current setting
  42.         If $i_RefreshRate = "" Or $i_RefreshRate = -1 Then $i_RefreshRate = @DesktopRefresh ; default to current setting
  43.         Local $DEVMODE = DllStructCreate("byte[32];int[10];byte[32];int[6]")
  44.         Local $B = DllCall("user32.dll", "int", "EnumDisplaySettings", "ptr", 0, "long", 0, "ptr", DllStructGetPtr($DEVMODE))
  45.         If @error Then
  46.                 $B = 0
  47.                 SetError(1)
  48.                 Return $B
  49.         Else
  50.                 $B = $B[0]
  51.         EndIf
  52.         If $B <> 0 Then
  53.                 DllStructSetData($DEVMODE, 2, BitOR($DM_PELSWIDTH, $DM_PELSHEIGHT, $DM_BITSPERPEL, $DM_DISPLAYFREQUENCY), 5)
  54.                 DllStructSetData($DEVMODE, 4, $i_Width, 2)
  55.                 DllStructSetData($DEVMODE, 4, $i_Height, 3)
  56.                 DllStructSetData($DEVMODE, 4, $i_BitsPP, 1)
  57.                 DllStructSetData($DEVMODE, 4, $i_RefreshRate, 5)
  58.                 $B = DllCall("user32.dll", "int", "ChangeDisplaySettings", "ptr", DllStructGetPtr($DEVMODE), "int", $CDS_TEST)
  59.                 If @error Then
  60.                         $B = -1
  61.                 Else
  62.                         $B = $B[0]
  63.                 EndIf
  64.                 Select
  65.                         Case $B = $DISP_CHANGE_RESTART
  66.                                 $DEVMODE = ""
  67.                                 Return 2
  68.                         Case $B = $DISP_CHANGE_SUCCESSFUL
  69.                                 DllCall("user32.dll", "int", "ChangeDisplaySettings", "ptr", DllStructGetPtr($DEVMODE), "int", $CDS_UPDATEREGISTRY)
  70.                                 DllCall("user32.dll", "int", "SendMessage", "hwnd", $HWND_BROADCAST, "int", $WM_DISPLAYCHANGE, _
  71.                                                 "int", $i_BitsPP, "int", $i_Height * 2 ^ 16 + $i_Width)
  72.                                 $DEVMODE = ""
  73.                                 Return 1
  74.                         Case Else
  75.                                 $DEVMODE = ""
  76.                                 SetError(1)
  77.                                 Return $B
  78.                 EndSelect
  79.         EndIf
  80. EndFunc   ;==>_ChangeScreenRes
复制代码
回复

使用道具 举报

245#
 楼主| 发表于 2010-8-5 19:25:53 | 只看该作者
原帖由 仙乃日 于 2010-8-5 16:33 发表
谢谢解答!要判断是否已经正确加载显示驱动读取HKEY_LOCAL_MACHINE\HARDWARE下的信息应该也行的。
可是对于CRT显示器,最大分辨率应该不是最佳的,不知道有啥办法区分CRT和LCD?

本人没有很好的方法,就是看看有没有刷新率85或以上的,LCD基本不会有85以上的刷新率。
所以本人这个工具只能为CRT提供一个合理可用的分辨率,且CRT也没有最佳分辨率这样的概念,因为不同人、不要的要求在同一显示器的可能不同,
如从事PS或大版面排版工作的人可能需要更大的分辨率,而有些人可能眼力不好,需要字体大些,就用较小的分辨率。

[ 本帖最后由 lxl1638 于 2010-8-5 19:33 编辑 ]
回复

使用道具 举报

246#
发表于 2010-8-5 19:57:07 | 只看该作者

回复 #245 lxl1638 的帖子

嗯  有点明白你的方法啦。自己更改下AU3代码也可以实现你的方法。
回复

使用道具 举报

247#
发表于 2010-8-5 19:58:39 | 只看该作者
不知道everest是如何获取这些信息的。

回复

使用道具 举报

248#
 楼主| 发表于 2010-8-5 20:19:34 | 只看该作者
everest的方法本人不知道,但读取 EDID 是可以取得这些信息的,本人在一个相关帖子中帖有关 EDID (Extended display identification data -- 扩展显示信息数据)
的资料。
另,这个 AOC 显示器有点怪,不知是 EDID 数据有错,还是 AOC 本身做假,EDID 数据计算出来的是21',但 AOC 标明是23'

[ 本帖最后由 lxl1638 于 2010-8-5 20:24 编辑 ]
回复

使用道具 举报

249#
发表于 2010-8-5 20:52:38 | 只看该作者
原帖由 lxl1638 于 2010-8-5 20:19 发表
everest的方法本人不知道,但读取 EDID 是可以取得这些信息的,本人在一个相关帖子中帖有关 EDID (Extended display identification data -- 扩展显示信息数据)
的资料。
另,这个 AOC 显示器有点怪,不知是  ...

这个机器的EDID信息如下:

  1. "EDID"=hex:00,ff,ff,ff,ff,ff,ff,00,05,e3,30,23,1f,20,00,00,09,13,01,03,68,2f,\
  2.   1a,78,2a,35,85,a6,56,48,9a,24,12,50,54,bf,ef,00,61,4c,81,80,81,8a,81,8c,95,\
  3.   00,81,40,71,4f,b3,00,02,3a,80,18,71,38,2d,40,58,2c,45,00,dc,0c,11,00,00,1e,\
  4.   00,00,00,fd,00,38,4b,18,50,11,00,0a,20,20,20,20,20,20,00,00,00,fc,00,32,33,\
  5.   33,30,56,0a,20,20,20,20,20,20,20,00,00,00,ff,00,51,32,31,39,32,4a,41,30,30,\
  6.   38,32,32,33,00,01,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
  7.   00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
  8.   00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
  9.   00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
  10.   00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
  11.   00,00,00,00,00,00,00,00,00
复制代码


自己刚才测量了一下 显示尺寸约为51.3cm*28.7cm。应该是EDID的信息有误。
回复

使用道具 举报

250#
 楼主| 发表于 2010-8-9 11:25:33 | 只看该作者
V1.2.2010.0809特别版

AutoDisplay.rar (11.51 KB)





[ 本帖最后由 lxl1638 于 2010-8-9 11:29 编辑 ]
回复

使用道具 举报

251#
发表于 2010-8-9 11:47:04 | 只看该作者
选中显示为1366*768,可实际却设置为1360*768,何解?
刚发贴就看到新版了,下载试试
回复

使用道具 举报

252#
发表于 2010-8-9 12:31:26 | 只看该作者
我的昂达780主板几个PE加载显卡驱动都不正常,显示如下图。手动设置宽屏1440*900分辨率,也无法正常显示。用备份的本机显卡驱动在PE中手动加载驱动也不行。现在只能用默认的1024*768的分辨率。

回复

使用道具 举报

253#
发表于 2010-8-9 15:26:15 | 只看该作者
原帖由 lb9433 于 2010-8-9 12:31 发表
我的昂达780主板几个PE加载显卡驱动都不正常,显示如下图。手动设置宽屏1440*900分辨率,也无法正常显示。用备份的本机显卡驱动在PE中手动加载驱动也不行。现在只能用默认的1024*768的分辨率。

96686

这显卡首先需要dx,然后还需要.net才行吧?
不装驱动可用 EVEREST 检测下视频支持分辨率,然后手动设置,比如
pecmd disp w1400h1050b16f1
回复

使用道具 举报

254#
 楼主| 发表于 2010-8-9 15:28:26 | 只看该作者
原帖由 玄天 于 2010-8-9 15:26 发表

这显卡首先需要dx,然后还需要.net才行吧?
不装驱动可用 EVEREST 检测下视频支持分辨率,然后手动设置,比如
pecmd disp w1400h1050b16f1


他的显示设备带**!号了,估计工具也无能为力。
回复

使用道具 举报

255#
发表于 2010-8-9 15:38:00 | 只看该作者
原帖由 lxl1638 于 2010-8-9 15:28 发表


他的显示设备带**!号了,估计工具也无能为力。

可以的,这个所谓的视频支持格式其实是受控制台驱动支持的,所以我才建议你加入一个1Hz的刷新率
回复

使用道具 举报

256#
 楼主| 发表于 2010-8-9 15:38:35 | 只看该作者
原帖由 queyao 于 2010-8-9 11:47 发表
选中显示为1366*768,可实际却设置为1360*768,何解?
刚发贴就看到新版了,下载试试

本人也不明白,16:9的显示器有 1360*768、1366*768 和 1368*768 这三个很接近的分辨率,
在 AutoDisplay 中,先将选中的分辨率与系统支持的分辨率比较,发现与那个最接近就用那个。

如你选中了1366*768,但你的系统不支持1366*768,也没有1368*768,
发现系统存在与1366*768最接近的1360*768,就使用1360*768。

这三个分辨率都属于16:9分辨率,但比值不完全等于19:9
19/9=1.7777777777777777777777777777778
1360/768=1.7708333333333333333333333333333
1366/768=1.7786458333333333333333333333333
1368/768=1.78125

从中也以看出16:9显示器的混乱,晶板切割时出现的混乱。

[ 本帖最后由 lxl1638 于 2010-8-9 15:48 编辑 ]
回复

使用道具 举报

257#
 楼主| 发表于 2010-8-9 15:45:11 | 只看该作者
原帖由 玄天 于 2010-8-9 15:38 发表

可以的,这个所谓的视频支持格式其实是受控制台驱动支持的,所以我才建议你加入一个1Hz的刷新率


没有用的,他宽屏显示器在这种情况下只能使用4:3的分辨率,你试试只支持1Hz的刷新率能否列出宽屏分辨率?
不能,绝对不能,看下图。在没有驱动支持情况下,任何系统只能支持(列出)4:3分辨率。

未命名.PNG (15.27 KB, 下载次数: 160)

未命名.PNG
回复

使用道具 举报

258#
发表于 2010-8-9 15:48:04 | 只看该作者
原帖由 lxl1638 于 2010-8-9 15:38 发表

本人也不明白,16:9的显示器有 1360*768、1366*768 和 1368*768 这三个很接近的分辨率,
在 AutoDisplay 中,先将选中的分辨率与系统支持的分辨率比较,发现与那个最接近就用那个。

如你选中了1366*768, ...

查了一下,本质是因为1366*768这是一个非标准分辨率,1366不能被8整除。
一些老显卡,以及用vga线输出时,都不能使用1366*768这个分辨率。1360和1368是两个最接近1366的能被8整除的数
回复

使用道具 举报

259#
发表于 2010-8-9 16:32:40 | 只看该作者
原帖由 lxl1638 于 2010-8-9 15:45 发表


没有用的,他宽屏显示器在这种情况下只能使用4:3的分辨率,你试试只支持1Hz的刷新率能否列出宽屏分辨率?
不能,绝对不能,看下图。在没有驱动支持情况下,任何系统只能支持(列出)4:3分辨率。

不是没用,你那截图才没用(对美装显卡驱动的宽屏),我也是在使用 EVEREST 测试后才知道(PE3中未安装显卡也没有安装显示器驱动)并且也正常使用 1400x1050 的分辨率了(可惜仅支持16位色深)现在就是在该分辨率下发的帖,http://bbs.wuyou.net/forum.php?mod=viewthread&tid=173387&extra=page%3D2 这个帖子中的wim启动后会自动设置为该分辨率



[ 本帖最后由 玄天 于 2010-8-9 16:35 编辑 ]

002.gif (16.99 KB, 下载次数: 171)

命令行设置的,你这工具无用*.*

命令行设置的,你这工具无用*.*
回复

使用道具 举报

260#
发表于 2010-8-9 16:57:11 | 只看该作者
OK!用这个特别版,我的这台本本自动设置成功了!
回复

使用道具 举报

261#
 楼主| 发表于 2010-8-9 19:09:24 | 只看该作者
原帖由 玄天 于 2010-8-9 16:32 发表

不是没用,你那截图才没用(对美装显卡驱动的宽屏),我也是在使用 EVEREST 测试后才知道(PE3中未安装显卡也没有安装显示器驱动)并且也正常使用 1400x1050 的分辨率了(可惜仅支持16位色深)现在就是在该分 ...

1400*1050 不是宽屏分辨率,是正规的4:3分辨率,很多以前的CRT显示器在没有驱动支持下都可以用上这个分辨率的。
本人的17'CRT就是这样,无显示驱动的PE中也可以设置成1024*768或1400*1050。

没有显示驱动的情况下,就只支持4:3的分辨率,有些显示器可以上到1400*1050,绝大多数都能上1024*768

[ 本帖最后由 lxl1638 于 2010-8-9 19:10 编辑 ]
回复

使用道具 举报

262#
发表于 2010-8-9 19:34:44 | 只看该作者
使用了最新版的PECMD的PE,在我的上网本+外接LCD上,安装显卡驱动之后,外接LCD全部显示超频而不能使用,即使是用显示属性或者楼主的这个工具将刷新率调整为60HZ、分辨率改为1280*1024,外接LCD仍然显示超频而无法显示桌面内容——这个工具检测和自动设置的是刷新率85HZ、分辨率1600*1200。
回复

使用道具 举报

263#
发表于 2010-8-9 20:03:04 | 只看该作者
原帖由 lxl1638 于 2010-8-9 19:09 发表

1400*1050 不是宽屏分辨率,是正规的4:3分辨率,很多以前的CRT显示器在没有驱动支持下都可以用上这个分辨率的。
本人的17'CRT就是这样,无显示驱动的PE中也可以设置成1024*768或1400*1050。

没有显示驱动 ...

虽然并非16:10,不过对于22“显示器来说,此分辨率还是比1280*1024的宽频顺眼些
回复

使用道具 举报

264#
 楼主| 发表于 2010-8-9 22:17:47 | 只看该作者
原帖由 玄天 于 2010-8-9 20:03 发表

虽然并非16:10,不过对于22“显示器来说,此分辨率还是比1280*1024的宽频顺眼些

问题是没有驱动支持下,根本无法确认那个分辨率是最佳的,所以在这种情况下不可能提供推荐设置,因为无法确定推荐设置。
回复

使用道具 举报

265#
 楼主| 发表于 2010-8-9 22:19:22 | 只看该作者
原帖由 xianglang 于 2010-8-9 19:34 发表
使用了最新版的PECMD的PE,在我的上网本+外接LCD上,安装显卡驱动之后,外接LCD全部显示超频而不能使用,即使是用显示属性或者楼主的这个工具将刷新率调整为60HZ、分辨率改为1280*1024,外接LCD仍然显示超频而无 ...

你已经提到其它工具也不行,那就无法了。
回复

使用道具 举报

266#
发表于 2010-8-9 22:49:27 | 只看该作者
原帖由 lxl1638 于 2010-8-9 22:17 发表

问题是没有驱动支持下,根本无法确认那个分辨率是最佳的,所以在这种情况下不可能提供推荐设置,因为无法确定推荐设置。

不需要自动设置,加个1Hz就是为了没驱动时手动设置方便,懒得去打命令行吗:(
回复

使用道具 举报

267#
 楼主| 发表于 2010-8-9 22:54:19 | 只看该作者
原帖由 玄天 于 2010-8-9 22:49 发表

不需要自动设置,加个1Hz就是为了没驱动时手动设置方便,懒得去打命令行吗:(

你选择刷新率自动试试。
刷新率中最下面那个。
好象本人曾考虑是这样的,有驱动的LCD选择自动时定为60,有驱动的CRT找一个85左右的系统支持的刷新率;无驱动时刷新率选择为1Hz。
如果不行,本人再开再改一下。

[ 本帖最后由 lxl1638 于 2010-8-9 22:57 编辑 ]
回复

使用道具 举报

268#
发表于 2010-8-10 00:54:03 | 只看该作者
我觉得有必要加个强制分辨率的功能,毕竟不是每个显示器都能被识别出来,这时候强制分辨率就很有必要了。
回复

使用道具 举报

269#
发表于 2010-8-10 04:51:43 | 只看该作者
原帖由 lxl1638 于 2010-8-9 22:19 发表

你已经提到其它工具也不行,那就无法了。


我怀疑是不是你的新版PECMD内置的显示器自动刷新造成的,我有时间换回之前的PECMD版本试试。

经过试验,换回PECMD-V3.9.2010.0616版本,问题消失,基本可以肯定是新版PECMD的显示自动设置导致的问题。

[ 本帖最后由 xianglang 于 2010-8-10 05:19 编辑 ]
回复

使用道具 举报

270#
发表于 2010-8-10 09:23:05 | 只看该作者
原帖由 lxl1638 于 2010-8-9 22:54 发表

你选择刷新率自动试试。
刷新率中最下面那个。
好象本人曾考虑是这样的,有驱动的LCD选择自动时定为60,有驱动的CRT找一个85左右的系统支持的刷新率;无驱动时刷新率选择为1Hz。
如果不行,本人再开再改一下。

自动不行,不明白为啥:(
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-11-25 18:31

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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