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

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

21.06.2013, 20:55. Показов 5131. Ответов 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
6101 / 4957 / 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
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Ниже машинный перевод статьи The Thinkpad X220 Tablet is the best budget school laptop period . Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы,. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru