jd19970829 发表于 2011-2-7 16:30:34

能不能等待刷新硬件完成?

本帖最后由 jd19970829 于 2011-2-7 17:30 编辑

SetupApi.au3这个UDF里面的函数
_CM_Restart_Device或者_CM_Scan_Device_Changes
我使用以后发现,当执行了这些函数以后程序会直接继续往下执行,比如说我现在想重启一下网卡或者刷新一下硬件改动,但是我要等待网卡重启完成以后或者硬件刷新完成以后再继续执行以后的代码,可是这2个函数并不会等待重启网卡或者刷新硬件完成就直接往下执行了,请问P版主有没有能够等待硬件刷新完成或者重启完成以后再继续执行以后代码的办法?

pusofalse 发表于 2011-2-7 20:55:49

把你调用_CM_Scan_Device_Changes的代码贴上来。

jd19970829 发表于 2011-2-8 03:56:05

本帖最后由 jd19970829 于 2011-2-8 04:03 编辑

比如说这样一段代码吧
我正在使用的电脑是22寸的显示器硬件ID在设备管理器中显示的是LG991,这时我直接不关机或者不重启更换了另一个显示器,这个显示是一个19寸的,硬件ID在设备管理器中本来应该显示是BEN768,但是在我没有刷新设备管理器的时候,监视器里面的显示器硬件ID仍然是LG991,必须要刷新一次设备管理器,监视器里面的硬件ID才会变成现正正在使用的BEN768,这个我测试过的。(显示器的硬件ID在设备管理器的监视器一栏下面)
我随便写了一段代码。
code:
调用某个函数显示显示器的硬件ID(这时会显示LG991)
_CM_Scan_Device_Changes
再次调用函数显示出显示器的硬件ID(这时仍然是LG991,因为程序执行的很快,还没等到设备管理器刷新完就已经执行到这一步了),然后根据硬件ID调用_ChangeScreenRes(1440, 900, 32, 60)重新设置分辨率为1990*400(原来22寸的分辨率为1680*1050)
end code
我测试过,当我第一次执行这个函数的时候,分辨率不会改变,当我第二次执行这个函数的时候分辨率就会改变了,就是应为在执行这个程序的时候,_CM_Scan_Device_Changes这个函数刷新设备的过程还没有完成,但是程序没有等待刷新完成,而直接向下继续执行了,所以没有改变分辨率,当我第2次调用的时候,上一次的设备已经刷新完成了,所以我再次调用修改分辨率函数的时候就能正确修改到分辨率了。
我可以在调用_CM_Scan_Device_Changes以后sleep(10000),这样相当于暂停一下,等待设备管理器刷新完成,但是这样毕竟治标不治本,希望在函数里直接就有这个功能。

pusofalse 发表于 2011-4-22 21:51:52

现在才看到楼主兄3#的回复,不知解决了吗?

_CM_Scan_Device_Changes这个函数能支持同步、异步刷新的,因为刷新硬件改动很耗时间。
同步就是等所有设备都刷新完了,函数再返回。异步就是函数立刻返回,刷新操作 由系统内核在后台完成。

_CM_Scan_Device_Changes("", $CM_REENUMERATE_SYNCHRONOUS) ; 同步刷新
_CM_Scan_Device_Changes("", $CM_REENUMERATE_ASYNCHRONOUS) ; 异步刷新
页: [1]
查看完整版本: 能不能等待刷新硬件完成?