Здравствуйте.
Вопрос такой:
Вот процедура вызова системного контекстного меню для файла(через ListView):
procedure TForm1.ListViewMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
ContextMenu : IContextMenu;
menu : HMENU;
Command: LongBool;
P: TPoint;
ICmd: integer;
HR: HResult;
Verb: string;
ZVerb: array[0..255] of char;
Handled: boolean;
SCV: IShellCommandVerb;
ICI: TCMInvokeCommandInfo;
ty: string;
rr:TFlatMenu;
begin
if Button = mbRight then begin
FIShellFolder.GetUIObjectOf(Handle, 1, ShellItem(ListView.Selected.index).ID, IID_IContextMenu, nil, ContextMenu);
menu := CreatePopupMenu;
P.X := X;
P.Y := Y;
try
ContextMenu.QueryContextMenu(menu, 0, 1, $7FFF, CMF_EXPLORE or CMF_CANRENAME);
ContextMenu.QueryInterface(IID_IContextMenu2, ICM2);
Command:=TrackPopupMenu(Menu, TPM_LEFTALIGN or TPM_LEFTBUTTON or TPM_RIGHTBUTTON or TPM_RETURNCMD, P.X, P.Y, 0, Handle, nil);
if Command then
begin
ICmd := LongInt(Command) - 1;
HR := ContextMenu.GetCommandString(ICmd, GCS_VERBA, nil, ZVerb, SizeOf(ZVerb));
Verb := StrPas(ZVerb);
Handled := False;
if Supports(TWinControl(Owner), IShellCommandVerb, SCV) then
begin
HR := 0;
SCV.ExecuteCommand(Verb, Handled);
end;
if not Handled then
begin
FillChar(ICI, SizeOf(ICI), #0);
with ICI do
begin
cbSize := SizeOf(ICI);
hWND := Handle;
lpVerb := MakeIntResource(ICmd);
nShow := SW_SHOWNORMAL;
end;
HR := ContextMenu.InvokeCommand(ICI);
end;
if Assigned(SCV) then
SCV.CommandCompleted(Verb, HR = S_OK);
end;
finally
DestroyMenu(Menu);
PopupMenu11.Free;
end;
end;
end;
Процедура работает...но, выбрав какой-либо пункт в меню, получаю выполнение его только для ОДНОГО файла, оно и понятно, ведь "FIShellFolder.GetUIObjectOf(Handle, 1, ShellItem(ListView.Selected.index).ID, IID_IContextMenu, nil, ContextMenu);" не пойму как сделать выполнение выбранной команды для ВСЕХ выделенных(выбранных) файлов...
помогите