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;
};