Дескриптор меню

Общие вопросы, не зависящие от языка реализации.

Модераторы: Duncon, Hawk, Romeo, Eugie

Ответить
OTELLO
Сообщения: 59
Зарегистрирован: 11 дек 2004, 11:52
Откуда: Питеррр
Контактная информация:

11 дек 2004, 12:04

Народ, помогите плиз, как можно получить дескриптор контекстного меню рабочего стола?
Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

13 дек 2004, 14:48

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

   IShellFolderPtr spDesktop;
   SHGetDesktopFolder(spDesktop);

   IContextMenu spMenu;
   spDesktop->CreateViewObject(NULL, IID_IContextMenu, (void **)&spMenu);

   // далее можно манипулировать этим контекстным меню
P.S. Прямого способа получения хэндла не существует по той причине, что меню всякий раз заново создаётся перед тем, как показаться. Единственный выход - работать с ним через Shell.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
OTELLO
Сообщения: 59
Зарегистрирован: 11 дек 2004, 11:52
Откуда: Питеррр
Контактная информация:

13 дек 2004, 18:06

Спасибки что откликнулся на просьбу, но не мог бы ты на Дельфе код написать, я не знаю Си =(( Или просто суть указать, я далее сам напишу. Заранее Спасиб!..
Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

13 дек 2004, 18:50

Shell везде одинаковый так же, как и API. Ну предположим в Delphi нет смартпоинтеров (в чём я сомневаюсь), тогда код будет выглядить следующим образом:

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

var
   pDesktop : ^IShellFolder;
   pMenu: ^IContextMenu;

   ...

   SHGetDesktopFolder(pDesktop);
   ^pDesktop.CreateViewObject(NULL, IID_IContextMenu, @pMenu); 

   ...   

   {некие манипуляции}

  ...

  pMenu->Release;
  pDesktop->Release;
P.S. Могу и ошибаться: ни разу не писал под COM на Delphi. Да и вообще советую открыть стандартный делфийский help и найти там описание COM-интнерфейса IShellFolder.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Eugie
Сообщения: 707
Зарегистрирован: 17 фев 2004, 23:59
Откуда: SPb

16 дек 2004, 13:59

Ну предположим в Delphi нет смартпоинтеров (в чём я сомневаюсь)
Нет smart pointers, подтверждаю
var
pDesktop : ^IShellFolder;
pMenu: ^IContextMenu;
Указатели не нужны, соотв.параметры просто объявлены как var
Ответить