我試圖修復SHBrowseForFolder對話框,因爲它對文件夾重命名沒有反應(BFFM_SELCHANGED
未被髮送,並且沒有辦法確定路徑現在是否正確)。我搜索了一個解決方案,其中說,我必須繼承dlg的wndproc並捕獲TVN_ENDLABELEDIT
發送BFFM_SELCHANGED
我自己。繼承SHBrowseForFolder並處理WM_NOTIFY
這是我如何設置新的WndProc當我得到BFFM_INITIALIZED
:
for (HWND hChild = GetWindow(hWnd, GW_CHILD); hChild != 0; hChild = GetWindow(hChild, GW_HWNDNEXT)) {
szClassName[256];
GetClassName(hChild, szClassName, sizeof(szClassName));
if (!stricmp(szClassName, "SHBROWSEFORFOLDER SHELLNAMESPACE CONTROL")) {
oldWndProc = reinterpret_cast<WNDPROC>(SetWindowLongPtr(hChild, GWLP_WNDPROC, reinterpret_cast<LONG_PTR>(_SubclassWndProc)));
break;
}
}
這裏是_SubclassWndProc:
static LRESULT _SubclassWndProc(HWND hWnd, UINT uMsg, WPARAM lParam, LPARAM lpData) {
switch (uMsg) {
case WM_NOTIFY:
switch (((LPNMHDR)lParam)->code) {
case TVN_ENDLABELEDIT:
break;
}
break;
}
return CallWindowProc(oldWndProc, hWnd, uMsg, lParam, lpData);
}
,如果我評論WM_NOTIFY
塊才起作用。即使對lParam
的訪問中斷對話框(它包含具有空標籤的損壞的樹)。如果我切換之前打電話oldWndProc,那麼它的工作原理,但在WM_NOTIFY
情況下lParam
顯然不包含一個指向NMHDR
,它包含了像1,2,100等小整數值
編輯:問題可縮寫爲「爲什麼WM_NOTIFY沒有指向NMHDR?」
你確定你的'_SubclassWndProc'簽名與'WNDPROC'的簽名相匹配嗎?我會期待'CALLBACK'宏,但是如果你使用其他一些指定調用約定的方法,它可以沒問題。 – hvd 2012-07-19 13:02:41
CALLBACK沒有幫助) – tas 2012-07-19 13:24:59