找回密码
 加入
搜索
查看: 15487|回复: 23

[系统综合] autoit改变分辩率函数

 火... [复制链接]
发表于 2012-11-19 10:15:50 | 显示全部楼层 |阅读模式
这个函数以前在论坛找的,为什么我在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[32];int[10];byte[32];int[6]")
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[0]
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[0]
  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
发表于 2012-11-19 11:03:17 | 显示全部楼层
说明下,楼主是Win7 64位。
 楼主| 发表于 2012-11-19 11:05:47 | 显示全部楼层
回复 2# xiehuahere


    不是,我win32位的试了也不行。
发表于 2012-11-19 11:07:05 | 显示全部楼层
这个函数在win7下无法从低分辨往高分辨改,xp忘了,好像可以,不知道具体原因何在,一直在查资料
 楼主| 发表于 2012-11-19 11:14:38 | 显示全部楼层
回复 4# netegg


    那你有没有好一点的函数,推荐一下啊,谢谢,我要改变屏幕分辩率,现在就找到这个函数。
发表于 2012-11-19 11:15:59 | 显示全部楼层
回复 3# wkk5678


我家里的台式机是Win7 32位的,回家可以试下。
 楼主| 发表于 2012-11-19 11:22:48 | 显示全部楼层
回复 6# xiehuahere


    好,那先谢谢。
发表于 2012-11-19 19:21:41 | 显示全部楼层
回复 7# wkk5678


刚试验过了,我的Win7 32位操作系统的台式机上执行没问题,分辨率从1366x768成功更改到1600x900。只能分析你的代码了。
 楼主| 发表于 2012-11-20 08:35:47 | 显示全部楼层
回复 8# xiehuahere


    问一下,你的1600X900是你电脑的最大分辨率吗?我的是从低分辨率调到最大分辨率不行。
代码是执行下面这句时,返回值出现问题,再帮我分析一下,谢谢啊!
$B = DllCall("user32.dll", "int", "ChangeDisplaySettings", "ptr", DllStructGetPtr($DEVMODE), "int", $CDS_TEST)
发表于 2012-11-20 09:21:22 | 显示全部楼层
本帖最后由 xiehuahere 于 2012-11-20 09:23 编辑

回复 9# wkk5678

嗯,1600X900就是我电脑的最大分辨率。
你也是在32位机上调试的吗?

猜想可能是字节对齐造成的问题,但int为4字节,按默认对齐系数为8字节来计算,DllStructCreate中的int[10]和int[6]也都是8字节的整数倍,所以又好像不会有这个问题。
关于字节对齐:
http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=3637997
http://wenku.baidu.com/view/0e96cb70f242336c1eb95ec4.html

其实我也不懂,等高人吧,或者等蛋蛋研究出来吧。
 楼主| 发表于 2012-11-20 09:25:12 | 显示全部楼层
回复 10# xiehuahere


   
    是的,我WIN7的64位和32位都试了,Win8也试了,都不行,就是XP可以。
好的,那谢谢你。
发表于 2012-11-20 16:45:08 | 显示全部楼层
进来学习一下。。
发表于 2012-11-29 16:41:04 | 显示全部楼层
用api看看·应该可以的
发表于 2012-11-30 11:41:32 | 显示全部楼层
进来学习一下
发表于 2012-12-3 23:08:01 | 显示全部楼层
测试 : Win7 x64 旗舰版  从 800x600  调整为 1680x1050  正常要作

PS :  忍不住想问下  你们讨论的最大分辨率是指显卡所支持的最大分辨率还是显示器支持的显示分辨率?
        因为很多时候显示器最大分辨率都是小于显卡最大分辨率的  而且色深  刷新率也必须符合
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-11-21 23:52 , Processed in 0.077346 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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