Контекстное меню корзины

Если вы разбираетесь в программировании (C++ Builder, Delphi), возможно вы сможете помочь в устранении проблемных мест в программе

Модератор: motyara

Закрыто
Аватара пользователя
Max Diesel
Автор программы
Сообщения: 3431
Зарегистрирован: Пт окт 12, 2007 3:26 pm
Контактная информация:

Контекстное меню корзины

Сообщение Max Diesel »

Разыскивается код на Delphi/C++Builder, вызывающий контекстное меню корзины:
recycledbincontextmenu.gif
recycledbincontextmenu.gif (3.22 КБ) 3551 просмотр
Буду очень признателен за конкретную помощь в этом вопросе.
admini
Охотник за багами
Сообщения: 21
Зарегистрирован: Чт фев 26, 2009 11:04 pm

Re: Контекстное меню корзины

Сообщение admini »

Я покопался вчера получилось вывести контектсное меню "внутри" корзины, когда кликаешь по файлу. Наверное примерно в этом направлении и следует копать. Но вариант 2: сделать своё собственное меню и в нем сделать вызов команд типа Очистить корзину, открыть свойства корзины или ее содержимое. Для этого есть исходники.

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

код удалил. глядите постами ниже
Последний раз редактировалось admini Ср дек 02, 2009 10:56 pm, всего редактировалось 2 раза.
Аватара пользователя
Max Diesel
Автор программы
Сообщения: 3431
Зарегистрирован: Пт окт 12, 2007 3:26 pm
Контактная информация:

Сообщение Max Diesel »

Это слишком уж приблизительное направление копания... честно говоря уже несколько программистов стараясь найти решение этой небольшой проблемы сломали лопаты пытаясь копать куда-то в этом направлении, я тоже уже перепробовал изрядное количество вариантов (и конечно же в поисковой системе полазил не пару минут). Казалось бы такая линейная функция, а тем не менее не так она проста как хотелось бы...
admini
Охотник за багами
Сообщения: 21
Зарегистрирован: Чт фев 26, 2009 11:04 pm

Re: Контекстное меню корзины

Сообщение admini »

ну оказывается почти угадал)))

вот полностью рабочий код:

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

uses
  ActiveX, ShlObj;

procedure ShowRecycleBinContextMenu(hWindow: THandle; pt: TPoint);
const
  MIN_ID = 1;
  MAX_ID = $7fff;
var
  desktopFolder: IShellFolder;
  recycleBinIDL: PItemIDList;
  contextMenu: IContextMenu;
  emptyMenu: HMENU;
  idCommand: Integer;
  commandInfo: TCMInvokeCommandInfo;
begin
  //CoInitialize(nil);
                               
  SHGetDesktopFolder(desktopFolder);
  SHGetSpecialFolderLocation(0, CSIDL_BITBUCKET, recycleBinIDL);
  desktopFolder.GetUIObjectOf(0, 1, recycleBinIDL, IID_IContextMenu, nil, contextMenu);

  emptyMenu := CreatePopupMenu();
  contextMenu.QueryContextMenu(emptyMenu, 0, MIN_ID, MAX_ID, CMF_EXPLORE);
  idCommand := Integer(TrackPopupMenu(
    emptyMenu, TPM_RETURNCMD or TPM_LEFTALIGN, pt.X, pt.Y, 0, hWindow, nil));

  if (idCommand >= MIN_ID) and (idCommand <= MAX_ID) then	
	begin      
    FillChar(commandInfo, SizeOf(commandInfo), 0);
    with commandInfo do
    begin
      cbSize := SizeOf(commandInfo);
      hwnd := hWindow;
      nShow := SW_SHOWNORMAL;
      lpVerb := PChar(idCommand - MIN_ID);
    end;
    contextMenu.InvokeCommand(commandInfo);
	end;

  CoTaskMemFree(recycleBinIDL);
  DestroyMenu(emptyMenu);

  //CoUninitialize();
end;

...
ShowRecycleBinContextMenu(Handle, Point(Left + 100, Top + 100));
...
Аватара пользователя
Max Diesel
Автор программы
Сообщения: 3431
Зарегистрирован: Пт окт 12, 2007 3:26 pm
Контактная информация:

Сообщение Max Diesel »

Действительно, код работает именно так как и нужно было. Большое спасибо за помощь в этом вопросе, начиная со следующего билда программа наконец обретет контекстное меню корзины, всплывающее при нажатии правой кнопкой мыши по функциональной клавише "F8 Удалить". Я уже и не предполагал что этот алгоритм существует...
Закрыто