Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/26: Рейтинг темы: голосов - 26, средняя оценка - 4.54
 Аватар для pavver
10 / 10 / 0
Регистрация: 23.04.2012
Сообщений: 42
.NET 4.x

Запрет запуска нескольких экземпляров приложения, с передачей данных

21.06.2013, 20:55. Показов 5162. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
вообщем моя проблема заключается в следующем:
Я пишу музыкальный проигрыватель, столкнулся с проблемой, когда кликаю два раз по mp3 он открывается моим проигрывателем, если я два раза кликну по еще какому то mp3 то проигрыватель запускаеться еще раз, соответственно будет воспроизводиться 2 файла одновременно, мне надо чтоб файл добавлялся в плейлист в уже запущенном проигрывателе.....
тоэсть мне надо при запуске программы
1) проверить, нет ли уже запущенной копии программы(увы я не знаю как)
2) если программа запущена то передать ей 1 строковый параметр, то есть путь к файлу (я вообще не имею представления как реализовать подобное)

буду рад любым советами любой литературе
 Комментарий модератора 
Запрещено дублировать темы в одном или нескольких разделах!
Темы объединены.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.06.2013, 20:55
Ответы с готовыми решениями:

Registering an Application to a URI Scheme. Запрет запуска нескольких копий приложения
Ребят есть проблема, сделал всё как тут сказано...

Запрет на запуск других экземпляров запущенного приложения
здравствуйте Как заставить мое приложение, чтобы открыть только один ехе? ну например когда я запускаю Project.exe втарой раз не...

Программный запуск в потоке нескольких экземпляров приложения
Есть главное окно программы с некоторым набором элементов.Подскажите как, например по нажатию кнопки, запустить в потоке такое же окно. Я...

6
[Bicycle Reinventor]
 Аватар для Exerion
332 / 270 / 109
Регистрация: 19.10.2011
Сообщений: 668
Записей в блоге: 2
21.06.2013, 22:26
Получаете список процессов и просматриваете его на наличие второй работающей копии:
C#
1
2
using System.Diagnostics;
Process[] processes = Process.GetProcesses();
А как вы передаёте путь к файлу при запуске через даблклик по mp3?

Добавлено через 42 минуты
Сам выяснил, что через args[0]...
Честно говоря, мне самому интересно, как положено реализовывать подобную вещь. Так что буду ждать ответа от знающих людей.
А пока могу предложить костыль - при запуске второй копии она через тот же Process добирается до параметров первой копии и изменяет её args[0] на новый адрес. После чего закрывается.
В первой копии работает поток-наблюдатель, который проверяет args[0] на изменения. Если обнаружено изменение - загружает новый файл для воспроизведения.
Как-то так.
0
 Аватар для Anklav
447 / 305 / 47
Регистрация: 23.01.2013
Сообщений: 661
21.06.2013, 22:31
С помощью процессов отыскиваете процесс с таким же именем, но имеющий другой ID, если он есть, значит посылаете сообщение главному окну найденного процесса. Для отловления сообщений нужно переопределить метод в классе формы WndProc.

Сообщение для оправки в классе Program, его сложно не заметить.
Полученное сообщение устанавливается в заголовок формы.

Код:
Статический класс для отправки сообщений.
Кликните здесь для просмотра всего текста
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
class Helper
    {
        [DllImport("User32.dll")]
        private static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, ref COPYDATASTRUCT lParam);
 
        public const int WM_COPYDATA = 0x4A;
 
        public struct COPYDATASTRUCT
        {
            public IntPtr dwData;
            public int cbData;
            public IntPtr lpData;
        }
 
        public static int SendWindowsStringMessage(IntPtr hWnd, string message)
        {
            int result = 0;
 
            if (hWnd != IntPtr.Zero)
            {
                COPYDATASTRUCT lParam = new COPYDATASTRUCT();
                lParam.cbData = message.Length * Marshal.SystemDefaultCharSize;
                lParam.dwData = IntPtr.Zero;
                lParam.lpData = Marshal.StringToHGlobalAnsi(message);
                SendMessage(hWnd, WM_COPYDATA, 0, ref lParam);
                Marshal.FreeHGlobal(lParam.lpData);
            }
 
            return result;
        }
    }


Измененный класс Program
Кликните здесь для просмотра всего текста
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
static class Program
    {
        /// <summary>
        /// Главная точка входа для приложения.
        /// </summary>
        [STAThread]
        static void Main(string[] args)
        {
            Process[] Processes = Process.GetProcesses();
            Process CurrentProcess = Process.GetCurrentProcess();
 
            bool StartingApp = true;
 
            foreach (var process in Processes)
            {
                if (process.ProcessName == CurrentProcess.ProcessName && CurrentProcess.Id != process.Id)
                {
                    Helper.SendWindowsStringMessage(process.MainWindowHandle, "Сообщение для отправки");
                    StartingApp = false;
                    Application.Exit();
                }
            }
 
            if (StartingApp)
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(new Form1());
            }
        }
    }


Сама форма с переопределенным WndProc:
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        protected override void WndProc(ref Message m)
        {
            if (m.Msg == Helper.WM_COPYDATA)
            {
                Helper.COPYDATASTRUCT data = (Helper.COPYDATASTRUCT)m.GetLParam(typeof(Helper.COPYDATASTRUCT));
                Text = Marshal.PtrToStringAnsi(data.lpData);
            }
 
            base.WndProc(ref m);
        }
    }


Exerion, Windows при запуске приложения двойным кликом по файлу, передает имя файла аргументом командной строки, идущей после самого имени файла.
2
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
21.06.2013, 23:06
@pavver, 1) именованный мьютекс (мьютекс - объект ядра, поэтому это достаточное условие уникальности). При создании именованного мьютекса есть перегрузка с out bool CreatedNew. Её и используй.
2) гугли насчет межпроцессорного взаимодействия, сам не знаю, проще наверное как раз закрыть активный процесс (если он запущен) и запускать новый (если конечно у тебя плеер не грузится по 5 секунд, тогда смотри именно межпроцессорные взаимодействия - висеть на сокете, пайпы и т.д.)
3) Экземпляр пишется через буковку "э". Ворд и браузеры, как правило, имеют проверку орфографии, не игнорируй.
1
 Аватар для pavver
10 / 10 / 0
Регистрация: 23.04.2012
Сообщений: 42
21.06.2013, 23:50  [ТС]
@Anklav, большое спасибо) завтра попробую добавить это в свою программу, если что то не получиться напишу в этой теме

Добавлено через 42 минуты
не выдержал, попытался сегодня добавить, все отлично работает) большое спасибо, очень помогли
0
Заблокирован
22.06.2013, 17:31
Посмотрите в свойствах проекта, там должна быть галочка "не запускать более одной копии" или типа.
Если не найдете:
Цитата Сообщение от Psilon Посмотреть сообщение
@pavver, 1) именованный мьютекс
- самое оно.
0
 Аватар для FreedomHex
43 / 44 / 12
Регистрация: 01.09.2011
Сообщений: 213
23.06.2013, 11:28
Используйте Mutex
Mutex
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
23.06.2013, 11:28
Помогаю со студенческими работами здесь

Запрет запуска приложения
Люди помогите пожалуйста,нужно запретить запуск определенного приложения допустим *.exe(программно на с++\builder) Заранее блогодарен.

Запрет повторного запуска приложения
Добрый день! Подскажите пож-та как реализовать запрет повторного запуска приложения, если оно уже запущено на компьютере. Например...

Запрет запуска стороннего приложения
Всем привет. Есть мое приложение и есть приложение AutoCad. При открытом AutoCad сделать запрет на запуск моего приложения не сложно -...

Запрет запуска копии приложения
Как запретить запуск копии приложения? Конечно, есть идеи по созданию левого файла, который отследить запуск копии и закроет ещё, но как...

Запрет повторного запуска приложения
во время открытия приложения оно должно проверить запущена другая копия или нет, если да то выход.Одним словом что бы приложение нельзя...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru