Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# .NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.68/69: Рейтинг темы: голосов - 69, средняя оценка - 4.68
hitmen047
Местный Ёжидзе
42 / 42 / 4
Регистрация: 03.03.2010
Сообщений: 225
1

Как ассоциировать расширение со своим приложением и открыть файл своей программой

07.10.2010, 20:15. Просмотров 13218. Ответов 15
Метки нет (Все метки)

На последней стадии реализации своей программы задался вопросом. А как сделать так, что бы при открытии определённого файла, он открывался бы в программе?
Суть в том, что делаю Music Player и хотелось бы сделать так, что бы когда открываю музыкальный файл из проводника, он открывался бы программой и воспроизводился. Никто не знает ли как реализовать это?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.10.2010, 20:15
Ответы с готовыми решениями:

Как создать свой тип файлов и ассоциировать его со своим приложением
Например, AutoCAD .dwg и т.п. Заранее спасибо)

Открыть файл связанным приложением (расширение на этапе компиляции не известно)
Привет! как сделать в C# открытие файла связанным с ним приложением? Также, как это сделано в...

Как ассоциировать аудиофайлы со своим аудиопроигрывателем
Написала плеер на с# WPF. Все работает. Но, как известно, нет предела совершенству. Вот какой...

Как создать собственный формат файлов и ассоциировать их со своим приложением
Сделал программу: "оболочка электронного учебника с тестами". Сами данные электронных учебников...

Ассоциировать определенный тип файлов со своим приложением
В моей программы создается файл с расширением ".bsct". В программе так же можно с помощью...

15
Konctantin
942 / 745 / 172
Регистрация: 12.04.2009
Сообщений: 1,700
07.10.2010, 20:26 2
Лучший ответ Сообщение было отмечено как решение

Решение

Пользуйтесь поиском, уже была недавно данная тема:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
using System.Runtime.InteropServices;
using System.Text;
using System.Windows.Forms;
using Microsoft.Win32;
using System;
 
namespace PacketViewer
{
    public class FileAssociation
    {
        private const string FILE_EXTENSION   = ".pkt";
        private const long SHCNE_ASSOCCHANGED = 0x8000000L;
        private const uint SHCNF_IDLIST       = 0x0U;
 
        public static void Associate(string description, string icon)
        {
            Registry.ClassesRoot.CreateSubKey(FILE_EXTENSION).SetValue("", Application.ProductName);
 
            if (Application.ProductName != null && Application.ProductName.Length > 0)
            {
                using (RegistryKey key = Registry.ClassesRoot.CreateSubKey(Application.ProductName))
                {
                    if (description != null)
                        key.SetValue("", description);
                        
                    if (icon != null)
                        key.CreateSubKey("DefaultIcon").SetValue("", ToShortPathName(icon));
 
                    key.CreateSubKey(@"Shell\Open\Command").SetValue("", ToShortPathName(Application.ExecutablePath) + " \"%1\"");
                }
            }
 
            SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, IntPtr.Zero, IntPtr.Zero);
        }
 
        public static bool IsAssociated
        {
            get { return (Registry.ClassesRoot.OpenSubKey(FILE_EXTENSION, false) != null); }
        }
 
        public static void Remove()
        {
            Registry.ClassesRoot.DeleteSubKeyTree(FILE_EXTENSION);
            Registry.ClassesRoot.DeleteSubKeyTree(Application.ProductName);
        }
        
        [DllImport("shell32.dll", SetLastError = true)]
        private static extern void SHChangeNotify(long wEventId, uint uFlags, IntPtr dwItem1, IntPtr dwItem2);
 
        [DllImport("Kernel32.dll")]
        private static extern uint GetShortPathName(string lpszLongPath, [Out]StringBuilder lpszShortPath, uint cchBuffer);
 
        private static string ToShortPathName(string longName)
        {
            StringBuilder s = new StringBuilder(1000);
            uint iSize = (uint)s.Capacity;
            uint iRet = GetShortPathName(longName, s, iSize);
            return s.ToString();
        }
    }
}
8
hitmen047
Местный Ёжидзе
42 / 42 / 4
Регистрация: 03.03.2010
Сообщений: 225
08.10.2010, 15:13  [ТС] 3
Konctantin, Одно НО, сам принцип не понятен
Найти-то эту тему находил, но вот только программа не запускает файл при двойном нажатии.

Просто хотелось бы добиться результата подобно тому, когда открываешь mp3 файл, то программа начала его воспроизводить.
0
_Sergei_
60 / 59 / 10
Регистрация: 11.08.2010
Сообщений: 199
08.10.2010, 16:19 4
Я так понимаю вы хотите задать ассоциацию музыкальных файлов с вашей программой?
Можете здесь посмотреть, но это фактически то что вам уже дали, на CodeProject'e есть проект для управления ассоциациями файлов
А программа может не запускать файл потому что она не может получить путь к этому файлу, убедитесь, что при двойному клику в проводнике в программу передается правильный путь
1
hitmen047
Местный Ёжидзе
42 / 42 / 4
Регистрация: 03.03.2010
Сообщений: 225
08.10.2010, 17:33  [ТС] 5
Небольшая отрасль от основного вопроса теперь появилась, мини-вопрос. А как получить путь к файлу, который выбрали в проводнике и передать его в программу в виде переменной?

P.S. Где-то уже видел тут, на форуме, но поиск не дал ничего, руки видимо кривые у меня сегодня.
0
Konctantin
942 / 745 / 172
Регистрация: 12.04.2009
Сообщений: 1,700
08.10.2010, 19:24 6
о, так вы вообще ничего не поняли, чтобы ассоциировать - необходимо внести данные в реестр, что именно и делает этот класс.

что там может быть не понятного?
первая функция: Associate(string description, string icon) - ассоциирует файлы
второе свойство: IsAssociated - проверяет, ассоциированы ли файлы
третья функция: Remove() - удаляет ассоциацию файлов.

что при двойному клику в проводнике в программу передается правильный путь
какой правильный путь? вы о чем?

ЗЫ. Чтобы все это работали, надо подключить код и вызывать его при старте к примеру.
0
hitmen047
Местный Ёжидзе
42 / 42 / 4
Регистрация: 03.03.2010
Сообщений: 225
08.10.2010, 22:37  [ТС] 7
Konctantin, Эээ... Просто ассоциация файлов мне не нужна была) Я малость о другом спрашивал) О чтении файла программой, если открывать файл из проводника, а не файл из программы.
0
EatingPeopleIsFun
67 / 66 / 10
Регистрация: 14.06.2009
Сообщений: 310
Записей в блоге: 1
09.10.2010, 04:52 8
если ты ассоциируешь файл с твоей программой, то и получишь то, что тебе надо, при открытии из проводника, файл будет воспроизводиться через твою программу
0
Konctantin
942 / 745 / 172
Регистрация: 12.04.2009
Сообщений: 1,700
09.10.2010, 10:57 9
Konctantin, Эээ... Просто ассоциация файлов мне не нужна была) Я малость о другом спрашивал)
В таком случае учимся излагать мысли...

Я еще могу подозревать, что вы пытаетесь интегрировать свой пункт в контекстное меню проводника, но это уже другой вопрос.
0
planar
86 / 85 / 13
Регистрация: 28.09.2010
Сообщений: 262
09.10.2010, 13:10 10
Лучший ответ Сообщение было отмечено как решение

Решение

Человек, видимо, просто не знает, что проводник при щелчке по ассоциированному файлу вызывает программу, а полное имя файла передает в командной строке.
Программа начинается с функции
C#
1
private static void Main(string[] args)
args[1] как раз и будет именем передаваемого файла.
7
hitmen047
Местный Ёжидзе
42 / 42 / 4
Регистрация: 03.03.2010
Сообщений: 225
09.10.2010, 21:46  [ТС] 11
planar, Спасибо
Только ты меня понял и выручил. Держи +
1
Konctantin
09.10.2010, 21:52
  #12

Не по теме:

ОМГ, вот так да, расписал по одному, а оказывается надо совсем не то О_о

0
hitmen047
Местный Ёжидзе
42 / 42 / 4
Регистрация: 03.03.2010
Сообщений: 225
09.10.2010, 21:57  [ТС] 13
Konctantin, Ничего, бывает Главное, что пытались помочь и в итоге помогли))
0
Progr_mmer
0 / 0 / 2
Регистрация: 12.06.2015
Сообщений: 52
16.05.2016, 16:48 14
Делал как Вы описали, но выдает ошибку:

Помощник отладки управляемого кода "PInvokeStackImbalance" обнаружил неполадку в "E:\Work\Test\Test\bin\Debug\Test.vshost.exe".

Дополнительные сведения: Вызов функции PInvoke "Test!Test.AssociateFile::SHChangeNotify" разбалансировал стек. Вероятно, это вызвано тем, что управляемая сигнатура PInvoke не совпадает с неуправляемой целевой сигнатурой. Убедитесь, что соглашение о вызовах и параметры сигнатуры PInvoke совпадают с неуправляемой целевой сигнатурой.

Никак не могу понять в чем проблема, помогите пожалуйста
0
Someone007
2767 / 2098 / 951
Регистрация: 09.05.2015
Сообщений: 5,205
Завершенные тесты: 1
16.05.2016, 17:01 15
Там неправильная сигнатура метода, первый аргумент если не ошибаюсь должен быть int, а не long (в С++ long 4 байта, а в C# 8 байт, из-за этого проблема). А если не поможет, то еще явно укажите calling convention.
0
OwenGlendower
Супер-модератор
Эксперт .NET
10450 / 8996 / 3843
Регистрация: 17.03.2014
Сообщений: 18,073
Записей в блоге: 1
16.05.2016, 17:07 16
Progr_mmer, сделай в примере от Konctantin следующие изменения:
C#
1
2
/* строка №12 */ private const int SHCNE_ASSOCCHANGED = 0x8000000;
/* строка №48 */ private static extern void SHChangeNotify(int wEventId, uint uFlags, IntPtr dwItem1, IntPtr dwItem2);
1
16.05.2016, 17:07
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.05.2016, 17:07

Открыть файл своей программой
Здравствуйте! Подскажите пожалуйста, как получить пусть к файлу, через который была открыта...

Ассоциировать расширение со своим приложением
Создал текстовый редактор, но сохраняет он файл в "моем" расширении. При клике на файл загружается...

Открыть файл своей программой
Здравствуйте! Открываю файл к примеру text.txt с помощью своей программы, но в richtextbox значение...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru