chamlien 发表于 2016-8-14 22:31:29

【已解决】如何启用与禁用显卡驱动?

本帖最后由 chamlien 于 2016-8-15 23:16 编辑

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

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

搜索了“显卡”关键字,没有答案,麻烦各位路过解答一下,谢谢!

nmgwddj 发表于 2016-8-14 22:38:15

搜索 P 版 SupetAPI 系列函数,里面有例子根据硬件 ID 等方式禁用功能。

chamlien 发表于 2016-8-14 23:20:06

回复 2# nmgwddj


    等级不够,只能标题搜索,能否帮忙提供一下这个函数

nmgwddj 发表于 2016-8-15 09:26:36

回复 3# chamlien


    http://www.autoitx.com/forum.php?mod=viewthread&tid=10543&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禁用过的硬件。

ysping 发表于 2016-8-15 11:42:34

不错,刚好也有这样的需求!

chamlien 发表于 2016-8-15 14:42:57

回复 4# nmgwddj


    很感谢,今晚回去测试一下

chamlien 发表于 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.

nmgwddj 发表于 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 = []
$hDevs = _SetupDiGetClassDevs($DIGCF_PRESENT, "Display")
While _SetupDiEnumDeviceInfo($hDevs, $aMouse, $tDevInfo)
      $aMouse += 1
      $sDescr = _SetupDiGetDeviceRegistryProperty($hDevs, $tDevInfo, $SPDRP_DEVICEDESC)
      $sName = _SetupDiGetDeviceRegistryProperty($hDevs, $tDevInfo, $SPDRP_FRIENDLYNAME)
      If $sName <> "" Then $sDescr = $sName
      Redim $aMouse[$aMouse + 1]
      $aMouse[$aMouse] = $sDescr      ; 显示设备描述信息
      $aMouse[$aMouse] = _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

chamlien 发表于 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禁用过的硬件。

nmgwddj 发表于 2016-8-15 22:23:35

回复 9# chamlien


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

    {:face (332):}

ddrs 发表于 2016-8-15 23:03:10

不错的,学习下

chamlien 发表于 2016-8-15 23:15:26

回复 10# nmgwddj


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

感谢感谢!

Wh1t3 发表于 2016-8-18 09:07:51

有些BIOS里能禁用
页: [1]
查看完整版本: 【已解决】如何启用与禁用显卡驱动?