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

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

Модератор: motyara

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

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

Сообщение Max Diesel » Сб ноя 28, 2009 12:05 am

Разыскивается код на Delphi/C++Builder, вызывающий контекстное меню корзины:
recycledbincontextmenu.gif
recycledbincontextmenu.gif (3.22 КБ) 2378 просмотров
Буду очень признателен за конкретную помощь в этом вопросе.

admini
Охотник за багами
Сообщения: 21
Зарегистрирован: Чт фев 26, 2009 11:04 pm

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

Сообщение admini » Ср дек 02, 2009 10:31 am

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

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

код удалил. глядите постами ниже
Последний раз редактировалось admini Ср дек 02, 2009 10:56 pm, всего редактировалось 2 раза.

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

Сообщение Max Diesel » Ср дек 02, 2009 4:11 pm

Это слишком уж приблизительное направление копания... честно говоря уже несколько программистов стараясь найти решение этой небольшой проблемы сломали лопаты пытаясь копать куда-то в этом направлении, я тоже уже перепробовал изрядное количество вариантов (и конечно же в поисковой системе полазил не пару минут). Казалось бы такая линейная функция, а тем не менее не так она проста как хотелось бы...

admini
Охотник за багами
Сообщения: 21
Зарегистрирован: Чт фев 26, 2009 11:04 pm

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

Сообщение admini » Ср дек 02, 2009 10:54 pm

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

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

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

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
Автор программы
Сообщения: 3132
Зарегистрирован: Пт окт 12, 2007 9:00 pm
Контактная информация:

Сообщение Max Diesel » Чт дек 03, 2009 3:34 pm

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

Закрыто