シェルの変更通知の受信[ATL]

(2003.02.11)
class CSHChangeNotifyEntry : public SHChangeNotifyEntry
{
public:
    CSHChangeNotifyEntry(LPCITEMIDLIST pidlNew = NULL, BOOL fRecursiveNew = FALSE)
    {
        memset(this, 0, sizeof(SHChangeNotifyEntry));
        this->pidl = pidlNew;
        this->fRecursive = fRecursiveNew;
    }
};
 
 
/////////////////////////////////////////////////////////////////////////////
// CSHChangeNotifyRegister
 
template <CLASS 100) + t_nWindowMessage="(WM_USER" int T,>
class ATL_NO_VTABLE CSHChangeNotifyRegister
{
public:
    CSHChangeNotifyRegister()
    {
        m_nSHChangeNotifyID = 0;
    }
    virtual ~CSHChangeNotifyRegister()
    {
    }
 
public:
    ULONG SHChangeNotifyRegister(int fSources, LONG fEvents, int cEntries, SHChangeNotifyEntry* pfsne)
    {
        T* pT = static_cast<T*>(this);
 
        m_nSHChangeNotifyID = ::SHChangeNotifyRegister(pT->GetHwnd(), fSources, fEvents, t_nWindowMessage, cEntries, pfsne);
        return m_nSHChangeNotifyID;
    }
    BOOL SHChangeNotifyDeregister()
    {
        BOOL br = TRUE;
 
        if (m_nSHChangeNotifyID != 0)
        {
            br = ::SHChangeNotifyDeregister(m_nSHChangeNotifyID);
            m_nSHChangeNotifyID = 0;
        }
 
        return br;
    }
 
BEGIN_MSG_MAP(CSHChangeNotifyRegister<T>)
    MESSAGE_HANDLER(t_nWindowMessage, _OnSHChangeNotify)
ALT_MSG_MAP(1)
    MESSAGE_HANDLER(t_nWindowMessage, _OnSHChangeNotify)
END_MSG_MAP()
 
public:
    virtual LRESULT _OnSHChangeNotify(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/)
    {
        T* pT = static_cast<T*>(this);
 
        HRESULT hr = S_OK;
 
        OSVERSIONINFO version;
        memset(&version, 0, sizeof(version));
        version.dwOSVersionInfoSize = sizeof(version);
        ::GetVersionEx(&version);
        if (version.dwPlatformId == VER_PLATFORM_WIN32_NT)
        {
            LONG lEvent = 0;
            LPITEMIDLIST* pidls = NULL;
            HANDLE hLock = ::SHChangeNotification_Lock((HANDLE)wParam, (DWORD)lParam, &pidls, &lEvent);
            if (!hLock)
            {
                return 0;
            }
 
            hr = pT->OnSHChangeNotify(lEvent, pidls[0], pidls[1]);
            if (FAILED(hr))
            {
                // 無視する。。
            }
 
            ::SHChangeNotification_Unlock(hLock);
        }
        else
        {
            LONG lEvent = (LONG)lParam;
            LPITEMIDLIST* pidls = (LPITEMIDLIST*)wParam;
 
            hr = pT->OnSHChangeNotify(lEvent, pidls[0], pidls[1]);
            if (FAILED(hr))
            {
                // 無視する。。
            }
        }
 
        return 0;
    }
 
// IShellChangeNotify
public:
    STDMETHOD(OnSHChangeNotify)(LONG lEvent, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
    {
//        this->Dump_SHChangeNotifyMessage(lEvent, pidl1, pidl2);
        return E_NOTIMPL;
    }
 
public:
    STDMETHOD_(HWND, GetHwnd)() = 0;
 
public:
    // シェルの変更通知をダンプ表示する
    STDMETHOD(Dump_SHChangeNotifyMessage)(LONG lEvent, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
    {
#if _DEBUG
        // シェルの変更通知
        if (lEvent & SHCNE_RENAMEITEM)
        {
            // アイテムの名称が変更された
            ATLTRACE("OnSHChangeNotify() : SHCNE_RENAMEITEM\n");
        }
        if (lEvent & SHCNE_CREATE)
        {
            // アイテムが作成された
            ATLTRACE("OnSHChangeNotify() : SHCNE_CREATE\n");
        }
        if (lEvent & SHCNE_DELETE)
        {
            // アイテムが削除された
            ATLTRACE("OnSHChangeNotify() : SHCNE_DELETE\n");
        }
        if (lEvent & SHCNE_MKDIR)
        {
            // ディレクトリが作成された
            ATLTRACE("OnSHChangeNotify() : SHCNE_MKDIR\n");
        }
        if (lEvent & SHCNE_RMDIR)
        {
            // ディレクトリが削除された
            ATLTRACE("OnSHChangeNotify() : SHCNE_RMDIR\n");
        }
        if (lEvent & SHCNE_MEDIAINSERTED)
        {
            ATLTRACE("OnSHChangeNotify() : SHCNE_MEDIAINSERTED\n");
        }
        if (lEvent & SHCNE_MEDIAREMOVED)
        {
            ATLTRACE("OnSHChangeNotify() : SHCNE_MEDIAREMOVED\n");
        }
        if (lEvent & SHCNE_DRIVEREMOVED)
        {
            ATLTRACE("OnSHChangeNotify() : SHCNE_DRIVEREMOVED\n");
        }
        if (lEvent & SHCNE_DRIVEADD)
        {
            ATLTRACE("OnSHChangeNotify() : SHCNE_DRIVEADD\n");
        }
        if (lEvent & SHCNE_NETSHARE)
        {
            ATLTRACE("OnSHChangeNotify() : SHCNE_NETSHARE\n");
        }
        if (lEvent & SHCNE_NETUNSHARE)
        {
            ATLTRACE("OnSHChangeNotify() : SHCNE_NETUNSHARE\n");
        }
        if (lEvent & SHCNE_ATTRIBUTES)
        {
            ATLTRACE("OnSHChangeNotify() : SHCNE_ATTRIBUTES\n");
        }
        if (lEvent & SHCNE_UPDATEDIR)
        {
            ATLTRACE("OnSHChangeNotify() : SHCNE_UPDATEDIR\n");
        }
        if (lEvent & SHCNE_UPDATEITEM)
        {
            // フォルダ・アイテムの属性が変更された
            ATLTRACE("OnSHChangeNotify() : SHCNE_UPDATEITEM\n");
        }
        if (lEvent & SHCNE_SERVERDISCONNECT)
        {
            ATLTRACE("OnSHChangeNotify() : SHCNE_SERVERDISCONNECT\n");
        }
        if (lEvent & SHCNE_UPDATEIMAGE)
        {
            ATLTRACE("OnSHChangeNotify() : SHCNE_UPDATEIMAGE\n");
        }
        if (lEvent & SHCNE_DRIVEADDGUI)
        {
            ATLTRACE("OnSHChangeNotify() : SHCNE_DRIVEADDGUI\n");
        }
        if (lEvent & SHCNE_RENAMEFOLDER)
        {
            // フォルダの名称が変更された
            ATLTRACE("OnSHChangeNotify() : SHCNE_RENAMEFOLDER\n");
        }
        if (lEvent & SHCNE_FREESPACE)
        {
            // フリースペースが増減した
            ATLTRACE("OnSHChangeNotify() : SHCNE_FREESPACE\n");
        }
#endif
 
        return S_OK;
    }
 
public:
    ULONG m_nSHChangeNotifyID;
};
一覧に戻る
© 2003 WAC.com All Right Reserved.