Shell popup

Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду

Ответить
Аватара пользователя
LAngel
Сообщения: 277
Зарегистрирован: 30 мар 2005, 08:19
Откуда: Ульяновск
Контактная информация:

Интересно, а можно каким-нить способом отобразить стандартный попап експлорера (открыть/проводник/../свойства) и заставить винду обрабатывать его...
С уважением, Lost Angel...
Eugie
Сообщения: 708
Зарегистрирован: 17 фев 2004, 23:59
Откуда: SPb

Отобразить где? Ведь контекстное меню потому так и называется, что привязывется к какому-то объекту Shell. Вообще для работы с контестным меню применяют интерфейсы IContextMenu, IContextMenu2, IContextMenu3.
Аватара пользователя
LAngel
Сообщения: 277
Зарегистрирован: 30 мар 2005, 08:19
Откуда: Ульяновск
Контактная информация:

Допустим у меня есть просто имя файла или папки.
Как создать(?) объект shell для этого имени и вызвать этот самый попап.
С интерфейсами я не работал вообще, а судя по докам, что мне удалось отыскать, там применяются именно они.
С уважением, Lost Angel...
Sera
Сообщения: 38
Зарегистрирован: 03 мар 2005, 17:23
Откуда: Симферополь

http://rsdn.ru/article/qna/winshell/filemenu.xml - то, что тебе нужно
Аватара пользователя
LAngel
Сообщения: 277
Зарегистрирован: 30 мар 2005, 08:19
Откуда: Ульяновск
Контактная информация:

Спасибо, на самом деле работает.
Если кому интересно - процедурка переведенная на дельфи:

Код: Выделить всё

uses ShlObj, ActiveX;
...
procedure ShowContextMenu(HWND: hWnd; Path: String; x, y: Integer);
var
  FullPath: PWideChar;
  Folder, DesktopFolder: IShellFolder;
  ContextMenu: IContextMenu2;
  Malloc: IMalloc;
  hPopupMenu: HMENU;
  pLastId, pidl: PItemIDList;
  pchEaten, dwAttributes: ULONG;
  temp: SHORT;
  offset: Word;
  nCmd: LongBool;
  p: PChar;
  ici: CMINVOKECOMMANDINFO;
begin
  GetMem(FullPath, 1024);
  StringToWideChar(Path, FullPath, MAX_PATH);
  SHGetDesktopFolder(DesktopFolder);
  DesktopFolder.ParseDisplayName(HWND, nil, FullPath, pchEaten, pidl, dwAttributes);
  if pidl <> nil then
  begin
    pLastId := pidl;
    while True do
    begin
      offset := pLastId.mkid.cb;
      p := Pointer(pLastId);
      p := @p[offset];
      temp := word(p^);
      if temp = 0 then Break;
      pLastId := PItemIDList(p);
    end;
    temp := pLastId.mkid.cb;
    pLastId.mkid.cb := 0;
    DesktopFolder.BindToObject(pidl, nil, IID_IShellFolder, Folder);
    pLastId.mkid.cb := temp;
    Folder.GetUIObjectOf(HWND, 1, pLastId, IID_IContextMenu, nil, ContextMenu);
    hPopupMenu := CreatePopupMenu;
    ContextMenu.QueryContextMenu(hPopupMenu, 0, 1, $07FFF, 0);
    nCmd := TrackPopupMenu(hPopupMenu,
     TPM_LEFTALIGN or TPM_LEFTBUTTON or TPM_RIGHTBUTTON or TPM_RETURNCMD,
     x, y, 0, hWnd, nil);
    if nCmd then
    begin
      ZeroMemory(@ici, sizeof(CMINVOKECOMMANDINFO));
      ici.cbSize := sizeof(CMINVOKECOMMANDINFO);
      ici.hwnd := hWnd;
      ici.lpVerb := MAKEINTRESOURCE(Word(nCmd)-1);
      ici.nShow := SW_SHOWNORMAL;
      ContextMenu.InvokeCommand(ici);
    end;
    SHGetMalloc(Malloc);
    Malloc.Free(pidl);
  end;
  FreeMem(FullPath);
end;
С уважением, Lost Angel...
Sera
Сообщения: 38
Зарегистрирован: 03 мар 2005, 17:23
Откуда: Симферополь

хм.. а в дельфи не нужно делать release для запрошенных интерфейсов? ПОчему-то сомневаюсь, что не нужно.
ChPuK
Сообщения: 28
Зарегистрирован: 25 фев 2005, 08:40
Откуда: Tashkent
Контактная информация:

IShellFolder из какой библиотеки...
я в общем погнал
Eugie
Сообщения: 708
Зарегистрирован: 17 фев 2004, 23:59
Откуда: SPb

а в дельфи не нужно делать release для запрошенных интерфейсов?
из Delphi Help:
IInterface is the base interface for interfaces defined in Delphi code. When used in C++ code, IInterface is considered a child interface of IUnknown and IUnknown is considered the base interface for all interfaces.

IInterface introduces the QueryInterface method, which is useful for discovering and using other interfaces implemented by the same object. IInterface also introduces the reference counting methods, _AddRef and _Release. The Delphi compiler automatically provides calls to these methods when interfaces are used.
IShellFolder из какой библиотеки...
из Shell32.dll
Sera
Сообщения: 38
Зарегистрирован: 03 мар 2005, 17:23
Откуда: Симферополь

аа, все с дельфи понятно. Спасибо за разъяснение.
Ответить