autoit改变分辩率函数
这个函数以前在论坛找的,为什么我在XP系统调用正常,而在WIN7系统,其他分辨率都正常,而就是不能改变到最大分辩率,大家来帮我看看啊,谢谢了。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 说明下,楼主是Win7 64位。 回复 2# xiehuahere
不是,我win32位的试了也不行。 这个函数在win7下无法从低分辨往高分辨改,xp忘了,好像可以,不知道具体原因何在,一直在查资料 回复 4# netegg
那你有没有好一点的函数,推荐一下啊,谢谢,我要改变屏幕分辩率,现在就找到这个函数。 回复 3# wkk5678
我家里的台式机是Win7 32位的,回家可以试下。 回复 6# xiehuahere
好,那先谢谢。 回复 7# wkk5678
刚试验过了,我的Win7 32位操作系统的台式机上执行没问题,分辨率从1366x768成功更改到1600x900。只能分析你的代码了。 回复 8# xiehuahere
问一下,你的1600X900是你电脑的最大分辨率吗?我的是从低分辨率调到最大分辨率不行。
代码是执行下面这句时,返回值出现问题,再帮我分析一下,谢谢啊!
$B = DllCall("user32.dll", "int", "ChangeDisplaySettings", "ptr", DllStructGetPtr($DEVMODE), "int", $CDS_TEST) 本帖最后由 xiehuahere 于 2012-11-20 09:23 编辑
回复 9# wkk5678
嗯,1600X900就是我电脑的最大分辨率。
你也是在32位机上调试的吗?
猜想可能是字节对齐造成的问题,但int为4字节,按默认对齐系数为8字节来计算,DllStructCreate中的int和int也都是8字节的整数倍,所以又好像不会有这个问题。
关于字节对齐:
http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=3637997
http://wenku.baidu.com/view/0e96cb70f242336c1eb95ec4.html
其实我也不懂,等高人吧,或者等蛋蛋研究出来吧。 回复 10# xiehuahere
是的,我WIN7的64位和32位都试了,Win8也试了,都不行,就是XP可以。
好的,那谢谢你。 进来学习一下。。 用api看看·应该可以的 进来学习一下 测试 : Win7 x64 旗舰版从 800x600调整为 1680x1050正常要作
PS :忍不住想问下你们讨论的最大分辨率是指显卡所支持的最大分辨率还是显示器支持的显示分辨率?
因为很多时候显示器最大分辨率都是小于显卡最大分辨率的而且色深刷新率也必须符合
页:
[1]
2