2012-07-19 57 views
3

我試圖修復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?」

+0

你確定你的'_SubclassWndProc'簽名與'WNDPROC'的簽名相匹配嗎?我會期待'CALLBACK'宏,但是如果你使用其他一些指定調用約定的方法,它可以沒問題。 – hvd 2012-07-19 13:02:41

+0

CALLBACK沒有幫助) – tas 2012-07-19 13:24:59

回答

2

錯誤是由於我的疏忽:我從某個例子中複製了wndproc簽名,這個例子中的名字混淆了名稱。 lParam通常是最後一個,並且有一個LPARAM類型。所以我試圖投射通常稱爲wParam的arg,其中包含控制ID而非LPNMHDR。

+0

嘿,我剛剛發佈了一個答案,大約20秒後,你已經知道了:) – hvd 2012-07-19 14:10:25