zoukankan      html  css  js  c++  java
  • Windows Mobile中的文件改变通知

    在资源管理器中,删除一个文件,更改一个文件夹名称,都能及时刷新。这是怎么做到的呢?答案是使用了文件改变通知。

    先看一个结构

    typedef struct tagSHCHANGENOTIFYENTRY {

      DWORD dwEventMask;

      LPTSTR pszWatchDir;

      BOOL fRecursive;

    } SHCHANGENOTIFYENTRY;

    要接收文件改变的消息,我们要使用一个窗口hWnd,在窗口创建的WM_CREATE消息处注册:

    SHCHANGENOTIFYENTRY schneNotifyEntry;

    schneNotifyEntry.dwEventMask = SHCNE_ALLEVENTS;//监视所有事件

    schneNotifyEntry.pszWatchDir = NULL;//要监视的目录名,NULL表示所有

    schneNotifyEntry.fRecursive = TRUE;//监视目录时,是否递归

    SHChangeNotifyRegister(hWnd, &schneNotifyEntry);

    在窗口的过程函数里,我们响应WM_FILECHANGEINFO消息

    case WM_FILECHANGEINFO:

    {

           FILECHANGENOTIFY    *lpfcn;

           FILECHANGEINFO      *lpfci;

        lpfcn = (FILECHANGENOTIFY *)lParam;

        if (NULL == lpfcn)

        {

            break;

        }

        lpfci = &(lpfcn->fci);

        if (NULL == lpfci)

        {

            break;

        }

        else

        {

                if (FALSE == SHCNEEvent(lpfci))

                {

                    MessageBox(TEXT("SCHNE Event failed"), TEXT("Error"), MB_OK);

                }                   

         }

               

         SHChangeNotifyFree(lpfcn);

    }

    break;

    SHCNEEvent函数实现如下:

    BOOL SHCNEEvent(FILECHANGEINFO *lpfci)

    {

        //lpfci->wEventId,事件

        //lpfci->dwItem1,旧的文件或目录名

        //lpfci->dwItem2,新的文件或目录名

        //lpfci->dwAttributes,文件或目录特性

        //lpfci->ftModified,文件改变时的时间

        //lpfci->nFileSize,文件大小

        switch (lpfci->wEventId)

            {

            case SHCNE_RENAMEITEM:

                break;

               

            case SHCNE_CREATE:

                break;

               

            case SHCNE_DELETE:

                break;

               

            case SHCNE_MKDIR:

                break;

               

            case SHCNE_RMDIR:

                break;

               

            case SHCNE_MEDIAINSERTED:

                break;

               

            case SHCNE_MEDIAREMOVED:

                break;

               

            case SHCNE_DRIVEADD:

                break;

               

            case SHCNE_DRIVEREMOVED:

                break;

               

            case SHCNE_NETSHARE:

                break;

               

            case SHCNE_NETUNSHARE:

                break;

               

            case SHCNE_ATTRIBUTES:

                break;

               

            case SHCNE_UPDATEDIR:

                break;

               

            case SHCNE_SERVERDISCONNECT:

                break;

               

            case SHCNE_RENAMEFOLDER:

                break;

               

            default:

                break;

            }

       

        return TRUE;

    }

    根据事件,就可以知道是哪个文件或目录发生了改变。

    最后,在hWnd销毁处,要注销:

    SHChangeNotifyDeregister(hWnd);

  • 相关阅读:
    TortoiseGit 连接oschina不用每次输入用户名和密码的方法
    IIS7 配置SSL 绑定主机头
    二种方法安装卸载Windows服务的命令
    System.Data.SqlClient.SqlException: 从 datetime2 数据类型到 datetime 数据类型的转换产生一个超出范围的值
    SQL Server 2008 角色
    sql2008“备份集中的数据库备份与现有的xx数据库不同”解决方法
    winform窗体间传值
    C#用到的一些代码汇总,后期再整理
    排球计分程序中英文切换
    ASP.NET MVC 排球计分程序 (八)排球计分程序的演示
  • 原文地址:https://www.cnblogs.com/fengju/p/6173543.html
Copyright © 2011-2022 走看看