Autoit改变分辨率函数,为什么不能改变到最大分辨率? 比如我的电脑现在最分辨率是1280*800 15
Func_ChangeScreenRes($i_Width=@DesktopWidth,$i_Height=@DesktopHeight,$i_BitsPP=@Deskt...
Func _ChangeScreenRes($i_Width = @DesktopWidth, $i_Height = @DesktopHeight, $i_BitsPP = @DesktopDepth, $i_RefreshRate = @DesktopRefresh)
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 展开
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 展开
2个回答
展开全部
函数注释如下,你可以看下函数返回值@error是多少。
还有,确定你调用函数_ChangeScreenRes(1280,800,32,60)时你的电脑支持1280*800这个分辨率(右键属性看下自己电脑支持的分辨率,也可以设置个小点的试试,如_ChangeScreenRes(1024,768,32,60)看看是否正常)。
还有就是确定你电脑支持的颜色深度及屏幕刷新率。
; 函数名称: _ChangeScreenRes()
; 详细信息: 修改 屏幕分辨率,刷新率.
; 版本: 1.0.0.1
; 参数: $i_Width - 屏幕宽度(如1024X768 中的 1024)
; $i_Height - 屏幕高度(如1024X768 中的 768)
; $i_BitsPP -桌面颜色深度(如 32BIT,32位)
; $i_RefreshRate - 屏幕刷新率(如 75 MHZ).
; 需求 AutoIt 测试版 > 3.1 以上
; 返回值 : 成功,屏幕更新,@ERROR = 0
; 失败,屏幕不更新, @ERROR = 1
还有,确定你调用函数_ChangeScreenRes(1280,800,32,60)时你的电脑支持1280*800这个分辨率(右键属性看下自己电脑支持的分辨率,也可以设置个小点的试试,如_ChangeScreenRes(1024,768,32,60)看看是否正常)。
还有就是确定你电脑支持的颜色深度及屏幕刷新率。
; 函数名称: _ChangeScreenRes()
; 详细信息: 修改 屏幕分辨率,刷新率.
; 版本: 1.0.0.1
; 参数: $i_Width - 屏幕宽度(如1024X768 中的 1024)
; $i_Height - 屏幕高度(如1024X768 中的 768)
; $i_BitsPP -桌面颜色深度(如 32BIT,32位)
; $i_RefreshRate - 屏幕刷新率(如 75 MHZ).
; 需求 AutoIt 测试版 > 3.1 以上
; 返回值 : 成功,屏幕更新,@ERROR = 0
; 失败,屏幕不更新, @ERROR = 1
追问
我试了,其他分辨率都行,就是调最大分辨率不行。并且试了几台电脑都是。
展开全部
电脑分辨率与你的不一样,没法试验。
你所谓的不能设置,是什么现象?分辨率没有改变?
你是如何调用这个函数的?最好把调用部分的代码放上来。
-------------
我是建议你自己先调试一下,在这个函数里异常返回的地方加上msgbox或ConsoleWrite打印,测试看看是从哪个判断分支异常返回了,才好定位错误。
你所谓的不能设置,是什么现象?分辨率没有改变?
你是如何调用这个函数的?最好把调用部分的代码放上来。
-------------
我是建议你自己先调试一下,在这个函数里异常返回的地方加上msgbox或ConsoleWrite打印,测试看看是从哪个判断分支异常返回了,才好定位错误。
更多追问追答
追问
这个电脑分辨率不一样没事,你用你最大的分辨率调用一下
比如我的:
_ChangeScreenRes(1280,800,32,60)
没反应,
调用改变其他分辨率却可以。
追答
我公司的笔记本最大分辨率是1280x800,我跟你用一样的方法,成功了。我是32位操作系统(XP)。你是64位的还是32位的?
如果是Vista或Win7,建议编译成exe后通过右键“以管理员权限运行”再试试,可能是权限不够。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询