styledream 发表于 2010-7-6 13:43:19

【已解决】动态获取移动设备盘符问题

本帖最后由 styledream 于 2010-7-6 16:01 编辑

以下是获取当前已接入的移动设备的代码,如何让程序正确获取盘符后暂时挂起
并且当多接入一个或几个优盘时自动把盘符更新到下拉列表框中,从而实现动态获取
具体解决方法可参考 9# xsjtxy 的代码,已完美解决此问题,再次感谢~~~#include <GuiConstants.au3>

$gui=GUICreate("获取移动设备",200,200,-1,-1)
Local $DriverLabel = GUICtrlCreateLabel("请选择盘符:", 20, 55)
$DriverCombo = GUICtrlCreateCombo("", 100, 55, 70, 15)
GUISetState()
AdlibRegister("GetRemoveDriver", 2000)

While 1
        $eMSG = GUIGetMsg()
        Switch $eMSG
                Case $GUI_EVENT_CLOSE
                        Exit
        EndSwitch
WEnd


Func GetRemoveDriver()
        $ver = DriveGetDrive("REMOVABLE")
       
        If Not @error Then ;搜索到移动设备
                For $i = 1 To $ver
                        $Driver = StringUpper(StringLeft($ver[$i], 1))
                        ;将获取的盘符转换成大写并写入到下列控件中
                        GUICtrlSetData($DriverCombo, $Driver, StringUpper(StringLeft($ver, 1)))
                Next
        Else
                GUICtrlSetData($DriverCombo, "None","None")
        EndIf
EndFunc   ;==>GetRemoveDriver

水木子 发表于 2010-7-6 13:48:51

AdlibUnRegister('GetRemoveDriver')#include <GuiConstants.au3>

$gui = GUICreate("获取移动设备", 200, 200, -1, -1)
Local $DriverLabel = GUICtrlCreateLabel("请选择盘符:", 20, 55)
$DriverCombo = GUICtrlCreateCombo("", 100, 55, 70, 15)
GUISetState()
AdlibRegister("GetRemoveDriver", 2000)

While 1
        $eMSG = GUIGetMsg()
        Switch $eMSG
                Case $GUI_EVENT_CLOSE
                        Exit
        EndSwitch
WEnd


Func GetRemoveDriver()
        $ver = DriveGetDrive("REMOVABLE")
        If Not @error Then ;搜索到移动设备
                For $i = 1 To $ver
                        $Driver = StringUpper(StringLeft($ver[$i], 1))
                        ;将获取的盘符转换成大写并写入到下列控件中
                        GUICtrlSetData($DriverCombo, $Driver, StringUpper(StringLeft($ver, 1)))
                        AdlibUnRegister('GetRemoveDriver')
                Next
        Else
                GUICtrlSetData($DriverCombo, "None", "None")
        EndIf
EndFunc   ;==>GetRemoveDriver

styledream 发表于 2010-7-6 13:59:19

回复 2# 水木子

谢谢 水木子大大 的回复
可能是我的问题没表达清楚,我想在多接入一个U盘时,程序还能自动判断并把盘符更新到下拉列表框中

水木子 发表于 2010-7-6 14:03:56

如果要达到这个效果,那么前面的 AdlibRegister("GetRemoveDriver", 2000) 就不能退出吧!

styledream 发表于 2010-7-6 14:05:39

回复 4# 水木子

嗯,已经把问题更新了,这下应该是表述清楚问题了

水木子 发表于 2010-7-6 14:12:14

“暂时挂起”挂起是多久呢?挂起以后又怎么唤醒呢?

挂起以后有新的设备接入又怎么知道呢?这些都是问题吧!

除非让设备接入时通知程序,程序再做出响应。(不过我不会)

styledream 发表于 2010-7-6 14:44:37

回复 6# 水木子

嗯,想要让设备接入时通知程序,这的确是个让人头痛的问题

styledream 发表于 2010-7-6 14:49:03

回复 6# 水木子

其实不让程序挂起而让它一直判断当前的所有移动设备并更新到下拉列表中也行
只是当我选择了下拉列表中的非最后一个选项时,它定时自动更新后又会把最后一个选项的值赋给下拉列表框了

xsjtxy 发表于 2010-7-6 14:49:56

本帖最后由 xsjtxy 于 2010-7-6 15:39 编辑

;;;;;如果检测到移动设备有增加或者减少,或盘符变更。则重新获取并写入到列表

#include <Array.au3>
#include <GuiConstants.au3>
#include <ComboConstants.au3>
$gui=GUICreate("获取移动设备",200,200,-1,-1)
Local $DriverLabel = GUICtrlCreateLabel("请选择盘符:", 20, 55)
$DriverCombo = GUICtrlCreateCombo("", 100, 55, 70, 15,$CBS_DROPDOWNLIST)
GUISetState()
Dim $ver1
$ver1 = 0
Opt("GUIOnEventMode", 1)
GUISetOnEvent($GUI_EVENT_CLOSE, "exitl")


While 1
GetRemoveDriver()
sleep(1000)
WEnd

Func GetRemoveDriver()
      $ver = DriveGetDrive("REMOVABLE")
      If Not @error Then ;搜索到移动设备
if _ArrayMax($ver) <> _ArrayMax($ver1) then
GUICtrlSetData($DriverCombo, "")
                For $i = 1 To $ver
                        $Driver = StringUpper(StringLeft($ver[$i], 1))
                        ;将获取的盘符转换成大写并写入到下列控件中
                        GUICtrlSetData($DriverCombo, $Driver, $Driver)
                sleep(10)
                Next
$ver1 = $ver
endif
      Else
                GUICtrlSetData($DriverCombo, "")
                GUICtrlSetData($DriverCombo, "None","None")
      EndIf

EndFunc   ;==>GetRemoveDriver

Func exitl()
exit
EndFunc

水木子 发表于 2010-7-6 14:59:30

回复 8# styledream
哦!这还不简单,判读当前获取到的内容和之前的内容是否一样不就可以啦!

3mile 发表于 2010-7-6 15:14:36

只增加了19,20,21这三行。未测试#include <GuiConstants.au3>
Local $alldrive=
$gui = GUICreate("获取移动设备", 200, 200, -1, -1)
Local $DriverLabel = GUICtrlCreateLabel("请选择盘符:", 20, 55)
$DriverCombo = GUICtrlCreateCombo("", 100, 55, 70, 15)
GUISetState()
AdlibRegister("GetRemoveDriver", 2000)

While 1
      $eMSG = GUIGetMsg()
      Switch $eMSG
                Case $GUI_EVENT_CLOSE
                        Exit
      EndSwitch
WEnd


Func GetRemoveDriver()
        $alldrive=DriveGetDrive("all")
        If $alldrive<>$alldrive Then
                $alldrive=$alldrive
      $ver = DriveGetDrive("REMOVABLE")
      If Not @error Then ;搜索到移动设备
                For $i = 1 To $ver
                        $Driver = StringUpper(StringLeft($ver[$i], 1))
                        ;将获取的盘符转换成大写并写入到下列控件中
                        GUICtrlSetData($DriverCombo, $Driver, StringUpper(StringLeft($ver, 1)))
                        ;AdlibUnRegister('GetRemoveDriver')
                Next
      Else
                GUICtrlSetData($DriverCombo, "None", "None")
                EndIf
        EndIf
EndFunc   ;==>GetRemoveDriver

3mile 发表于 2010-7-6 15:45:05

水木兄,见笑了。

styledream 发表于 2010-7-6 15:51:03

回复 11# 3mile

当接入多个优盘时,它总会把最后接入的盘符作为下拉列表框的当前默认值
9# xsjtxy 的代码已完美解决此问题

styledream 发表于 2010-7-6 15:53:07

回复 10# 水木子

嗯,我是想到了这种办法,只是做不出来,哈哈,我的技术还有待提高
9# xsjtxy 的代码已完美解决我提出的问题
页: [1]
查看完整版本: 【已解决】动态获取移动设备盘符问题