我正在尝试修复SHBrowseForFolder对话框,因为它对文件夹重命名不起作用(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
块时,它才有效。甚至对lParam
的访问也会中断对话框(它包含带有空标签的损坏的treee)。如果我在切换之前调用oldWndProc,则它可以工作,但在WM_NOTIFY
情况下,lParam
显然不包含指向NMHDR
的指针,它包含一个较小的整数值,例如1,2,100等。编辑:问题可以简化为“为什么WM_NOTIFY没有指向NMHDR的指针?”
最佳答案
该错误是由于我的疏忽所致:我从某个示例中复制了wndproc签名,该示例的农业名称困惑。 lParam通常排在最后,类型为LPARAM。因此,我尝试转换通常称为wParam的arg,其中包含控件ID而不是LPNMHDR。
关于c++ - 子类化SHBrowseForFolder并处理WM_NOTIFY,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11561401/