私はCMF_CANRENAME
とIContextMenu::QueryContextMenu
を呼び出しています.Windows XPでIContextMenu::InvokeCommand
を呼び出すと、名前変更操作の処理に問題があります。IContextMenuを呼び出すとき、どのように名前変更操作を処理しますか?
私は名前空間の拡張ではなく、私はDefView/IShellViewを使用していませんが、私はを実装するサイトを提供しています。
新しいバージョンのWindowsでは、IFolderView2を実装しているサービスに対してクエリが実行されました。シェルはIFolderView2::DoRename
を呼び出して、名前の変更操作を開始できます。
ただし、Windows XPではSID_DefView
サービスを照会しますが、そのサービスを実装する方法についての情報はありません。
インターフェースそれ(SHELL32!CDefFolderMenu :: _ ProcessRename)を求めているが、{985F64F0-D410-4E02-BE22-DA07F2B5C5E1}であり、私はこれがIDefViewFrame3
ためのIIDであるレジストリに見ることができるが、文書化されていないことのようです!一方、IDefViewFrameは文書化されていますが、MSDNの唯一のことは "IUnknown機能のためだけに使用されています。独自の方法はありません。"
このような状況でXPの名前変更操作を処理する方法はありますか?
私は本当にIDefViewFrame3インターフェイスを偽装するつもりはありませんが、私が考えることができる唯一の他のオプションは、名前変更動詞であるかどうかを確認し、TrackPopupMenu
の後に自分自身で処理することです。すべてのサードパーティの名前空間拡張は、それを正しく扱うこと
STDMETHOD(GetWindowLV)(THIS_ HWND*phwnd) PURE;
STDMETHOD(ShowHideListView)(THIS) PURE;
STDMETHOD(OnResizeListView)(THIS) PURE;
STDMETHOD(ReleaseWindowLV)(THIS) PURE;
STDMETHOD(DoRename)(THIS) PURE;
とDoRename
がInvokeCommand
内DefViewによって呼び出されますが、それはとても曖昧で、文書化されていないので、それはそうです:
本当にXPをサポートする必要があるかどうかを検討してください。 –
私はあなたの質問を正しく読んでいる場合、コードのいくつかの他の部分があなたのコードにリネーム操作を実行するように要求していて、内部的にシェルコンテキストメニューを使って実際のリネームを実行しています。そうですか?最初の名前変更要求を受け取るために 'IDefViewFrame3'を実装する方法を尋ねていますか? –
実際の名前を変更するには、 'TrackPopupMenu()'は必要ありません。単に 'QueryContextMenu()'を実行すると、 'HMENU'にメニュー項目を入力し、' Rename'メニュー項目を見つけてそのIDを 'InvokeCommand()'に渡します。あるいは 'QueryContextMenu()'をスキップし、ハードコーディングされた '' rename ''動詞を' InvokeCommand() 'に渡すだけです。 –