能监视指定文件夹的变化,一旦有个文件变化就能返回是那个进程造成的这个变化,请问这个API是什么?(ReadDirectoryChangesW好像不能返回是那个进程造成的文件变化哦)如果没有这个API,哪我是不是可以用个钩子截取相应消息来得到进程,哪请问这些消息有哪些?我是新手,思维有点混乱,请高手指导下,谢谢!

解决方案 »

  1.   

    偶的文章:http://dev.csdn.net/develop/article/29/29184.shtm
      

  2.   

    Windows内部有两个未公开的函数(注:在最新的MSDN中,已经公开了这两个函数),分别叫做SHChangeNotifyRegister和SHChangeNotifyDeregister,可以实现以上的功能。这两个函数位于Shell32.dll中,是用序号方式导出的。这就是为什么我们用VC自带的Depends工具察看Shell32.dll时,找不到这两个函数的原因。SHChangeNotifyRegister的导出序号是2;而SHChangeNotifyDeregister的导出序号是4。
    SHChangeNotifyRegister可以把指定的窗口添加到系统的消息监视链中,这样窗口就能接收到来自文件系统或者Shell的通知了。而对应的另一个函数,SHChangeNotifyDeregister,则用来取消监视钩挂。SHChangeNotifyRegister的原型和相关参数如下:
    ULONG SHChangeNotifyRegister
    (          
    HWND  hwnd,
        int   fSources,
        LONG  fEvents,
        UINT    wMsg,
        Int  cEntries,
        SHChangeNotifyEntry *pfsne
    );
    其中:
    hwnd
    将要接收改变或通知消息的窗口的句柄。
    fSource
    指示接收消息的事件类型,将是下列值的一个或多个(注:这些标志没有被包括在任何头文件中,使用者须在自己的程序中加以定义或者直接使用其对应的数值)
    SHCNRF_InterruptLevel
    0x0001。接收来自文件系统的中断级别通知消息。
    SHCNRF_ShellLevel
    0x0002。接收来自Shell的Shell级别通知消息。 
    SHCNRF_RecursiveInterrupt
    0x1000。接收目录下所有子目录的中断事件。此标志必须和SHCNRF_InterruptLevel 标志合在一起使用。当使用该标志时,必须同时设置对应的SHChangeNotifyEntry结构体中的fRecursive成员为TRUE(此结构体由函数的最后一个参数pfsne指向),这样通知消息在目录树上是递归的。
    SHCNRF_NewDelivery
    0x8000。接收到的消息使用共享内存。必须先调用SHChangeNotification_Lock,然后才能存取实际的数据,完成后调用SHChangeNotification_Unlock函数释放内存。
    fEvents
    要捕捉的事件,其所有可能的值请参见MSDN中关于SHChangeNotify函数的注解。
    wMsg
    产生对应的事件后,发往窗口的消息。
    cEntries
    pfsne指向的数组的成员的个数。
    pfsne
    SHChangeNotifyEntry结构体数组的起始指针。此结构体承载通知消息,其成员个数必须设置成1,否则SHChangeNotifyRegister或者SHChangeNotifyDeregister将不能正常工作(但是据我试验,如果cEntries设为大于1的值,依然可以注册成功,不知何故)。
    如果函数调用成功,则返回一个整型注册标志号,否则将返回0。同时系统就会将hwnd指定的窗口加入到操作监视链中,当有文件操作发生时,系统会向hwnd标识的窗口发送wMsg指定的消息,我们只要在程序中加入对该消息的处理函数就可以实现对系统操作的监视了。
    如果要退出程序监视,就要调用另外一个未公开得函数SHChangeNotifyDeregister来取消程序监视。该函数的原型如下:
    BOOL SHChangeNotifyDeregister(ULONG ulID);
    其中ulID指定了要注销的监视注册标志号,如果卸载成功,返回TRUE,否则返回FALSE。
      

  3.   

    开线程的时候可以获得线程handle
      

  4.   

    但不知道这些函数和ReadDirectoryChangedW有什么区别?