【发布时间】:2011-04-20 14:41:07
【问题描述】:
如何遍历 IContextMenu 的所有项目和子项目并列出所有可用动词?到目前为止,我已经从 JCL 中提取了这个工作代码:
function DisplayContextMenuPidl(const Handle: THandle; const Folder: IShellFolder; Item: PItemIdList; Pos: TPoint): Boolean;
var
Cmd: Cardinal;
ContextMenu: IContextMenu;
ContextMenu2: IContextMenu2;
Menu: HMENU;
CommandInfo: TCMInvokeCommandInfo;
CallbackWindow: THandle;
vteste : string;
begin
Result := False;
if (Item = nil) or (Folder = nil) then
Exit;
Folder.GetUIObjectOf(Handle, 1, Item, IID_IContextMenu, nil,
Pointer(ContextMenu));
if ContextMenu <> nil then
begin
Menu := CreatePopupMenu;
if Menu <> 0 then
begin
if Succeeded(ContextMenu.QueryContextMenu(Menu, 0, 1, $7FFF, CMF_EXPLORE)) then
begin
CallbackWindow := 0;
if Succeeded(ContextMenu.QueryInterface(IContextMenu2, ContextMenu2)) then
begin
CallbackWindow := CreateMenuCallbackWnd(ContextMenu2);
end;
ClientToScreen(Handle, Pos);
Cmd := Cardinal(TrackPopupMenu(Menu, TPM_LEFTALIGN or TPM_LEFTBUTTON or TPM_RIGHTBUTTON or TPM_RETURNCMD, Pos.X, Pos.Y, 0, CallbackWindow, nil));
if Cmd <> 0 then
begin
ResetMemory(CommandInfo, SizeOf(CommandInfo));
CommandInfo.cbSize := SizeOf(TCMInvokeCommandInfo);
CommandInfo.hwnd := Handle;
CommandInfo.lpVerb := MakeIntResourceA(Cmd - 1);
CommandInfo.nShow := SW_SHOWNORMAL;
Result := Succeeded(ContextMenu.InvokeCommand(CommandInfo));
end;
if CallbackWindow <> 0 then
DestroyWindow(CallbackWindow);
end;
DestroyMenu(Menu);
end;
end;
end;
这段代码运行良好,它显示了上下文菜单。我需要对其进行调整,以便它可以列出(可能是日志文件)所有菜单和子菜单动词。
编辑
为了澄清让我们假设我有这个上下文菜单:
我想记录如下内容:
项目 动词
打开=打开
属性=属性
发送至=发送至
发送到蓝牙=xxx
编辑
如果有人有另一种获取动词或通过显示文本调用项目的方法,我也将不胜感激。
【问题讨论】:
-
IContextMenu和IContextMenu2供 shell 使用;它们被暴露以允许您将处理程序添加到 shell 的上下文菜单中。我在MSDN 文档中找不到任何说明它们支持从应用程序进行询问的内容。 -
嗯。一定有办法,因为有软件可以做到这一点。不过还是谢谢!
-
我的立场是正确的——Sertac 和 RRUZ 显然都比我更了解这个话题。 :)
-
@ken 两边都可以使用shell接口
-
@David:我想通了 - 请参阅我的最后一条评论。站姿还不够矫正吗? :)