ction SHNotify_GetEventStr(strPath1, strPath2 As String, dwEventID As Long) As String Dim sEvent As String Select Case dwEventID Case SHCNE_RENAMEITEM: sEvent = "重命名文件" + strPath1 + "为" + strPath2 Case SHCNE_CREATE: sEvent = "建立文件 文件名:" + strPath1 Case SHCNE_DELETE: sEvent = "删除文件 文件名:" + strPath1 Case SHCNE_MKDIR: sEvent = "新建目录 目录名:" + strPath1 Case SHCNE_RMDIR: sEvent = "删除目录 目录名:" + strPath1 Case SHCNE_MEDIAINSERTED: sEvent = strPath1 + "中插入可移动存储介质" Case SHCNE_MEDIAREMOVED: sEvent = strPath1 + "中移去可移动存储介质" Case SHCNE_DRIVEREMOVED: sEvent = "移去驱动器" + strPath1 Case SHCNE_DRIVEADD: sEvent = "添加驱动器" + strPath1 Case SHCNE_NETSHARE: sEvent = "改变目录" + strPath1 + "的共享属性" Case SHCNE_UPDATEDIR: sEvent = "更新目录" + strPath1 Case SHCNE_UPDATEITEM: sEvent = "更新文件 文件名:" + strPath1 Case SHCNE_SERVERDISCONNECT: sEvent = "断开与服务器的连" + strPath1 + " " + strPath2 Case SHCNE_UPDATEIMAGE: sEvent = "SHCNE_UPDATEIMAGE" Case SHCNE_DRIVEADDGUI: sEvent = "SHCNE_DRIVEADDGUI" Case SHCNE_RENAMEFOLDER: sEvent = "重命名文件夹" + strPath1 + "为" + strPath2 Case SHCNE_FREESPACE: sEvent = "磁盘空间大小改变" Case SHCNE_ASSOCCHANGED: sEvent = "改变文件关联" End Select SHNotify_GetEventStr = sEvent End Function
在mSub.Bas中加入以下代码: ''''mSub函数包括窗口的消息处理函数 Option Explicit
Private Const WM_NCDESTROY = &H82 Private Const GWL_WNDPROC = (-4) Private Const OLDWNDPROC = "OldWndProc"
Private Declare Function GetProp Lib "user32" Alias "GetPropA" (ByVal _ hWnd As Long, ByVal lpString As String) As Long Private Declare Function SetProp Lib "user32" Alias "SetPropA" (ByVal _ hWnd As Long, ByVal lpString As String, ByVal hData As Long) As Long Private Declare Function RemoveProp Lib "user32" Alias "RemovePropA" (ByVal _ hWnd As Long, ByVal lpString As String) As Long
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _ (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" _ (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal uMsg As Long, _ ByVal wParam As Long, ByVal lParam As Long) As Long
Public Function SubClass(hWnd As Long) As Boolean Dim lpfnOld As Long Dim fSuccess As Boolean If (GetProp(hWnd, OLDWNDPROC) = 0) Then lpfnOld = SetWindowLong(hWnd, GWL_WNDPROC, AddressOf WndProc) If lpfnOld Then fSuccess = SetProp(hWnd, OLDWNDPROC, lpfnOld) End If End If If fSuccess Then SubClass = True Else If lpfnOld Then Call UnSubClass(hWnd) MsgBox "Unable to successfully subclass &H" & Hex(hWnd), vbCritical End If End Function
Public Function UnSubClass(hWnd As Long) As Boolean Dim lpfnOld As Long lpfnOld = GetProp(hWnd, OLDWNDPROC) If lpfnOld Then If RemoveProp(hWnd, OLDWNDPROC) Then UnSubClass = SetWindowLong(hWnd, GWL_WNDPROC, lpfnOld) End If End If End Function
Public Function WndProc(ByVal hWnd As Long, ByVal uMsg As Long, ByVal wParam As _ Long, ByVal lParam As Long) As Long Select Case uMsg Case WM_SHNOTIFY ''''处理系统消息通告函数 Call Form1.NotificationReceipt(wParam, lParam) Case WM_NCDESTROY Call UnSubClass(hWnd) MsgBox "Unubclassed &H" & Hex(hWnd), vbCritical, "WndProc Error" End Select WndProc = CallWindowProc(GetProp(hWnd, OLDWNDPROC), hWnd, uMsg, wParam, lParam) End Function
保存文件,然后运行程序,然后你可以在Explore中试着建立或者删除一个文件或者文件夹,在Form中可以看到你所做的操作已经被纪录并且显示到TextBox中了。 现在分析以下上面的程序,上面的程序首先调用SHChangeNotifyRegister函数将Form添加到系统消息通告链中,并利用SetWindowLong函数改变Form的缺省的消息处理函数,当接受到系统通告消息后,根据传递的参数获得系统通告的内容并且显示在文本窗口中。退出程序时调用SHChangeNotifyDeregister函数注销系统消息通告。
上一页 [1] [2] [3] |