打印本文 打印本文 关闭窗口 关闭窗口
Windows未公开函数揭密——之三
作者:武汉SEO闵涛  文章来源:敏韬网  点击数2528  更新时间:2009/4/23 18:58:55  文章录入:mintao  责任编辑:mintao
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] 

打印本文 打印本文 关闭窗口 关闭窗口