Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.08.2013, 15:02   #1
WennY
Форумчанин
 
Регистрация: 17.01.2008
Сообщений: 236
По умолчанию Активировать пункт меню проводника

Доброго времени суток. Пытаюсь исполнить сабж по отношению к определенному файлу:
Код:
if( SUCCEEDED( hr ) )
          __try
          {
            memset( & cmd, 0, sizeof( cmd ) );
            cmd.cbSize = sizeof( cmd );
            cmd.fMask = 0;
            cmd.hwnd = 0;
            cmd.lpVerb = "delete";
            cmd.nShow = SW_SHOWNORMAL;
            hr = mnu->InvokeCommand( & cmd );
          }
С delete все нормально, появляется окошко. Но мне нужно вызвать "мой" пункт, который не заявлен в изначальной спецификации виндовс. Например, им может быть тот же Unlocker, который в меню присутствует, однако не срабатывает. Вопрос: как мне указать на него ссылку в lpVerb? Спасибо
WennY вне форума Ответить с цитированием
Старый 28.08.2013, 15:59   #2
asmprog
Пользователь
 
Регистрация: 10.08.2013
Сообщений: 67
По умолчанию

Казалось бы, можно по позиции пункта задавать. Ознакомьтесь http://www.transl-gunsmoker.ru/2009/...extmenu-1.html - там во второй части есть пример с TrackPopupMenu и MAKEINTRESOURCE
asmprog вне форума Ответить с цитированием
Старый 29.08.2013, 11:34   #3
WennY
Форумчанин
 
Регистрация: 17.01.2008
Сообщений: 236
По умолчанию

Собрал вот это. Я не знаю, что нужно ему. Если кратко, то сначала получаем (ну, пытаемся) контекст заданного файла, потом пытаемся перезаписать его в наш новосозданный контекст, и предпринимаем отчаянную попытку его отобразить (уже хоть где-нибудь) с последующим "кликом" по любому пункту. На данный момент меня волнует, почему не срабатывает вывод (коммент "Отображаем меню")? Я буду очень признателен за какую-либо помощь, ибо уже голова кругом, обгуглился до смерти :\ Спасибо

Срабатывает по прежнему только delete в качестве значения cmd.lpVerb.
WennY вне форума Ответить с цитированием
Старый 29.08.2013, 11:57   #4
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

A как насчет "print" и "open"?
waleri вне форума Ответить с цитированием
Старый 29.08.2013, 12:01   #5
WennY
Форумчанин
 
Регистрация: 17.01.2008
Сообщений: 236
По умолчанию

Только делит. Даже пропертис не открывает

Последний раз редактировалось WennY; 29.08.2013 в 12:08.
WennY вне форума Ответить с цитированием
Старый 29.08.2013, 12:08   #6
WennY
Форумчанин
 
Регистрация: 17.01.2008
Сообщений: 236
По умолчанию

Вру, принт срабатывает. Опен - нет. Дефолтные команды более-менее, а вот как мне мой пункт активировать?
WennY вне форума Ответить с цитированием
Старый 29.08.2013, 13:17   #7
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Цитата:
Сообщение от WennY Посмотреть сообщение
а вот как мне мой пункт активировать?
А я знаю? В принципе на каждый тип файла (или на все) в реестре прописываются глаголы и что они делают - смотрите там.
waleri вне форума Ответить с цитированием
Старый 29.08.2013, 13:44   #8
WennY
Форумчанин
 
Регистрация: 17.01.2008
Сообщений: 236
По умолчанию

Дллки свои инжектят, что. Мне какая польза от этой инфы?

Последний раз редактировалось WennY; 29.08.2013 в 14:09.
WennY вне форума Ответить с цитированием
Старый 29.08.2013, 15:41   #9
asmprog
Пользователь
 
Регистрация: 10.08.2013
Сообщений: 67
По умолчанию

1. в место CoInitializeEx - лучше использовать OleInitialize(NULL) - тогда появятся пункты, которые иначе скрыты(анлокер в том числе)
2. чтобы получить имя команды, которая как раз и используется в cmd.lpVerb можно использовать(после TrackPopupMenu):
Код:
char szBuf[MAX_PATH+1];
...
if( SUCCEEDED(mnu->GetCommandString(nCmd - 1,GCS_VERBA,NULL,szBuf,MAX_PATH-1)) )
{
    cout<<szBuf<<endl;
}
3. имя команды не всегда может использоваться(вот Unlocker не использует), тогда можно тем же самым mnu->GetCommandString с GCS_HELPTEXTA, перебирая итемы меню, найти строку "Unlocker", запомнить (nCmd - 1), которое потом использовать в cmd.lpVerb = MAKEINTRESOURCEA(nCmd - 1);

4. я давал ссылку - там в какой-то части есть работа с IContextMenu2,3(после получения mnu):
Код:
mnu->QueryInterface(IID_IContextMenu2,(void**)&g_pcm2);
mnu->QueryInterface(IID_IContextMenu3,(void**)&g_pcm3);
в WndProc:
Код:
	if(g_pcm3 != NULL)
	{
		if( SUCCEEDED( g_pcm3->HandleMenuMsg2(uMsg,wParam,lParam,&ret) ) )
			return ret;
	}

	if(g_pcm2 != NULL)
	{
		if( SUCCEEDED( g_pcm2->HandleMenuMsg(uMsg,wParam,lParam) ) )
			return 0;
	}
asmprog вне форума Ответить с цитированием
Старый 29.08.2013, 16:09   #10
WennY
Форумчанин
 
Регистрация: 17.01.2008
Сообщений: 236
По умолчанию

Цитата:
Сообщение от asmprog Посмотреть сообщение
2. чтобы получить имя команды, которая как раз и используется в cmd.lpVerb можно использовать(после TrackPopupMenu):
Код:
char szBuf[MAX_PATH+1];
...
if( SUCCEEDED(mnu->GetCommandString(nCmd - 1,GCS_VERBA,NULL,szBuf,MAX_PATH-1)) )
{
    cout<<szBuf<<endl;
}
У меня на этом месте вообще крашится, если -1, хотя nCmd = 0. И вообще, почему -1?
WennY вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Передача параметров в программу и контекстное меню проводника Ragnarek Общие вопросы Delphi 19 21.03.2012 13:22
Прогу в меню проводника =) м? xrob Общие вопросы Delphi 1 10.03.2012 18:50
Встроить программу в контекстное меню проводника _-Re@l-_ Общие вопросы Delphi 3 04.08.2011 19:24
И сново sendMessage =) Как нажать пункт верхнего меню и меню правой кнопки? TwiX Win Api 9 15.10.2009 01:57
Встраивание в контекстное меню проводника Никки Общие вопросы Delphi 3 25.06.2008 23:17