Модераторы: feodorv, GremlinProg, xvr, Fixin

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Добавить пункт в контекстное меню проводника. 
:(
    Опции темы
Andrey44
Дата 17.11.2008, 12:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: 8
Всего: 26



Вот в этом и вопрос.
Как добавить пункт в контекстное меню проводника.
И потом, как передать моей проге выделенные файлы.


--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
Alca
Дата 17.11.2008, 16:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 5
Всего: 50



Код

C:\Documents and Settings\Admin\SendTo



--------------------
PM WWW ICQ Skype Jabber   Вверх
Andrey44
Дата 18.11.2008, 08:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: 8
Всего: 26



Alca, Видимо не так меня поняли.
Для ясности приатачу картинкуuser posted image
Вот, мне надо создать пункт в меню, для проигрывания файлов. В смысле открыть с помощью моей проги.
И как в моей проге обрабатывать имена файлов которые пришли.

Это сообщение отредактировал(а) Andrey44 - 18.11.2008, 08:26


--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
Alca
Дата 18.11.2008, 10:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 5
Всего: 50



Открывать .NFO файлы в блокноте-Работает.reg
Код

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.nfo] 
"Application"="NOTEPAD.EXE" 
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.nfo\OpenWithList] 
"a"="Explorer.exe" 
"MRUList"="ba" 
"b"="NOTEPAD.EXE" 
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.nfo\OpenWithProgids] 
"MSInfo.Document"=hex(0):


Открывать неизвестные файлы Блокнотом.reg
Код

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Unknown\shell]
@="Notepad"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Unknown\shell\Notepad\Command]
@="notepad.exe %1"



Это сообщение отредактировал(а) Alca - 18.11.2008, 10:18


--------------------
PM WWW ICQ Skype Jabber   Вверх
Andrey44
Дата 18.11.2008, 11:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: 8
Всего: 26



Alca, Хорошо, спасибо.
Допустим я добавлю в реестр ключи.
Появится дополнительный пункт в меню.
Следующий вопрос, какое сообщение ловить для того что-бы узнать какие файлы мне передают?


--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
jonie
Дата 18.11.2008, 21:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 7
Всего: 118



аргументы запуска вашей программы посмотреть


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Alca
Дата 18.11.2008, 22:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 5
Всего: 50



Код

int main(int argc, char *argv[]) {
    if (NULL == argv[1] || '\0' == argv[1][0]) {
        return 0;
    }
    std::string sFilePath(argv[1]);    
    MessageBox(0, sFilePath.c_str(), "", MB_OK);
    //...
    return 1;
}


Это сообщение отредактировал(а) Alca - 18.11.2008, 22:06


--------------------
PM WWW ICQ Skype Jabber   Вверх
586
Дата 18.11.2008, 22:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 39
Всего: 146



Цитата(Alca @  18.11.2008,  22:05 Найти цитируемый пост)
if (NULL == argv[1] || '\0' == argv[1][0]) {

Количество аргументов лучше определять по argc.
Код
#include <windows.h>

int main(/*int argc, char *argv[]*/)
{
    if(__argc > 1)
        MessageBox(0, __argv[1], "", MB_OK);

    return 0;
}


Это сообщение отредактировал(а) 586 - 18.11.2008, 23:22
PM   Вверх
Andrey44
Дата 19.11.2008, 08:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: 8
Всего: 26



Вопрос 1: 
Код

int APIENTRY _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,//вот сюда приходит строка с путями файлов?
                     int       nCmdShow)

Как тогда узнать кол-во переданых файлов т.е. путей к ним?

Вопрос 2:
Если моя программа запущена как быть тогда?
Нет например такого сообщения, например - WM_CMDMESSAGE ?


--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
Alca
Дата 19.11.2008, 09:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 5
Всего: 50



Код

LPTSTR    lpCmdLine,//вот сюда приходит строка с путями файлов?

Да.


--------------------
PM WWW ICQ Skype Jabber   Вверх
jonie
Дата 19.11.2008, 10:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 7
Всего: 118



Цитата

Вопрос 2:
Если моя программа запущена как быть тогда?
Нет например такого сообщения, например - WM_CMDMESSAGE ?
нужно при запуске узнать, есть ли еще экземпляр вашего приложения (обычно это делается используя семафоры\мютексы\именованые евенты), найти "отвественное" окно вашего приложения и послать ему, предварительно зарегистрированное через RegisterMessage (или использовать менее хитрую комбинацию WM_USER+XXX) сообщение с коммандной строкой, переданной запускаемому. После чего завершить запускаемое приложение.

Добавлено через 2 минуты и 11 секунд
Цитата

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


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Andrey44
Дата 19.11.2008, 11:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: 8
Всего: 26



Alca, делаю так:
Цитата

Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.mp3] 
"Application"="D:\Projects\MyProg\debug\MyProg.exe" 
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.mp3\OpenWithList] 
"a"="Explorer.exe" 
"MRUList"="ba" 
"b"="D:\Projects\MyProg\debug\MyProg.exe" 
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.mp3\OpenWithProgids] 
"MSInfo.Document"=hex(0):

И ничего не выходит smile

Добавлено через 7 минут и 58 секунд
Цитата(jonie @  19.11.2008,  10:49 Найти цитируемый пост)
пропарсить "большую" коммандную строку, что к вам пришла в  lpCmdLine..

Спасибо. Это особого труда не вызовет.

А вот с посылкой сообщения придется подумать. smile 


И с добавлением своего пункта в меню что-то не выходит.



--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
Alca
Дата 19.11.2008, 11:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 5
Всего: 50



Код

"MSInfo.Document"=hex(0):

Здесь чего-то надо заменить...
Пример с файлами .NFO у меня работает (Windows 2003 Server R2)  smile 
Тока без менюшки. Т.е. это просто твой файл (test.nfo) ассоциируется с каким-либо расширением (.nfo).

Это сообщение отредактировал(а) Alca - 19.11.2008, 11:17


--------------------
PM WWW ICQ Skype Jabber   Вверх
Andrey44
Дата 19.11.2008, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: 8
Всего: 26



Так кто подскажет как добавить свой пункт в контекстное меню проводника smile 
Открыть с помощью smile

Добавлено через 1 минуту и 29 секунд
Ну может кто статейку покажет нормальную?


--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
Alca
Дата 19.11.2008, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 5
Всего: 50



 smile 

Присоединённый файл ( Кол-во скачиваний: 30 )
Присоединённый файл  Regedit.JPG 293,49 Kb


--------------------
PM WWW ICQ Skype Jabber   Вверх
Andrey44
Дата 19.11.2008, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: 8
Всего: 26



Alca, картинка  не помогает.
Ну направте в нужную сторону.


--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
Alca
Дата 19.11.2008, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 5
Всего: 50



Добавить пункт в контекстное меню Windows
ишо:
Цитата

http://fegrad.su/Pages-view-622.html
Контекстное меню файлов и папок 
Если Вы хотите чтобы вы могли открыть какой-либо прогой любой файл из контекстного меню, то это прописывается здесь

[HKEY_CLASSES_ROOT*shellЭто будет в контекстном менюcommand]
@="Путь_к_программе %1"

Можно сделать так, чтобы пункт "Открыть с помощью..." всегда появлялся в контекстном меню. Для этого найдем ключ HKEY_CLASSES_ROOT* и создадим в нем раздел shell (если его нет). Здесь создадим еще раздел "openas", а в нем еще "command". Измените значение "По умолчанию" на "C:WINDOWS undll32.exe shell32.dll,OpenAs_RunDLL %1" (путь к файлу подредактируйте при необходимости). 



Когда вы запускаете файл, ассоциированный с каким-то приложением в Windows, то файл открывается именно в этом приложении. А как быть, если вам надо открыть этот файл в другом приложении? С WinNT/2000/XP все понятно: там в контекстном меню файлов всегда присутствует пункт "Открыть с помощью...". В Win9х этого пункта изначально нет, но если выделить нужный файл и, удерживая Shift, щелкнуть правой кнопкой мыши по нему, то в контекстном меню появится дополнительный пункт "Открыть с помощью...". Таким образом удобно как переассоциировать открытие файлов на другое приложение (без копания в реестре и разных диалогах), так и использовать это для какого-то конкретного случая. 



Как связать несколько приложений с одним расширением файла.
Например, документ в формате Microsoft Word for Windows (расширение .doc) можно открывать как с помощью MS Word, так и с WordPad. Для этого:
1. Откройте окно "Мой компьютер".
2. В меню "Вид" выберите пункт "Свойства папки".
3. Выберите закладку "Типы файлов".
4. В списке "Зарегистрированные типы файлов" выберите "Документ Microsoft Word".
5. Нажмите на кнопку "Изменить".
6. Нажмите на кнопку "Добавить".
7. В строке "Действие" введите:
Открыть в WordPad
8. В строке "Приложение, исполняющее действие" введите:
"{path}wordpad.exe" "%1"
где {path} - полный путь к файлу Wordpad.exe. В этой строке кавычки обязательны.
9. Нажмите кнопку "OK".
Если после этого вы дважды щёлкните левой кнопкой мыши на файле с расширением .doc, то документ откроется программой Microsoft Word. Если вы щёлкните правой кнопкой мыши на файле такого типа, то из появившегося меню сможете выбрать пункт "Открыть в WordPad". 



Запуск программы из меню корзины
Для добавления программы в меню корзины(щелкните правой кнопкой мыши по иконке корзины) нужно сделать следующие:
- Откройте ветвь реестра "HKEY_CLASSES_ROOTCLSID{645FF040-5081-101B-9F08-00AA002F954E}Shell"
- Создайте в ней раздел с вашем именем
- В новом разделе создайте еще один с названием "Command"
- В параметре по умолчанию задайте путь к файлу который вы хотите открыть. 



Для быстрой чистки дисков, воспользуйтесь этим советом.
В реестре Windows HKEY_CLASSES_ROOTDriveshell создать раздел типа CleanDisk, в нем создать раздел (command), в параметре "По умолчанию", которого прописать:
C:WINDOWScleanmgr.exe /d %1
Теперь нажав правой кнопкой мыши на каком-либо диске можно выбрать команду CleanDisk.



Это сообщение отредактировал(а) Alca - 19.11.2008, 16:19


--------------------
PM WWW ICQ Skype Jabber   Вверх
Alca
Дата 8.12.2008, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 5
Всего: 50



Создание нового расширения файлов, Регистрация и ассоциация своей программы с новым 
Код

TRegistry *Reg = new TRegistry();

 Reg->RootKey = HKEY_CLASSES_ROOT;
 try
 {
    Reg->OpenKey(".my",true);
    Reg->WriteString("","myfile"); //"развернутое" описание
Reg->CloseKey();
Reg->OpenKey("myfile\\DefaultIcon",true);
Reg->WriteString("",ParamStr(0)+",0");
//рег-м значение пиктограммы, т. "Имя приложения, 0"
Reg->CloseKey();
Reg->OpenKey("myfile\\Shell\\Open\\Command", true);
Reg->WriteString("", ParamStr(0)+' '+'"'+"%1"+'"');
//это значит, что призапуске
//в приложение передается имя файла("%1" - вот именно
//вот это озачает..)
//т.е. в реестре будет иметь вид
//"c:\MyDir\MyProg.exe %1"
Reg->CloseKey();
}
 __finally
   {
     Reg->Free();
   } 


Этим зарегистрировали.
Код

int i;
AnsiString s;

if (ParamCount > 0)
   {
     for (i = 1; i<=ParamCount(); i++)
     {
       s = s+ParamStr(i)+' ';
       Memo1->Lines->LoadFromFile(s);
       Caption = "Куррент File из:"+s;
     }
   } 

А этот код должен отработать при загрузке приложения, т.е. либо это WinMain функция, или TForm->Create() событие... Но можно хоть в кнопке прописать. Все-равно в приложение переданы параметры.


--------------------
PM WWW ICQ Skype Jabber   Вверх
Andrey44
Дата 9.12.2008, 08:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: 8
Всего: 26



Alca, спасибо за участие, буду пробовать. smile 


--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
Alca
Дата 12.12.2008, 11:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 5
Всего: 50



ContextEdit 1.2.zip

Присоединённый файл ( Кол-во скачиваний: 41 )
Присоединённый файл  ContextEdit_1.2.zip 487,26 Kb


--------------------
PM WWW ICQ Skype Jabber   Вверх
Alca
Дата 12.12.2008, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 5
Всего: 50



Как зарегистрировать свой пункт в меню для моего типа файлов


Автор: http://www.swissdelphicenter.ch 
uses
  Registry;

Код

procedure AddFileMenue(FilePrefix, Menue, Command: string);
var
  reg: TRegistry;
  typ: string;
begin
  reg := TRegistry.Create;
  with reg do
  begin
    RootKey := HKEY_CLASSES_ROOT;
    OpenKey('.' + FilePrefix, True);
    typ := ReadString('');
    if typ = '' then
    begin
      typ := Fileprefix + 'file';
      WriteString('', typ);
    end;
    CloseKey;
    OpenKey(typ + '\shell\' + Menue + '\command', True);
    WriteString('', command + ' "%1"');
    CloseKey;
    Free;
  end;
end;

procedure DeleteFileMenue(Fileprefix, Menue: string);
var
  reg: TRegistry;
  typ: string;
begin
  reg := TRegistry.Create;
  with reg do
  begin
    RootKey := HKEY_CLASSES_ROOT;
    OpenKey('.' + Fileprefix, True);
    typ := ReadString('');
    CloseKey;
    OpenKey(typ + '\shell', True);
    DeleteKey(Menue);
    CloseKey;
    Free;
  end;
end;

{ Example / Beispiel:}

procedure TForm1.Button1Click(Sender: TObject);
begin
  { Register the Menuepoint: }

  AddFileMenue('rtf', 'Edit with Notepad', 'C:\Windows\system\notepad.exe');

  {
    If you now click with the right mousebutton on a *.rtf-file then
    you can see a Menuepoint: "Edit with Notepad".
    When Click on that point Notepad opens the file.

    Wenn man nun mit der rechten Maustaste im Explorer auf eine *.rtf-Datei Clickt,
    dann erscheint dort der Menuepunkt "Edit with Notepad".
    Beim Clicken darauf, цffnet Notepad diese Datei.
  }
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  {
   Unregister the Menuepoint / Undo your changes in the Registry:
   Lцscht den Menuepunkt wieder aus der Registry:
  }

  DeleteFileMenue('rtf', 'Edit with Notepad');
end;



--------------------
PM WWW ICQ Skype Jabber   Вверх
Ilfirin
Дата 20.9.2010, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Strider



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 7.10.2008
Где: Surreal world

Репутация: нет
Всего: нет



А если надо обработать несколько файлов? 
в paramstr приходит по 1 файлу.
PM ICQ   Вверх
zark
Дата 26.1.2011, 18:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 12.3.2010

Репутация: нет
Всего: нет



Цитата(Ilfirin @ 20.9.2010,  15:50)
А если надо обработать несколько файлов? 
в paramstr приходит по 1 файлу.

Вот вот, и мне интересно как быть в таком случае.
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0704 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.