Поиск на сайте
Главная Журнал Форум Wiki DRKB Страны мира

Ассоциирование файлов в VB.NET

Рано или поздно у любого разработчика программного обеспечения появляется необходимость сделать так, чтобы при открытии файла с определённым расширением запускалось его приложение. Сделать это довольно легко - достаточно отредактировать всего два ключа в реестре.

Как происходит процесс ассоциирования?

В реестре хранятся все типы файлов, с которыми связаны определённые приложения. Чтобы убедиться в этом откройте редактор реестра ( Пуск -> Выполнить -> Набираем 'regedit' -> жмём Ok ). Теперь раскройте ветвь HKEY_CLASSES_ROOT - это и есть все известные Вашему компьютеру расширения. Прокрутите вниз до .txt и кликните на нём. Теперь посмотрите на (По умолчанию), возможно оно будет иметь значение 'txtfile'. Ещё прокрутите вниз по дереву слева и найдите ноду txtfile. Она будет содержать всю необходимую информацию о любом расширении файла в дефолтовом значении которого указано txtfile. Например, если все файлы в системе с расширением .txt открываются Блокнотом, то значение по умолчанию будет равно "%SystemRoot%\system32\NOTEPAD.EXE %1". %SystemRoot% - это универсальная системная переменная, хранящая путь к системной папке Windows. %1 - аргументы командной строки, передаваемые программе в момент открытия текстового файла. В нашем случае %1 заменяется на путь к текстовому файлу.

Шаг 1: Запуск приложения при открытии файла с расширением .hello

Первым шагом надо заставить запускаться наше приложение при двойном клике по файлу (например с расширением .mp3 ) в Проводнике. В этой статье возьмём расширение, заведомо не существующее в системе: .hello . Создаём новый проект и называем его "Hello World". Идея такова, что при клике на файл .hello будет запускать наше приложение и показывать диалоговое окошко с надписью: "Hello, (содердимое файла) World". Если же просто запустить программу, то она должна будет ассоциировать себя с расширением .hello . Поэтому первый раз надо будет просто запустить приложение.

Итак, для внесения необходимых данных в реестр, добавим следующий код:

My.Computer.Registry.ClassesRoot.CreateSubKey(".hello").SetValue_
	("", "Hello", Microsoft.Win32.RegistryValueKind.String)
My.Computer.Registry.ClassesRoot.CreateSubKey_
	("Hello\shell\open\command").SetValue("", Application.ExecutablePath & _
	" ""%l"" ", Microsoft.Win32.RegistryValueKind.String)

Ниже приведены методы объекта My.Computer.Registry (или в MSDN):

Код Что делает
CreateSubKey(".hello") Создаёт ключ реестра в ветке ClassesRoot для расширения .hello.
.SetValue("", "Hello"...
  1. "" (Или Nothing) устанавливает значение ключа По умолчанию.
  2. "Hello" наподобие "txtfile" указывает в каком ключе реестра будет хранится информация для расширения .hello.
CreateSubKey("Hello" & _ "\shell\open\command") Создаёт под-ключ "Hello" и присваивает ему значение "store\open\command" - путь к приложению, которое будет запускаться при клике на файлы с этим расширением.
.SetValue("", Application.ExecutablePath & _ " ""%l"" ",...
  1. "" - значение по умолчанию.
  2. Application.ExecutablePath - путь к текущему запущенному процессу.
  3. " ""%1"" " - путь открываемого файла будет передан приложению в командной строке. Кавычки необязательны, но если Вам понадобится несколько аргументов, то необходимо каждый заключить в кавычки.

Теперь если запустить приложение один раз, то оно отредактирует реестр и станет ассоциировано с файлами .hello .

Теперь, предположим, Вы связываете свою программу с текстовыми файлами .txt, однако они продолжают открываться в Блокноте. Чтобы исправить это недоразумение, необходимо удалить одно значение, находящееся по адресу:

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.txt

Значение 'Progid' содердит строковое значение с идентификатором приложения, открываемого по умолчанию для данного расширения. Если это значение присутствует, то Вы не сможете ничего связать со своей программой. Поэтому необходимо удалить значение 'Progid', чтобы ассоциирование состоялось.

Теперь откройте Блокнот, напишите в нём что-нибудь и сохраните как файл с расширением .hello (Убедитесь, что случайно не сохранили его как .hello.txt). Откройте сохранённый файл в Проводнике, ВУАЛЯ! Программа запустилась, но ничего не произошло ...

Шаг 2: Чтение содержимого файла

Если предыдущие действия сделаны правильно, то путь к открываемому файлу передаётся как аргумент в командной строке (наподобие параметра при вызове функции). Для получения аргументов используется My.Application.CommandlineArgs, которая возвращает ReadOnlyCollection(Of String ). В нашем случае для получения пути к файлу можно использовать вызов My.Application.CommandlineArgs(0).

Ниже приведён код, считывающий содержимое файла. Помещаем его в событие Load:

  msgbox("Hello, " & My.Computer.FileSystem.ReadAllText_
	(My.Application.CommandlineArgs(0)) & " World!")

Скачать демо-проект - 42 кб




Основные разделы сайта


 

Реклама Правильно выбранная букмекерская контора принесет не только удовольствие от игры