2016-11-08 9 views
0

私はCMF_CANRENAMEIContextMenu::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; 

DoRenameInvokeCommand内DefViewによって呼び出されますが、それはとても曖昧で、文書化されていないので、それはそうです:

+0

本当にXPをサポートする必要があるかどうかを検討してください。 –

+0

私はあなたの質問を正しく読んでいる場合、コードのいくつかの他の部分があなたのコードにリネーム操作を実行するように要求していて、内部的にシェルコンテキストメニューを使って実際のリネームを実行しています。そうですか?最初の名前変更要求を受け取るために 'IDefViewFrame3'を実装する方法を尋ねていますか? –

+0

実際の名前を変更するには、 'TrackPopupMenu()'は必要ありません。単に 'QueryContextMenu()'を実行すると、 'HMENU'にメニュー項目を入力し、' Rename'メニュー項目を見つけてそのIDを 'InvokeCommand()'に渡します。あるいは 'QueryContextMenu()'をスキップし、ハードコーディングされた '' rename ''動詞を' InvokeCommand() 'に渡すだけです。 –

答えて

0

IDefViewFrame3は、Windows XP上のIUnknown後、このようになります。したがって、IDefViewFrame3を実装しても、InvokeCommandが失敗した場合でも、名前変更動詞を確認する必要があります。

関連する問題