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場合は、1、2、100 などの小さな整数値が含まれます。lParamNMHDR

編集:質問は「WM_NOTIFY が NMHDR へのポインターなしで来るのはなぜですか?」に短縮できます。

4

1 に答える 1

2

エラーは私の過失によるものでした。いくつかの例からwndproc署名をコピーしましたが、これはagrument名が混乱しています。lParamは通常最後に来て、タイプLPARAMを持っています。そのため、通常はwParamと呼ばれるargをキャストしようとしました。これには、LPNMHDRではなくコントロールIDが含まれています。

于 2012-07-19T14:09:29.683 に答える