フォルダーの名前変更に反応しないため、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
場合は、1、2、100 などの小さな整数値が含まれます。lParam
NMHDR
編集:質問は「WM_NOTIFY が NMHDR へのポインターなしで来るのはなぜですか?」に短縮できます。