不是没百度或GOO过,确实没找到满意的。找到一个WATCHDIR的源码,却只能监控到目录的变动,但找不到变动的是什么文件;
还找到API-GUIDE里的一个例子,同样只能捕捉到目录改变的事件,但无法知道是什么文件改变了,及改变了什么;
找到介绍较多的是(Windows未公开函数揭密--之三),据说用了微软的三个未公开函数的源码,那个倒好,能监控到所有事件,但却只对WINDOW有效;
此源码的主要问题是只能捕捉到WINDOWS目录下的文件变动,其核心代码如下:
 m_pidlDesktop = GetPIDLFromFolderID(0, CSIDL_DESKTOP)
        If m_pidlDesktop Then
      
            ps.pidl = m_pidlDesktop
            ps.bWatchSubFolders = True
      
            '注册Windows监视,将获得的句柄保存到m_hSHNotify中
            m_hSHNotify = SHChangeNotifyRegister(hWnd, SHCNF_TYPE Or SHCNF_IDLIST, _
                                            SHCNE_ALLEVENTS Or SHCNE_INTERRUPT, _
                                            WM_SHNOTIFY, 1, ps)
            SHNotify_Register = CBool(m_hSHNotify)
    
        Else
            Call CoTaskMemFree(m_pidlDesktop)
        End If重要的是: m_pidlDesktop = GetPIDLFromFolderID(0, CSIDL_DESKTOP)只能拿到桌面的PIDL,但一直找不到获得其它目录的PIDL的途径,如果能找到应该也能解决。请大家帮下忙。

解决方案 »

  1.   

    Private Declare Function FindFirstChangeNotification Lib "kernel32.dll" Alias "FindFirstChangeNotificationA" (ByVal lpPathName As String, ByVal bWatchSubtree As Long, ByVal dwNotifyFilter As Long) As Long
    Private Declare Function FindCloseChangeNotification Lib "kernel32.dll" (ByVal hChangeHandle As Long) As Long
    Private Declare Function FindNextChangeNotification Lib "kernel32" (ByVal hChangeHandle As Long) As Long
    Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
    研究这几个API吧
      

  2.   

    VB做目录/文件监控,很难。要对Windows文件系统,消息系统,对Shell Notifications APIs很熟悉。
    http://members.aol.com/btmtz/vb
    http://www.mvps.org/ccrp
      

  3.   

    你可以搜:
    google "VB Folder Watch" or "VB Folder Monitor" or "VB Dir Guard"
      

  4.   

    To zzyong00(阿勇):
    你那几个函数很多代码都有,但是它只能知道目录改变了,而不能知道受影响的文件是什么?To VBAdvisor(Sunlight):
    目录监控的代码已成功,但是暂时不能得到其它目录的PIDL,所以不能用代码来指定要监控的目录,而使用弹出目录框选择目录的方式就能得到PIDL。
    现在是求获得PIDL的代码了。
      

  5.   

    http://www.pudn.com/downloads53/sourcecode/windows/shell/detail183373.html
    文件名称: SHChangeNotifications
      

  6.   

    那代码帮不了我,有没有人写过一个根据目录名称返回PIDL的函数?
      

  7.   

    试试监视wmi的_instanceoperationevent类
      

  8.   

    1.对于Special Folder,比较容易。直接用Call SHGetSpecialFolderLocation(0, CSIDL, lPIDL)。
    2.对于一般Folder,用ILCreateFromPathW。Private Declare Function ILCreateFromPathW Lib "shell32" (ByVal pwszPath As Long) As Long
    #If WIN32_IE >= &H500 Then
    Private Declare Sub ILFree Lib "shell32" (ByVal pidl As Long)
    #Esle
    Private Declare Sub ILFree Lib "shell32" Alias "#155" (ByVal pidl As Long)
    #End IfPrivate Function PathToPIDL(ByVal sPath As String) As Long
      Dim lRet As Long
        
      lRet = ILCreateFromPath(StrPtr(sPath))
      If lRet = 0 Then
        sPath = StrConv(sPath, VBUnicode)
        lRet = ILCreateFromPath(sPath)
      End If
        
      PathToPIDL = lRet
    End Function调用:
    pidl = PathToPIDL(sPath)

    ILFree pidl
    pidl = 0不知我理解对不对。敬请参考。
      

  9.   

    ’忘记了CSIDL:Public Enum CSIDL
        CSIDL_DESKTOP = &H0                            ' <desktop>
        CSIDL_INTERNET = &H1                           ' Internet Explorer (icon on desktop)
        CSIDL_PROGRAMS = &H2                           ' Start Menu\Programs
        CSIDL_CONTROLS = &H3                           ' My Computer\Control Panel
        CSIDL_PRINTERS = &H4                           ' My Computer\Printers
        CSIDL_PERSONAL = &H5                           ' My Documents
        CSIDL_FAVORITES = &H6                          ' <user name>\Favorites
        CSIDL_STARTUP = &H7                            ' Start Menu\Programs\Startup
        CSIDL_RECENT = &H8                             ' <user name>\Recent
        CSIDL_SENDTO = &H9                             ' <user name>\SendTo
        CSIDL_BITBUCKET = &HA                          ' <desktop>\Recycle Bin
        CSIDL_STARTMENU = &HB                          ' <user name>\Start Menu
        CSIDL_MYDOCUMENTS = &HC                        ' logical "My Documents" desktop icon
        CSIDL_MYMUSIC = &HD                            ' "My Music" folder
        CSIDL_MYVIDEO = &HE                            ' "My Videos" folder
        CSIDL_DESKTOPDIRECTORY = &H10                  ' <user name>\Desktop
        CSIDL_DRIVES = &H11                            ' My Computer
        CSIDL_NETWORK = &H12                           ' Network Neighborhood (My Network Places)
        CSIDL_NETHOOD = &H13                           ' <user name>\nethood
        CSIDL_FONTS = &H14                             ' windows\fonts
        CSIDL_TEMPLATES = &H15
        CSIDL_COMMON_STARTMENU = &H16                  ' All Users\Start Menu
        CSIDL_COMMON_PROGRAMS = &H17                   ' All Users\Start Menu\Programs
        CSIDL_COMMON_STARTUP = &H18                    ' All Users\Startup
        CSIDL_COMMON_DESKTOPDIRECTORY = &H19           ' All Users\Desktop
        CSIDL_APPDATA = &H1A                           ' <user name>\Application Data
        CSIDL_PRINTHOOD = &H1B                         ' <user name>\PrintHood
        CSIDL_LOCAL_APPDATA = &H1C                     ' <user name>\Local Settings\Applicaiton Data (non roaming)
        CSIDL_ALTSTARTUP = &H1D                        ' non localized startup
        CSIDL_COMMON_ALTSTARTUP = &H1E                 ' non localized common startup
        CSIDL_COMMON_FAVORITES = &H1F
        CSIDL_INTERNET_CACHE = &H20
        CSIDL_COOKIES = &H21
        CSIDL_HISTORY = &H22
        CSIDL_COMMON_APPDATA = &H23                    ' All Users\Application Data
        CSIDL_WINDOWS = &H24                           ' GetWindowsDirectory()
        CSIDL_SYSTEM = &H25                            ' GetSystemDirectory()
        CSIDL_PROGRAM_FILES = &H26                     ' C:\Program Files
        CSIDL_MYPICTURES = &H27                        ' C:\Program Files\My Pictures
        CSIDL_PROFILE = &H28                           ' USERPROFILE
        CSIDL_SYSTEMX86 = &H29                         ' x86 system directory on RISC
        CSIDL_PROGRAM_FILESX86 = &H2A                  ' x86 C:\Program Files on RISC
        CSIDL_PROGRAM_FILES_COMMON = &H2B              ' C:\Program Files\Common
        CSIDL_PROGRAM_FILES_COMMONX86 = &H2C           ' x86 Program Files\Common on RISC
        CSIDL_COMMON_TEMPLATES = &H2D                  ' All Users\Templates
        CSIDL_COMMON_DOCUMENTS = &H2E                  ' All Users\Documents
        CSIDL_COMMON_ADMINTOOLS = &H2F                 ' All Users\Start Menu\Programs\Administrative Tools
        CSIDL_ADMINTOOLS = &H30                        ' <user name>\Start Menu\Programs\Administrative Tools
        CSIDL_CONNECTIONS = &H31                       ' Network and Dial-up Connections
        CSIDL_COMMON_MUSIC = &H35                      ' All Users\My Music
        CSIDL_COMMON_PICTURES = &H36                   ' All Users\My Pictures
        CSIDL_COMMON_VIDEO = &H37                      ' All Users\My Video
        CSIDL_RESOURCES = &H38                         ' Resource Direcotry
        CSIDL_RESOURCES_LOCALIZED = &H39               ' Localized Resource Direcotry
        CSIDL_COMMON_OEM_LINKS = &H3A                  ' Links to All Users OEM specific apps
        CSIDL_CDBURN_AREA = &H3B                       ' USERPROFILE\Local Settings\Application Data\Microsoft\CD Burning
        CSIDL_COMPUTERSNEARME = &H3D                   ' Computers Near Me (computered from Workgroup membership)
    End EnumPublic Enum CSIDL_FOLDERPATH
        SHGFP_TYPE_CURRENT = &H0                  ' Return the folder's current path.
        SHGFP_TYPE_DEFAULT = &H1                  ' Return the folder's default path.
    End Enum
      

  10.   

    Public Enum CSIDL
    CSIDL_DESKTOP = &H0 ' <desktop>
    CSIDL_INTERNET = &H1 ' Internet Explorer (icon on desktop)
    CSIDL_PROGRAMS = &H2 ' Start Menu\Programs
    CSIDL_CONTROLS = &H3 ' My Computer\Control Panel
    CSIDL_PRINTERS = &H4 ' My Computer\Printers
    CSIDL_PERSONAL = &H5 ' My Documents
    CSIDL_FAVORITES = &H6 ' <user name>\Favorites
    CSIDL_STARTUP = &H7 ' Start Menu\Programs\Startup
    CSIDL_RECENT = &H8 ' <user name>\Recent
    CSIDL_SENDTO = &H9 ' <user name>\SendTo
    CSIDL_BITBUCKET = &HA ' <desktop>\Recycle Bin
    CSIDL_STARTMENU = &HB ' <user name>\Start Menu
    CSIDL_MYDOCUMENTS = &HC ' logical "My Documents" desktop icon
    CSIDL_MYMUSIC = &HD ' "My Music" folder
    CSIDL_MYVIDEO = &HE ' "My Videos" folder
    CSIDL_DESKTOPDIRECTORY = &H10 ' <user name>\Desktop
    CSIDL_DRIVES = &H11 ' My Computer
    CSIDL_NETWORK = &H12 ' Network Neighborhood (My Network Places)
    CSIDL_NETHOOD = &H13 ' <user name>\nethood
    CSIDL_FONTS = &H14 ' windows\fonts
    CSIDL_TEMPLATES = &H15
    CSIDL_COMMON_STARTMENU = &H16 ' All Users\Start Menu
    CSIDL_COMMON_PROGRAMS = &H17 ' All Users\Start Menu\Programs
    CSIDL_COMMON_STARTUP = &H18 ' All Users\Startup
    CSIDL_COMMON_DESKTOPDIRECTORY = &H19 ' All Users\Desktop
    CSIDL_APPDATA = &H1A ' <user name>\Application Data
    CSIDL_PRINTHOOD = &H1B ' <user name>\PrintHood
    CSIDL_LOCAL_APPDATA = &H1C ' <user name>\Local Settings\Applicaiton Data (non roaming)
    CSIDL_ALTSTARTUP = &H1D ' non localized startup
    CSIDL_COMMON_ALTSTARTUP = &H1E ' non localized common startup
    CSIDL_COMMON_FAVORITES = &H1F
    CSIDL_INTERNET_CACHE = &H20
    CSIDL_COOKIES = &H21
    CSIDL_HISTORY = &H22
    CSIDL_COMMON_APPDATA = &H23 ' All Users\Application Data
    CSIDL_WINDOWS = &H24 ' GetWindowsDirectory()
    CSIDL_SYSTEM = &H25 ' GetSystemDirectory()
    CSIDL_PROGRAM_FILES = &H26 ' C:\Program Files
    CSIDL_MYPICTURES = &H27 ' C:\Program Files\My Pictures
    CSIDL_PROFILE = &H28 ' USERPROFILE
    CSIDL_SYSTEMX86 = &H29 ' x86 system directory on RISC
    CSIDL_PROGRAM_FILESX86 = &H2A ' x86 C:\Program Files on RISC
    CSIDL_PROGRAM_FILES_COMMON = &H2B ' C:\Program Files\Common
    CSIDL_PROGRAM_FILES_COMMONX86 = &H2C ' x86 Program Files\Common on RISC
    CSIDL_COMMON_TEMPLATES = &H2D ' All Users\Templates
    CSIDL_COMMON_DOCUMENTS = &H2E ' All Users\Documents
    CSIDL_COMMON_ADMINTOOLS = &H2F ' All Users\Start Menu\Programs\Administrative Tools
    CSIDL_ADMINTOOLS = &H30 ' <user name>\Start Menu\Programs\Administrative Tools
    CSIDL_CONNECTIONS = &H31 ' Network and Dial-up Connections
    CSIDL_COMMON_MUSIC = &H35 ' All Users\My Music
    CSIDL_COMMON_PICTURES = &H36 ' All Users\My Pictures
    CSIDL_COMMON_VIDEO = &H37 ' All Users\My Video
    CSIDL_RESOURCES = &H38 ' Resource Direcotry
    CSIDL_RESOURCES_LOCALIZED = &H39 ' Localized Resource Direcotry
    CSIDL_COMMON_OEM_LINKS = &H3A ' Links to All Users OEM specific apps
    CSIDL_CDBURN_AREA = &H3B ' USERPROFILE\Local Settings\Application Data\Microsoft\CD Burning
    CSIDL_COMPUTERSNEARME = &H3D ' Computers Near Me (computered from Workgroup membership)
    End EnumPublic Enum CSIDL_FOLDERPATH
    SHGFP_TYPE_CURRENT = &H0 ' Return the folder's current path.
    SHGFP_TYPE_DEFAULT = &H1 ' Return the folder's default path.
    End Enum1.对于Special Folder,比较容易。直接用Call SHGetSpecialFolderLocation(0, CSIDL, lPIDL)。
    2.对于一般Folder,用ILCreateFromPathW。Private Declare Function ILCreateFromPathW Lib "shell32" (ByVal pwszPath As Long) As Long
    #If WIN32_IE >= &H500 Then
    Private Declare Sub ILFree Lib "shell32" (ByVal pidl As Long)
    #Esle
    Private Declare Sub ILFree Lib "shell32" Alias "#155" (ByVal pidl As Long)
    #End IfPrivate Function PathToPIDL(ByVal sPath As String) As Long
    Dim lRet As LonglRet = ILCreateFromPath(StrPtr(sPath))
    If lRet = 0 Then
    sPath = StrConv(sPath, VBUnicode)
    lRet = ILCreateFromPath(sPath)
    End IfPathToPIDL = lRet
    End Function调用:
    pidl = PathToPIDL(sPath)

    ILFree pidl
    pidl = 0不知我理解对不对。敬请参考。
      

  11.   

    理解的非常好了 !!!!
    另外这只是做监控一方面
    看来你想在监控上下功夫 给你个做监控图形的好网址: http://www.visual-graph.com