仙乃日 发表于 2010-8-5 16:18:31

对于液晶暗显示器,所谓的最佳应该就是最大的分辨率吧?

lxl1638 发表于 2010-8-5 16:23:23

原帖由 仙乃日 于 2010-8-5 16:18 发表 http://bbs.wuyou.net/images/common/back.gif
对于液晶暗显示器,所谓的最佳应该就是最大的分辨率吧?
是的,在有显示驱动前题下,最大分辨率就是LCD的最佳分辨率。
最大分辨率可以通过EDID取得,也可以通过API取得。
如果没有显示驱动,通过API取得的最大分辨率永远是4:3的分辨率,但不能用于宽屏显示器。

仙乃日 发表于 2010-8-5 16:33:24

回复 #242 lxl1638 的帖子

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

仙乃日 发表于 2010-8-5 16:38:06

自己用AU3写的


#include <WinAPIEx.au3>

Dim $i = 0, $Data, $z, $max
Dim $max = 0
Do
        $Data = _WinAPI_EnumDisplaySettings('', $i)
        If $Data < $max Then ExitLoop
        If $Data > $max Then
                $max = $Data
        EndIf
        $i += 1
Until IsArray($Data) = 0
$Data = _WinAPI_EnumDisplaySettings('', $i - 1)
If $Data > $Data Then
        If MsgBox(1, "如果是最佳分辨率请按确定,否则按取消!", "         " & $Data & ' x ' & $Data & ' x ' &'32bit ' & $Data & "HZ") = 1 Then
                $a = _ChangeScreenRes($Data, $Data, 32, $Data)
                If @error Then MsgBox(0, "出错啦", "没办法更改此分辨率设置!")
        Else
                Exit
        EndIf
Else
        If MsgBox(1, "如果是最佳分辨率请按确定,否则按取消!", "         " & $Data & ' x ' & $Data & ' x ' & '32bit ' & $Data & "HZ") = 1 Then
                $a = _ChangeScreenRes($Data, $Data, 32, $Data)
                If @error Then MsgBox(0, "出错啦", "没办法更改此分辨率设置!")
        Else
                Exit
        EndIf
EndIf
Func _ChangeScreenRes($i_Width, $i_Height, $i_BitsPP, $i_RefreshRate)
        Local Const $DM_PELSWIDTH = 0x00080000
        Local Const $DM_PELSHEIGHT = 0x00100000
        Local Const $DM_BITSPERPEL = 0x00040000
        Local Const $DM_DISPLAYFREQUENCY = 0x00400000
        Local Const $CDS_TEST = 0x00000002
        Local Const $CDS_UPDATEREGISTRY = 0x00000001
        Local Const $DISP_CHANGE_RESTART = 1
        Local Const $DISP_CHANGE_SUCCESSFUL = 0
        Local Const $HWND_BROADCAST = 0xffff
        Local Const $WM_DISPLAYCHANGE = 0x007E
        If $i_Width = "" Or $i_Width = -1 Then $i_Width = @DesktopWidth ; default to current setting
        If $i_Height = "" Or $i_Height = -1 Then $i_Height = @DesktopHeight ; default to current setting
        If $i_BitsPP = "" Or $i_BitsPP = -1 Then $i_BitsPP = @DesktopDepth ; default to current setting
        If $i_RefreshRate = "" Or $i_RefreshRate = -1 Then $i_RefreshRate = @DesktopRefresh ; default to current setting
        Local $DEVMODE = DllStructCreate("byte;int;byte;int")
        Local $B = DllCall("user32.dll", "int", "EnumDisplaySettings", "ptr", 0, "long", 0, "ptr", DllStructGetPtr($DEVMODE))
        If @error Then
                $B = 0
                SetError(1)
                Return $B
        Else
                $B = $B
        EndIf
        If $B <> 0 Then
                DllStructSetData($DEVMODE, 2, BitOR($DM_PELSWIDTH, $DM_PELSHEIGHT, $DM_BITSPERPEL, $DM_DISPLAYFREQUENCY), 5)
                DllStructSetData($DEVMODE, 4, $i_Width, 2)
                DllStructSetData($DEVMODE, 4, $i_Height, 3)
                DllStructSetData($DEVMODE, 4, $i_BitsPP, 1)
                DllStructSetData($DEVMODE, 4, $i_RefreshRate, 5)
                $B = DllCall("user32.dll", "int", "ChangeDisplaySettings", "ptr", DllStructGetPtr($DEVMODE), "int", $CDS_TEST)
                If @error Then
                        $B = -1
                Else
                        $B = $B
                EndIf
                Select
                        Case $B = $DISP_CHANGE_RESTART
                                $DEVMODE = ""
                                Return 2
                        Case $B = $DISP_CHANGE_SUCCESSFUL
                                DllCall("user32.dll", "int", "ChangeDisplaySettings", "ptr", DllStructGetPtr($DEVMODE), "int", $CDS_UPDATEREGISTRY)
                                DllCall("user32.dll", "int", "SendMessage", "hwnd", $HWND_BROADCAST, "int", $WM_DISPLAYCHANGE, _
                                                "int", $i_BitsPP, "int", $i_Height * 2 ^ 16 + $i_Width)
                                $DEVMODE = ""
                                Return 1
                        Case Else
                                $DEVMODE = ""
                                SetError(1)
                                Return $B
                EndSelect
        EndIf
EndFunc   ;==>_ChangeScreenRes

lxl1638 发表于 2010-8-5 19:25:53

原帖由 仙乃日 于 2010-8-5 16:33 发表 http://bbs.wuyou.net/images/common/back.gif
谢谢解答!要判断是否已经正确加载显示驱动读取HKEY_LOCAL_MACHINE\HARDWARE下的信息应该也行的。
可是对于CRT显示器,最大分辨率应该不是最佳的,不知道有啥办法区分CRT和LCD?
本人没有很好的方法,就是看看有没有刷新率85或以上的,LCD基本不会有85以上的刷新率。
所以本人这个工具只能为CRT提供一个合理可用的分辨率,且CRT也没有最佳分辨率这样的概念,因为不同人、不要的要求在同一显示器的可能不同,
如从事PS或大版面排版工作的人可能需要更大的分辨率,而有些人可能眼力不好,需要字体大些,就用较小的分辨率。

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

仙乃日 发表于 2010-8-5 19:57:07

回复 #245 lxl1638 的帖子

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

仙乃日 发表于 2010-8-5 19:58:39

不知道everest是如何获取这些信息的。

lxl1638 发表于 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 编辑 ]

仙乃日 发表于 2010-8-5 20:52:38

原帖由 lxl1638 于 2010-8-5 20:19 发表 http://bbs.wuyou.net/images/common/back.gif
everest的方法本人不知道,但读取 EDID 是可以取得这些信息的,本人在一个相关帖子中帖有关 EDID (Extended display identification data -- 扩展显示信息数据)
的资料。
另,这个 AOC 显示器有点怪,不知是...
这个机器的EDID信息如下:

"EDID"=hex:00,ff,ff,ff,ff,ff,ff,00,05,e3,30,23,1f,20,00,00,09,13,01,03,68,2f,\
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,\
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,\
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,\
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,\
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,\
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,\
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,\
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,\
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,\
00,00,00,00,00,00,00,00,00


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

lxl1638 发表于 2010-8-9 11:25:33

V1.2.2010.0809特别版:

http://bbs.wuyou.net/images/attachicons/rar.gif AutoDisplay.rar (11.51 KB)


http://bbs.wuyou.net/data/attachment/forum/20100809_426735e82b20e05be9b3loeo3t1lg8Mo.png

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

queyao 发表于 2010-8-9 11:47:04

选中显示为1366*768,可实际却设置为1360*768,何解?
刚发贴就看到新版了,下载试试

lb9433 发表于 2010-8-9 12:31:26

我的昂达780主板几个PE加载显卡驱动都不正常,显示如下图。手动设置宽屏1440*900分辨率,也无法正常显示。用备份的本机显卡驱动在PE中手动加载驱动也不行。现在只能用默认的1024*768的分辨率。

玄天 发表于 2010-8-9 15:26:15

原帖由 lb9433 于 2010-8-9 12:31 发表 http://bbs.wuyou.net/images/common/back.gif
我的昂达780主板几个PE加载显卡驱动都不正常,显示如下图。手动设置宽屏1440*900分辨率,也无法正常显示。用备份的本机显卡驱动在PE中手动加载驱动也不行。现在只能用默认的1024*768的分辨率。

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

lxl1638 发表于 2010-8-9 15:28:26

原帖由 玄天 于 2010-8-9 15:26 发表 http://bbs.wuyou.net/images/common/back.gif

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

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

玄天 发表于 2010-8-9 15:38:00

原帖由 lxl1638 于 2010-8-9 15:28 发表 http://bbs.wuyou.net/images/common/back.gif


他的显示设备带**!号了,估计工具也无能为力。
可以的,这个所谓的视频支持格式其实是受控制台驱动支持的,所以我才建议你加入一个1Hz的刷新率

lxl1638 发表于 2010-8-9 15:38:35

原帖由 queyao 于 2010-8-9 11:47 发表 http://bbs.wuyou.net/images/common/back.gif
选中显示为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 编辑 ]

lxl1638 发表于 2010-8-9 15:45:11

原帖由 玄天 于 2010-8-9 15:38 发表 http://bbs.wuyou.net/images/common/back.gif

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

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

fujianabc 发表于 2010-8-9 15:48:04

原帖由 lxl1638 于 2010-8-9 15:38 发表 http://bbs.wuyou.net/images/common/back.gif

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

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

玄天 发表于 2010-8-9 16:32:40

原帖由 lxl1638 于 2010-8-9 15:45 发表 http://bbs.wuyou.net/images/common/back.gif


没有用的,他宽屏显示器在这种情况下只能使用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 编辑 ]

zxw 发表于 2010-8-9 16:57:11

OK!用这个特别版,我的这台本本自动设置成功了!

lxl1638 发表于 2010-8-9 19:09:24

原帖由 玄天 于 2010-8-9 16:32 发表 http://bbs.wuyou.net/images/common/back.gif

不是没用,你那截图才没用(对美装显卡驱动的宽屏),我也是在使用 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 编辑 ]

xianglang 发表于 2010-8-9 19:34:44

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

玄天 发表于 2010-8-9 20:03:04

原帖由 lxl1638 于 2010-8-9 19:09 发表 http://bbs.wuyou.net/images/common/back.gif

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

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

lxl1638 发表于 2010-8-9 22:17:47

原帖由 玄天 于 2010-8-9 20:03 发表 http://bbs.wuyou.net/images/common/back.gif

虽然并非16:10,不过对于22“显示器来说,此分辨率还是比1280*1024的宽频顺眼些
问题是没有驱动支持下,根本无法确认那个分辨率是最佳的,所以在这种情况下不可能提供推荐设置,因为无法确定推荐设置。

lxl1638 发表于 2010-8-9 22:19:22

原帖由 xianglang 于 2010-8-9 19:34 发表 http://bbs.wuyou.net/images/common/back.gif
使用了最新版的PECMD的PE,在我的上网本+外接LCD上,安装显卡驱动之后,外接LCD全部显示超频而不能使用,即使是用显示属性或者楼主的这个工具将刷新率调整为60HZ、分辨率改为1280*1024,外接LCD仍然显示超频而无 ...
你已经提到其它工具也不行,那就无法了。

玄天 发表于 2010-8-9 22:49:27

原帖由 lxl1638 于 2010-8-9 22:17 发表 http://bbs.wuyou.net/images/common/back.gif

问题是没有驱动支持下,根本无法确认那个分辨率是最佳的,所以在这种情况下不可能提供推荐设置,因为无法确定推荐设置。
不需要自动设置,加个1Hz就是为了没驱动时手动设置方便,懒得去打命令行吗:(

lxl1638 发表于 2010-8-9 22:54:19

原帖由 玄天 于 2010-8-9 22:49 发表 http://bbs.wuyou.net/images/common/back.gif

不需要自动设置,加个1Hz就是为了没驱动时手动设置方便,懒得去打命令行吗:(
你选择刷新率自动试试。
刷新率中最下面那个。
好象本人曾考虑是这样的,有驱动的LCD选择自动时定为60,有驱动的CRT找一个85左右的系统支持的刷新率;无驱动时刷新率选择为1Hz。
如果不行,本人再开再改一下。

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

zerogazer 发表于 2010-8-10 00:54:03

我觉得有必要加个强制分辨率的功能,毕竟不是每个显示器都能被识别出来,这时候强制分辨率就很有必要了。

xianglang 发表于 2010-8-10 04:51:43

原帖由 lxl1638 于 2010-8-9 22:19 发表 http://bbs.wuyou.net/images/common/back.gif

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

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

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

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

玄天 发表于 2010-8-10 09:23:05

原帖由 lxl1638 于 2010-8-9 22:54 发表 http://bbs.wuyou.net/images/common/back.gif

你选择刷新率自动试试。
刷新率中最下面那个。
好象本人曾考虑是这样的,有驱动的LCD选择自动时定为60,有驱动的CRT找一个85左右的系统支持的刷新率;无驱动时刷新率选择为1Hz。
如果不行,本人再开再改一下。
自动不行,不明白为啥:(
页: 1 2 3 4 5 6 7 8 [9] 10 11 12 13 14 15 16 17 18
查看完整版本: AutoDisplay - 轻量级自动设置分辨率工具[V1.3.2011.0223 X86U & X64U]