本帖最后由 smooth 于 2022-4-11 11:07 编辑
已按照你的建议进行了修改,问题还是一样。我再看看。
Func _UKEY_Monitor() ;监控U-KEY的插入和拔出
$jn = 0 ;日志
If $iDet_HardID_CS = 0 Then
_FileWriteLog($hLogFile, _StringRepeat("*", 100))
_FileWriteLog($hLogFile, "软件启动,开始检测U-KEY信息......")
$iDet_HardID_CS = 1
Else
_FileWriteLog($hLogFile, _StringRepeat("*", 100))
_FileWriteLog($hLogFile, "设备的硬件配置发生改变,开始检测U-KEY信息......")
EndIf
If StringLen(_Det_HardID()) > 6 Then
_FileWriteLog($hLogFile, "函数_Det_HardID读取设备实例路径(ID)成功!")
If StringLen(_Get_Key()) > 6 Then ;如果能检测到设备实例ID,再进一步检测证书,如果二者都能检测到,则更新控件。
_FileWriteLog($hLogFile, "函数_Get_Key读取U-KEY证书信息成功!")
_FileWriteLog($hLogFile, "开始更新控件数据!")
If _GUICtrlListView_GetItemCount($idListview) = 0 Then
_Key_GuiSetData()
If _GUICtrlListView_GetItemCount($idListview) > 0 Then
_FileWriteLog($hLogFile, "更新控件数据成功!")
EndIf
EndIf
ElseIf StringLen(_Get_Key()) < 6 Then ;能检测到设备实例ID(当然也有可能检测到的是制单和审核U盾的设备实例ID),但无法检测到证书,就需要运行一次证书管理工具以驱动证书信息出现,然后再更新控件。
_FileWriteLog($hLogFile, "函数_Get_Key读取U-KEY证书信息失败,开始刷新证书信息!")
If Not ProcessExists(WinGetProcess(WinGetHandle("浦发银行U-KEY管理工具"))) Then
Local $iRunDBTool = Run($DBTool_SPDB, "", @SW_MINIMIZE)
If @error Then
_FileWriteLog($hLogFile, "刷新证书信息失败,失败类型: " & @error)
Else
_FileWriteLog($hLogFile, "刷新证书信息成功,进程标识符: " & $iRunDBTool)
EndIf
EndIf
WinWait("浦发银行U-KEY管理工具", "", 10)
Do ;这里如果不做循环等待,可能会出现不能关闭窗口进程的情况。
If WinExists("浦发银行U-KEY管理工具") Then
ProcessClose(WinGetProcess(WinGetHandle("浦发银行U-KEY管理工具")))
EndIf
Until Not ProcessExists(WinGetProcess(WinGetHandle("浦发银行U-KEY管理工具")))
Local $i_Get_Key = _Get_Key() ;运行证书管理工具之后,如果此时系统没有硬件发生变动, _Get_Key()不会在执行了,所以还是读取不到证书的信息,所以这里必须再运行一次 _Get_Key()函数。
If $i_Get_Key > 6 Then
_FileWriteLog($hLogFile, "函数 _Get_Key读取U-KEY证书信息成功!")
_FileWriteLog($hLogFile, "开始更新控件数据!")
EndIf
If _GUICtrlListView_GetItemCount($idListview) = 0 Then
_Key_GuiSetData()
If _GUICtrlListView_GetItemCount($idListview) > 0 Then
_FileWriteLog($hLogFile, "更新控件数据成功!")
EndIf
EndIf
EndIf
ElseIf StringLen(_Det_HardID()) < 6 Then
_FileWriteLog($hLogFile, "函数_Det_HardID读取设备实例路径(ID)失败!")
If StringLen(_Get_Key()) < 6 Then ;如果检测不到设备实例ID,也检测不到证书,说明U盾已拔除,并且系统中没有残留证书信息,直接更新控件。
_FileWriteLog($hLogFile, "函数_Get_Key读取U-KEY证书信息失败!")
_FileWriteLog($hLogFile, "开始更新控件数据!")
_NoKey_GuiSetData()
If _GUICtrlListView_GetItemCount($idListview) = 0 Then
_FileWriteLog($hLogFile, "更新控件数据成功!")
EndIf
ElseIf StringLen(_Get_Key()) > 6 Then ;如果不能检测到设备实例ID,但是能检测到证书,说明证书信息残留在系统中,因此需要运行一次证书管理工具,然后再更新控件。
_FileWriteLog($hLogFile, "函数_Get_Key读取U-KEY证书信息成功,开始刷新证书信息!")
If Not ProcessExists(WinGetProcess(WinGetHandle("浦发银行U-KEY管理工具"))) Then
Local $iRunDBTool = Run($DBTool_SPDB, "", @SW_MINIMIZE)
If @error Then
_FileWriteLog($hLogFile, "刷新证书信息失败,失败类型: " & @error)
Else
_FileWriteLog($hLogFile, "刷新证书信息成功,进程标识符: " & $iRunDBTool)
EndIf
EndIf
WinWait("浦发银行U-KEY管理工具", "", 10)
Do ;这里如果不做循环等待,可能会出现不能关闭窗口进程的情况。
If WinExists("浦发银行U-KEY管理工具") Then
ProcessClose(WinGetProcess(WinGetHandle("浦发银行U-KEY管理工具")))
EndIf
Until Not ProcessExists(WinGetProcess(WinGetHandle("浦发银行U-KEY管理工具")))
$i_Get_Key = _Get_Key() ;运行证书管理工具之后,如果此时系统没有硬件发生变动, _Get_Key()不会在执行了,所以还是能读取到残留的证书信息,所以这里必须再运行一次 _Get_Key()函数。
If $i_Get_Key < 6 Then
_FileWriteLog($hLogFile, "函数 _Get_Key读取U-KEY证书信息失败!")
_FileWriteLog($hLogFile, "开始更新控件数据!")
EndIf
_NoKey_GuiSetData()
If _GUICtrlListView_GetItemCount($idListview) = 0 Then
_FileWriteLog($hLogFile, "更新控件数据成功!")
EndIf
EndIf
EndIf
$js_UKEY += 1
ToolTip($js_UKEY, 1200, 300)
Return $GUI_RUNDEFMSG
EndFunc ;==>_U_KEY_Monitor
|