找回密码
 加入
搜索
查看: 4685|回复: 12

[AU3基础] 【已解决】如何启用与禁用显卡驱动?

  [复制链接]
发表于 2016-8-14 22:31:29 | 显示全部楼层 |阅读模式
本帖最后由 chamlien 于 2016-8-15 23:16 编辑

本人去年入手了一台macbook,装上win10之后屏幕会花屏、闪屏、抖动,禁用显卡后即正常。
百度了花屏的问题,无一能解决的。苹果售后也无法解决,毕竟在苹果系统上正常,找微软,微软说显卡不兼容,建议重装....反正各种折腾之后,问题无法解决,我个人还是选择了禁用显卡。

现在又入手了一台外接显示器,要启用显卡才能连接显示器,然后禁用之后就可以正常使用了。现在不想每次开机都启用禁用一次显卡,所以来论坛求助。

搜索了“显卡”关键字,没有答案,麻烦各位路过解答一下,谢谢!
发表于 2016-8-14 22:38:15 | 显示全部楼层
搜索 P 版 SupetAPI 系列函数,里面有例子根据硬件 ID 等方式禁用功能。
 楼主| 发表于 2016-8-14 23:20:06 | 显示全部楼层
回复 2# nmgwddj


    等级不够,只能标题搜索,能否帮忙提供一下这个函数
发表于 2016-8-15 09:26:36 | 显示全部楼层
回复 3# chamlien


    http://www.autoitx.com/forum.php ... ;highlight=SetupAPI


#include <SetupAPI.au3>
; 禁用鼠标:
Local $hDevs, $tDevInfo, $sDeviceID
$sDeviceID = "HID\VID_046D&PID_C018\6&34023490&F&0000" ; 鼠标设备范例ID。
_SetupDiCreateDeviceDevs($sDeviceID, $hDevs, $tDevInfo)
$fResult = _SetupDiDisableDevice($hDevs, $tDevInfo, True) ; 禁用
If $fResult = True Then
        Msgbox(0, "", "鼠标禁用成功。")
Else
        Msgbox(0, "", "错误码:" & @error)
EndIf
$fResult = _SetupDiDisableDevice($hDevs, $tDevInfo, False) ; 启用。
_SetupDiDestroyDeviceInfoList($hDevs) ; 销毁设备信息集。
; _CM_Disable_DevNode / _CM_Enable_DevNode 同样可以实现对硬件的禁用启用操作。
; 但_CM_Enable_DevNode不能启用设备管理器或_SetupDiDisableDevice禁用过的硬件。
发表于 2016-8-15 11:42:34 | 显示全部楼层
不错,刚好也有这样的需求!
 楼主| 发表于 2016-8-15 14:42:57 | 显示全部楼层
回复 4# nmgwddj


    很感谢,今晚回去测试一下
 楼主| 发表于 2016-8-15 15:31:19 | 显示全部楼层
回复 4# nmgwddj


    刚测试这个代码禁用鼠标不成功,错误代码87,禁用键盘、网卡也是一样无效。百度到devcon命令生效:
C:\Users\Administrator>devcon disable "@HID\VID_09DA&PID_C10A&COL01\6&11DC058A&0&0000"
HID\VID_09DA&PID_C10A&COL01\6&11DC058A&0&0000               : Disabled
1 device(s) disabled.

C:\Users\Administrator>devcon enable "@HID\VID_09DA&PID_C10A&COL01\6&11DC058A&0&0000"
HID\VID_09DA&PID_C10A&COL01\6&11DC058A&0&0000               : Enabled
1 device(s) are enabled.
发表于 2016-8-15 16:07:26 | 显示全部楼层
本帖最后由 nmgwddj 于 2016-8-15 16:08 编辑

回复 7# chamlien


    devcon 同样使用的是 SetupAPI 系列函数。我使用如下代码可以正常禁用所有显示适配器(仅复制 P 版代码稍做修改)。测试环境 Win10 14393.


#Region ;**** 参数创建于 ACNWrapper_GUI ****
#PRE_UseUpx=n
#PRE_UseX64=n
#PRE_Res_requestedExecutionLevel=None
#EndRegion ;**** 参数创建于 ACNWrapper_GUI ****

#include <SetupApi.au3>
; 枚举系统中的所有显示设备:
Local $hDevs, $tDevInfo, $aMouse[1][2] = [[0]]
$hDevs = _SetupDiGetClassDevs($DIGCF_PRESENT, "Display")
While _SetupDiEnumDeviceInfo($hDevs, $aMouse[0][0], $tDevInfo)
        $aMouse[0][0] += 1
        $sDescr = _SetupDiGetDeviceRegistryProperty($hDevs, $tDevInfo, $SPDRP_DEVICEDESC)
        $sName = _SetupDiGetDeviceRegistryProperty($hDevs, $tDevInfo, $SPDRP_FRIENDLYNAME)
        If $sName <> "" Then $sDescr = $sName
        Redim $aMouse[$aMouse[0][0] + 1][2]
        $aMouse[$aMouse[0][0]][0] = $sDescr        ; 显示设备描述信息
        $aMouse[$aMouse[0][0]][1] = _SetupDiGetDeviceInstanceID($hDevs, $tDevInfo) ; 设备范例ID
        Dislabe(_SetupDiGetDeviceInstanceID($hDevs, $tDevInfo))        ; 禁用所有显示设备
WEnd
; 枚举网卡只需把"Mouse"改为"Net",磁盘则对应DiskDrive,显卡对应Display。
_SetupDiDestroyDeviceInfoList($hDevs)
_Arraydisplay($aMouse)

Func Dislabe($sDeviceID)
        Local $hDevs, $tDevInfo
        _SetupDiCreateDeviceDevs($sDeviceID, $hDevs, $tDevInfo)
        $fResult = _SetupDiDisableDevice($hDevs, $tDevInfo, True) ; 禁用
        If $fResult = True Then
                        Msgbox(0, "", "显示适配器禁用成功。")
        Else
                        Msgbox(0, "", "错误码:" & @error)
        EndIf
        $fResult = _SetupDiDisableDevice($hDevs, $tDevInfo, False) ; 启用。
        _SetupDiDestroyDeviceInfoList($hDevs) ; 销毁设备信息集。
        ; _CM_Disable_DevNode / _CM_Enable_DevNode 同样可以实现对硬件的禁用启用操作。
        ; 但_CM_Enable_DevNode不能启用设备管理器或_SetupDiDisableDevice禁用过的硬件。
EndFunc
 楼主| 发表于 2016-8-15 17:31:54 | 显示全部楼层
本帖最后由 chamlien 于 2016-8-15 18:37 编辑

回复 8# nmgwddj


    嗯,上面那段代码测试成功了!然后为啥下面这段代码不可以呢

#include <SetupAPI.au3>
; 禁用鼠标:
Local $hDevs, $tDevInfo, $sDeviceID
$sDeviceID = "HID\VID_09DA&PID_C10A&COL01\6&11DC058A&0&0000" ; 鼠标设备范例ID。
_SetupDiCreateDeviceDevs($sDeviceID, $hDevs, $tDevInfo)
$fResult = _SetupDiDisableDevice($hDevs, $tDevInfo, True) ; 禁用
If $fResult = True Then
        Msgbox(0, "", "鼠标禁用成功。")
Else
        Msgbox(0, "", "错误码:" & @error)
EndIf
$fResult = _SetupDiDisableDevice($hDevs, $tDevInfo, False) ; 启用。
_SetupDiDestroyDeviceInfoList($hDevs) ; 销毁设备信息集。
; _CM_Disable_DevNode / _CM_Enable_DevNode 同样可以实现对硬件的禁用启用操作。
; 但_CM_Enable_DevNode不能启用设备管理器或_SetupDiDisableDevice禁用过的硬件。
发表于 2016-8-15 22:23:35 | 显示全部楼层
回复 9# chamlien


    这个不用我回答了吧,自己一行一行的调试一下,我觉得这是进步的很好的途径,加油。

   

评分

参与人数 1金钱 +13 收起 理由
chamlien + 13 赞同

查看全部评分

发表于 2016-8-15 23:03:10 | 显示全部楼层
不错的,学习下
 楼主| 发表于 2016-8-15 23:15:26 | 显示全部楼层
回复 10# nmgwddj


    哈哈,有时脑子转不过来,现在知道咋回事了。9楼的代码加上以下两行就可以了
#PRE_UseX64=n
#RequireAdmin 
回到家里测试发现自己电脑上也不行的时候才发现64位不行,且要管理权限。另外,8楼的代码跟9楼的代码实际上是一致的,只是8楼的加了遍历设备,然而我却忽略最上面的#PRE_UseX64=n

感谢感谢!
发表于 2016-8-18 09:07:51 | 显示全部楼层
有些BIOS里能禁用
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-12-22 20:48 , Processed in 0.081969 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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