找回密码
 加入
搜索
楼主: smooth

[网络通信] [已解决]用DllCallbackRegister注册的回调函数关闭脚本时会卡死无法正常退出

[复制链接]
发表于 2022-2-6 10:52:06 | 显示全部楼层
之前 afan版主已经给你了答案,你却不认真对待。还要自创方法。
发表于 2022-2-6 13:54:47 | 显示全部楼层
haijie1223 发表于 2022-2-6 10:46
在windows下不利用windows的规则,别出心裁的玩法。。。

是啊,花式玩法的代价往往更高~
发表于 2022-2-6 14:09:55 | 显示全部楼层
smooth 发表于 2022-2-6 10:47
系统消息的实现机制,我感觉也是循环检测吧,不循环它怎么知道什么时候发生硬件改变?

另外,系统消息 ...

系统的事就不用操心了,不管你用不用,这些消息一定是伴随整个系统进程的。
有硬件变化的消息难道还不够用?你要具体到某一硬件不应该是你自己检测判断吗?就如你用的_DetectHardID
。。。
 楼主| 发表于 2022-2-6 17:18:43 | 显示全部楼层
afan 发表于 2022-2-6 14:09
系统的事就不用操心了,不管你用不用,这些消息一定是伴随整个系统进程的。
有硬件变化的消息难道还不够 ...

我现在就是要用_DetectHardID来检测一个具体的U盾是否插入电脑,然后在界面上显示:插入,如果被拔出就显示:拔出。不循环咋检测呢,没明白你说的怎么搞。
发表于 2022-2-6 18:21:36 | 显示全部楼层
不知道以后还会不会帮人撸代码
#include <SetupApi.au3>
Opt("GuionEventMode", 1)
Opt("WinTitleMatchMode", 2)
Local $hGUI = GUICreate("", 300, 300)
GUICtrlCreateLabel("U-KEY状态:", 30, 160, 66, 18)
Local $U_KEY_stateLabel = GUICtrlCreateLabel("", 96, 160, 60, 18)
GUICtrlCreateLabel("网银状态:", 30, 200, 60, 18)
Local $WY_stateLabel = GUICtrlCreateLabel("", 90, 200, 60, 18)
GUISetState()
GUISetOnEvent(-3, "_Exit")
GUIRegisterMsg(0x0219, 'Monitor')
Monitor(0, 0, 0, 0)
While 1
        Sleep(20)
        Local $sLbData = '未登录'
        If WinExists("浦发银行网银客户端") Then
                $sLbData = "客户端版"
        ElseIf StringInStr(WinGetTitle("上海浦东发展银行公司网上银行"), "Internet Explorer") Then
                $sLbData = "网页版(IE)"
        ElseIf StringInStr(WinGetTitle("上海浦东发展银行公司网上银行"), "用户配置") Then
                $sLbData = "网页版(Edge)"
        EndIf
        If GUICtrlRead($WY_stateLabel) <> $sLbData Then GUICtrlSetData($WY_stateLabel, $sLbData)
WEnd
Func Monitor($hWnd, $uMsg, $wParam, $lParam)        
        If StringLen(_DetectHardID()) > 4 Then
                GUICtrlSetData($U_KEY_stateLabel, "已插入")
        Else
                GUICtrlSetData($U_KEY_stateLabel, "未插入")
        EndIf
        Return True
EndFunc   ;==>Monitor
Func _DetectHardID();检测U-KEY设备实例ID
        Local $hDevs, $tDevInfo, $aMouse[1][2] = [[0]]
        $hDevs = _SetupDiGetClassDevs($DIGCF_PRESENT, "CDROM");DiskDrive
        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
        WEnd
        ; 枚举网卡只需把"DiskDrive"改为"Net",鼠标则对应Mouse,光驱则为CDROM,显卡对应Display。
        _SetupDiDestroyDeviceInfoList($hDevs)
        Local $dFindDevs = ""
        For $i = 1 To $aMouse[0][0]
                If StringInStr($aMouse[$i][1], "USBSTOR\CDROM&VEN_TENDYRON&PROD_U-DISK&REV_1.10") Then;
                        $dFindDevs = $aMouse[$i][1]
                        ExitLoop
                EndIf
        Next
        Return $dFindDevs;把变量值返回给函数_DetectHardID()
EndFunc   ;==>_DetectHardID
Func _Exit()
        Exit
EndFunc   ;==>_Exit

 楼主| 发表于 2022-2-6 18:46:37 | 显示全部楼层
本帖最后由 smooth 于 2022-2-6 19:01 编辑
haijie1223 发表于 2022-2-6 18:21
不知道以后还会不会帮人撸代码

注册WINDOWS消息,当消息出现时,再去检测是不是目标U盘插入,真是高,我咋就没能想到,谢谢!

另外请教,你发的代码,怎么弄出这种效果的?不是中括号里放“AU3”么?我的怎么没这效果。
发表于 2022-2-7 11:53:12 | 显示全部楼层
本帖最后由 chzj589 于 2022-2-7 12:00 编辑
smooth 发表于 2022-2-6 18:46
注册WINDOWS消息,当消息出现时,再去检测是不是目标U盘插入,真是高,我咋就没能想到,谢谢!

另外请 ...

https://www.autoitx.com/thread-72836-1-1.html帖子,就告诉你用注册WINDOWS消息,
因我没有U-KEY,无法测试。
N年前我用U盘量产了U盘-CDROM为系统维护盘测试就可行。

Func _USB_Message($hWnd, $Msg, $wParam, $lParam)
        Switch $wParam
                Case 0x8000;设备插入
                        Local $_DEV_BROADCAST_HDR = DllStructCreate("int dbch_size; int dbch_devicetype; int dbch_reserved;", $lParam)
                        If DllStructGetData($_DEV_BROADCAST_HDR, "dbch_devicetype") = 2 Then
                               _DetectHardID();判断U-KEY 
                                GUICtrlSetData($uLabel, "U盘已插入")
                                GUICtrlSetColor($uLabel, 0x990000)
                                GUICtrlSetFont(-1, 12, 600, 0, 'Arial') 
                      EndIf
                Case 0x8004;设备移除
                        GUICtrlSetData($uLabel, "U盘已拔出")
                        GUICtrlSetColor($uLabel, 0x0000FF)
                        GUICtrlSetFont(-1, 12, 400, 0, 'Arial')
        EndSwitch
EndFunc   ;==>_USB_Message



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
 楼主| 发表于 2022-2-7 19:58:19 | 显示全部楼层
chzj589 发表于 2022-2-7 11:53
在https://www.autoitx.com/thread-72836-1-1.html帖子,就告诉你用注册WINDOWS消息,
因我没有U-KEY, ...

我之前看了你的代码了,你的代码只是检测U盘的插入和拔出。我没想到能和检测设备实例ID的代码一起使用,实现实时检测。

 楼主| 发表于 2022-2-7 19:59:35 | 显示全部楼层
chzj589 发表于 2022-2-7 11:53
在https://www.autoitx.com/thread-72836-1-1.html帖子,就告诉你用注册WINDOWS消息,
因我没有U-KEY, ...

我现在遇到一个问题,就是浦发银行的U-KEY的设备实例ID,在不同的电脑里是不一样的,所以无法作为识别的依据。
发表于 2022-2-7 21:20:55 | 显示全部楼层
smooth 发表于 2022-2-7 19:59
我现在遇到一个问题,就是浦发银行的U-KEY的设备实例ID,在不同的电脑里是不一样的,所以无法作为识别的 ...

没有浦发银行的U-KEY无法测试。
用我的U盘在不同的电脑测试,ID是一样的
 楼主| 发表于 2022-2-7 21:38:23 | 显示全部楼层
chzj589 发表于 2022-2-7 21:20
没有浦发银行的U-KEY无法测试。
用我的U盘在不同的电脑测试,ID是一样的

我用U盘、移动硬盘测试,ID在不同的电脑上,都是一样的,但是浦发的U盾,在不同的电脑上,竟然是不一样的,真是无语。
 楼主| 发表于 2022-2-8 08:41:02 | 显示全部楼层
chzj589 发表于 2022-2-7 21:20
没有浦发银行的U-KEY无法测试。
用我的U盘在不同的电脑测试,ID是一样的

台式机上:USBSTOR\CDROM&VEN_TENDYRON&PROD_U-DISK&REV_1.10\6&4DB548E&0
笔记本上:USBSTOR\CDROM&VEN_TENDYRON&PROD_U-DISK&REV_1.10\6&2F145233&0
连长度都不一样,不知道用什么来识别它了。
发表于 2022-2-8 09:46:23 | 显示全部楼层
smooth 发表于 2022-2-8 08:41
台式机上:USBSTOR\CDROM&VEN_TENDYRON&PROD_U-DISK&REV_1.10\6&4DB548E&0
笔记本上:USBSTOR\CDROM&VEN ...

我应该与你说过,有一个另外银行的U-KEY,无法读取ID。插入后没一点信息。
这就是U-KEY量产制作原因,提高U-KEY保密级别。
台式机上:USBSTOR\CDROM&VEN_TENDYRON&PROD_U-DISK&REV_1.10\6&4DB548E&0
笔记本上:USBSTOR\CDROM&VEN_TENDYRON&PROD_U-DISK&REV_1.10\6&2F145233&0&4DB548E&0
你可以提取来识别
USBSTOR\CDROM&VEN_TENDYRON&PROD_U-DISK&REV_1.10\6
 楼主| 发表于 2022-2-8 11:29:10 | 显示全部楼层
chzj589 发表于 2022-2-8 09:46
我应该与你说过,有一个另外银行的U-KEY,无法读取ID。插入后没一点信息。
这就是U-KEY量产制作原因, ...

我已经考虑过了,并且也是这么做的,但是还是出现问题:
我家里的笔记本上,最后一个“\”的后面,竟然是7开头,也即:
USBSTOR\CDROM&VEN_TENDYRON&PROD_U-DISK&REV_1.10\7
然后我就判断:USBSTOR\CDROM&VEN_TENDYRON&PROD_U-DISK&REV_1.10\,又出了问题,
这段竟然和交通银行的U盾是一样的,要命。
 楼主| 发表于 2022-2-8 11:59:35 | 显示全部楼层
chzj589 发表于 2022-2-8 09:46
我应该与你说过,有一个另外银行的U-KEY,无法读取ID。插入后没一点信息。
这就是U-KEY量产制作原因, ...

你看图片。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-5-3 14:57 , Processed in 0.071736 second(s), 14 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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