|
我的汇编代码和你帖的差不多的,只不过我把它转换成字符串,让我的AU3程序读出来而已,但同样悲剧的是,WINPE不给运行16位DOS程序,WIN7不给全屏,所以我在找将此代码改写成32位WINDOWS程序的方法,目前了解过IDT,正在看汇编教程的实模式和保护模式方面的资料。
前天还找到一个通过I2C和驱动的方法读取显示器EDID的软件,读取方式可以选择,我测试过,虽然不注册只有30天试用期,但不影响完整功能,我删除注册表中的EDID信息后仍可读出EDID,和我的程序一样能读出来。不过依然在我家这台电脑和在单位的IBM T30笔记本电脑上无法读出EDID数据的情况,我真佩服WINDOWS用它系统的显示器EDID都能读取,也很憎恨VESA的保密(要付费嘛,我又不搞生产线,懒得买),那个软件下载地址是 http://www.nicomsoft.com/wini2cddc/wini2cddclite.zip,你可以去试试看,据我了解,它是通过安装一个sys驱动来读取EDID信息的,因为驱动程序能运行在系统0级特权上,相信这个你也知道了,呵呵。
我最近想试试从DDC 和 I2C 方面入手,意图是解决WINPE和WIN7的问题,目前找了些类似的范例,不过编译都是不成功的,型号是汇编,我看得懂,还找了很多VESA的资料,里面也有C的示范程序,可惜没有针对获取EDID的,只有调节亮度,对比度之类的东西。
我AUTOIT的代码没什么值得参考的,你想看我就帖出来吧,呵呵
Func DosGetEDID()
MsgBox(48, "提示信息", "在获取您显示器信息时可能会出现暂时黑屏的情况,稍后会自动恢复。", 4)
Local $EDIDProg = "C:\edid.com"
Local $EDIDfile = "C:\edid.txt"
FileInstall("edid.com", $EDIDProg)
FileDelete($EDIDfile)
RunWait(@ComSpec & " /c " & $EDIDProg & " " & $EDIDfile)
FileDelete($EDIDProg)
If FileExists($EDIDfile) Then
Local $filename = FileOpen($EDIDfile, 0)
If $filename = -1 Then
FileDelete($EDIDfile)
Return ""
EndIf
Local $EDIDTmp = FileRead($filename, 256)
FileClose($filename)
FileDelete($EDIDfile)
Return $EDIDTmp
Else
Return ""
EndIf
EndFunc ;==>DosGetEDID
Local $EDID = DosGetEDID()
If StringLen($EDID) >= 256 Then
MsgBox(4096, "显示器EDID参数信息", $EDID)
Else
MsgBox(4096, "提示信息", "抱歉,无法获取到您的显示器EDID参数信息。")
EndIf
Exit
另外我想说,(buffer是预备的EDID数据缓冲区地址,device是设备ID,00h - CRT,02h -LCD),0不一定包含所有CRT,我在公司的那台是1,所以我在获取信息时,加了个循环,从0开始到255,全都读不到就结束返回空串。
[ 本帖最后由 曼菲士 于 2010-9-18 01:00 编辑 ] |
|