3

我正在尝试修复 SHBrowseForFolder 对话框,因为它不会对文件夹重命名做出反应(BFFM_SELCHANGED没有发送,也无法确定路径现在是否正确)。我用谷歌搜索了一个解决方案,它说我必须继承 dlg 的 wndproc 并捕获TVN_ENDLABELEDIT发送BFFM_SELCHANGED自己。

这是我在获得时设置新 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中断对话框(它包含带有空标签的损坏树)。如果我在 switch 之前调用 oldWndProc ,那么它可以工作,但WM_NOTIFY如果lParam显然不包含指向 的指针NMHDR,它会包含一个小整数值,如 1,2,100 等。

编辑:这个问题可以缩短为“为什么 WM_NOTIFY 没有指向 NMHDR 的指针?”

4

1 回答 1

2

该错误是由于我的疏忽造成的:我从一些示例中复制了 wndproc 签名,该示例中的 agrument 名称混淆了。lParam 通常排在最后,并且具有 LPARAM 类型。所以我试图转换通常称为 wParam 的 arg,它包含一个控件 id 而不是 LPNMHDR。

于 2012-07-19T14:09:29.683 回答