gpt4 book ai didi

c++ - 子类化 SHBrowseForFolder 并处理 WM_NOTIFY

转载 作者:太空狗 更新时间:2023-10-29 21:48:06 25 4
gpt4 key购买 nike

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

下面是当我得到 BFFM_INITIALIZED 时我如何设置新的 wndproc:

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

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

最佳答案

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

关于c++ - 子类化 SHBrowseForFolder 并处理 WM_NOTIFY,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11561401/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com