На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! user posted image
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.

Соблюдайте общие правила форума

Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как "свернуть" программу в трей.
3. Как "скрыться" от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как запустить программу/файл? (и дождаться ее завершения)
5. Как перехватить API-функции, поставить hook? (перехват сообщений от мыши, клавиатуры - внедрение в удаленное адресное прстранство)
... (продолжение следует) ...

Внимание:
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки - бан.
Мат в разделе - бан на три месяца...

Полезные ссылки:
user posted image MSDN Library user posted image FAQ раздела user posted image Поиск по разделу user posted image Как правильно задавать вопросы


Выразить свое отношение к модераторам раздела можно здесь: user posted image Rouse_, user posted image Krid

Модераторы: Rouse_, Krid
  
> Контестное меню для нескольких файлов/папок
    Нужно из своей проги вызвать контекстное меню для нескольких файлов/папок
    делаю это так
    ExpandedWrap disabled
      procedure ShowSysPopup(aFileLst: TStringList; P: TPoint; HND: HWND);
      var
        Root: IShellFolder;
        ShellParentFolder: IShellFolder;
        chEaten,dwAttributes: ULONG;
        ParentFolderPIDL: PItemIDList;
        FilesPIDL: PArrayOfPItemIDList;
        CM: IContextMenu;
        Menu: HMenu;
        Command: LongBool;
        ICM2: IContextMenu2;
       
        ICI: TCMInvokeCommandInfo;
        ICmd: integer;
        ZVerb: array[0..255] of AnsiChar;
        Verb: string;
        Handled: boolean;
        SCV: IShellCommandVerb;
        HR: HResult;
        I: Integer;
        Malloc: IMalloc;
      begin
        OleCheck(SHGetMalloc(Malloc));
        OleCheck(SHGetDesktopFolder(Root));//Get the Desktop IShellFolder interface
        OleCheck(Root.ParseDisplayName(HND, nil, PWideChar(WideString(ExtractFilePath(aFileLst[0]))),
                            chEaten, ParentFolderPIDL, dwAttributes)); // Get the PItemIDList of the parent folder
        OleCheck(Root.BindToObject(ParentFolderPIDL, nil, IShellFolder,
                            ShellParentFolder)); // Get the IShellFolder Interface  of the Parent Folder
        FilesPIDL := AllocMem(SizeOf(PItemIDList) * aFileLst.Count);
        try
          for I := 0 to aFileLst.Count - 1 do
            OleCheck(ShellParentFolder.ParseDisplayName(HND, nil, PWideChar(WideString(ExtractFileName(aFileLst[I]))),
                            chEaten, FilesPIDL[I], dwAttributes)); // Get the relative  PItemIDList of the File
          ShellParentFolder.GetUIObjectOf(HND, aFileLst.Count, FilesPIDL^[0], IID_IContextMenu, nil, CM); // get the IContextMenu Interace for the file
        finally
          for i := 0 to aFileLst.Count - 1 do begin
            if FilesPIDL^[i] <> nil then Malloc.Free(FilesPIDL^[i]);
          end;
           FreeMem(FilesPIDL);
        end;
       
        if CM = nil then Exit;
        Menu := CreatePopupMenu;
        try
          CM.QueryContextMenu(Menu, 0, 1, $7FFF, CMF_EXPLORE or CMF_CANRENAME);
          CM.QueryInterface(IID_IContextMenu2, ICM2); //To handle submenus.
          try
            Command := TrackPopupMenu(Menu, TPM_LEFTALIGN or TPM_LEFTBUTTON or TPM_RIGHTBUTTON or TPM_RETURNCMD, p.X, p.Y, 0, HND, nil);
          finally
            ICM2 := nil;
          end;
          if Command then begin
            ICmd := LongInt(Command) - 1;
            HR := CM.GetCommandString(ICmd, GCS_VERBA, nil, ZVerb, SizeOf(ZVerb));
            Verb := StrPas(ZVerb);
            Handled := False;
            if Supports(nil, 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 := 0;
                lpVerb := MakeIntResourceA(ICmd);
                nShow := SW_SHOWNORMAL;
              end;
              HR := CM.InvokeCommand(ICI);
            end;
            if Assigned(SCV) then
              SCV.CommandCompleted(Verb, HR = S_OK);
          end;
        finally
           DestroyMenu(Menu)
        end;
      end;

    но меню появляется так как будто выбран только один, а не несколько файлов.
    подскажите плз, где ошибка в моем коде?

    Добавлено
    сори что потревожил ;)
    кажись работает как надо
    просто была ошибка в формировке списка файлов

    ПС
    Кстати добавьте код в FAQ, а то в нете готового кода нету (а может просто плохо искал)
      Цитата
      Кстати добавьте код в FAQ, а то в нете готового кода нету (а может просто плохо искал)

      это твой код? добавлю у себя
        Цитата VahaC @
        Кстати добавьте код в FAQ, а то в нете готового кода нету

        Оно?
        Контекстное меню для файла
          Цитата Rouse_ @
          Оно?
          Контекстное меню для файла

          немного не оно

          там для одного файла, а у меня для нескольких


          Цитата antonn @
          это твой код?

          взял код для одного айтема и перекрутил чтобы работало и для одного и для нескольких
            Возможно ли Popup-меню инициализировать стандартным меню виндовс? (сообщение #2965844) здесь я когда-то тоже спрашивал. Потом тоже допёр. Если надо - могу полностью код приложить.
            0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
            0 пользователей:


            Рейтинг@Mail.ru
            [ Script execution time: 0,0370 ]   [ 16 queries used ]   [ Generated: 14.03.26, 11:34 GMT ]