我已經連接到 Windows shell,并且很好地接收到我隱藏的通知事件CWnd。
當我收到SHCNE_RENAMEITEM事件時,SHGetPathFromIDList()函式回傳舊檔案名,而不是重命名的新檔案名。
我已經成功破解了一個指標并發現了新名稱,但這對我來說并不安全。我嘗試使用ILNext//來迭代串列ILGetNext,ILIsEmpty但這些并沒有給我新的名字。有沒有更安全的方法?
afx_msg LRESULT OnChange(WPARAM wParam, LPARAM lParam)
{
long lEvent = 0L;
PIDLIST_ABSOLUTE* rgpidl=nullptr;
TCHAR szFileOld[MAX_PATH] = L"\0";
TCHAR szFileNew[MAX_PATH] = L"\0";
HANDLE hNotifyLock = SHChangeNotification_Lock((HANDLE)wParam, (DWORD)lParam, &rgpidl, &lEvent);
if (!SHGetPathFromIDListW((struct _ITEMIDLIST*)*rgpidl, szFileOld))
return TRUE;
if (lEvent & SHCNE_RENAMEITEM)
{
struct _ITEMIDLIST* pNext = (struct _ITEMIDLIST*)*(&rgpidl[1]); // yes, I got lucky guessing the synatx.
if (ILIsEmpty(pNext)) // probably not much safety on this, but trying to be kind.
return TRUE;
if (!SHGetPathFromIDListW(pNext, szFileNew))
return TRUE;
}
// other code.
return FALSE;
}
我應該提到我的注冊碼是使用新的交付方法。
BOOL fRecursive = FALSE;
UINT uMsg = WM_FILE_CHANGED;
long lEvents = SHCNE_UPDATEITEM | SHCNE_DELETE | SHCNE_CREATE | SHCNE_RENAMEITEM | SHCNE_UPDATEDIR;
int const nSources = SHCNRF_ShellLevel | SHCNRF_InterruptLevel | SHCNRF_NewDelivery;
SHChangeNotifyEntry const entries[] = { pidlWatch, fRecursive };
m_lNotificationRegistry = SHChangeNotifyRegister(m_pWnd->m_hWnd, nSources, lEvents, uMsg, ARRAYSIZE(entries), entries);
uj5u.com熱心網友回復:
您走在正確的軌道上,但是您的語法過于復雜。SHChangeNotification_Lock()會給你一個指向 PIDL 陣列的指標,你不需要花哨的型別轉換來訪問該陣列的元素。
此外,您需要SHChangeNotification_Unlock() 在退出回呼函式之前呼叫。
嘗試更多類似的東西:
afx_msg LRESULT OnChange(WPARAM wParam, LPARAM lParam)
{
long lEvent = 0L;
PIDLIST_ABSOLUTE* rgpidl = nullptr;
HANDLE hNotifyLock = SHChangeNotification_Lock((HANDLE)wParam, (DWORD)lParam, &rgpidl, &lEvent);
if (lEvent & SHCNE_RENAMEITEM)
{
WCHAR szFileOld[MAX_PATH] = L"\0";
WCHAR szFileNew[MAX_PATH] = L"\0";
SHGetPathFromIDListW(rgpidl[0], szFileOld);
SHGetPathFromIDListW(rgpidl[1], szFileNew);
}
// other code.
SHChangeNotification_Unlock(hNotifyLock);
return FALSE;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/464807.html
