Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/21: Рейтинг темы: голосов - 21, средняя оценка - 4.67
 Аватар для Irina3gger
0 / 0 / 0
Регистрация: 12.09.2017
Сообщений: 53

Если приложение запущено, то показать MessageBox и закрыть приложение

18.09.2017, 11:22. Показов 4387. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени. Плохо разбираюсь в с# и прощу помощи написать кусочек кода.
Мысль такая "Если приложение Form1 запущена, то показать MessageBox с сообщением и закрыть приложение"
я без понятие как правильно это реализовать, помогите пожалуйста

Добавлено через 11 минут
Я нашла решение, как сделать поставленную задачу. Но нюанс в том что программа лежит на сетевом диске, и нужно чтоб пользователи с разных компьютеров не могли одновременно запустит приложение.

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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Diagnostics;
using System.Reflection;
using System.Windows.Forms;
 
namespace WindowsFormsApplication1
{
    static class Program
    {
        /// <summary>
        /// Главная точка входа для приложения.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Process pr = RI();
            if (pr != null)
                MessageBox.Show("Приложение уже запущено!!!","Дупликат!!!");
            else
                Application.Run(new Form1());
        }
        public static Process RI()
        {
            Process current = Process.GetCurrentProcess();
            Process[] pr = Process.GetProcessesByName(current.ProcessName);
            foreach (Process i in pr)
            {
                if (i.Id != current.Id)
                {
                    if (Assembly.GetExecutingAssembly().Location.Replace("/", "\\") == current.MainModule.FileName)
                    {
                        return i;
                    }
                }
            }
            return null;
        }
    }
}
Может кто-то сталкивался, как сделать чтоб приложение не могли запустить одновременно с разных компов
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
18.09.2017, 11:22
Ответы с готовыми решениями:

Написать приложение (с использованием семафора), которое не дает закрыть любой exe файл, пока запущено
Написать приложение с использованием семафора, которое пока запущено не дает закрыть exe файл( любой). При попытке закрыть exe приложение...

Приложение крашится, если запущено не из-под VS
Всем доброго времени суток. Написал программку на Visual Studio 2013 c#, через компилятор запускается работает. Но вот без него выкидывает...

Развернуть приложение, если оно уже запущено
Нигде нету четкого кода, как сделать так, что бы, если приложение запущено, что бы его разворачивало?

14
Unnamed
 Аватар для kingzfate
160 / 158 / 81
Регистрация: 09.06.2011
Сообщений: 852
18.09.2017, 11:46
Irina3gger, А с помощью Mutex не пробовали? Или оставляйте запись в реестре или файлик с меткой, то что приложение уже запущено, если так то не давайте запускать
0
 Аватар для Irina3gger
0 / 0 / 0
Регистрация: 12.09.2017
Сообщений: 53
18.09.2017, 11:49  [ТС]
kingzfate, Дело в том что я даже не знаю как реализовать, прочитала уже много информации и в голове каша.
Как правильно использовать Mutex?
0
Unnamed
 Аватар для kingzfate
160 / 158 / 81
Регистрация: 09.06.2011
Сообщений: 852
18.09.2017, 11:55
Irina3gger, ну как то так
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
try
        {
            //Проверяем на наличие мутекса в системе
            Mutex.OpenExisting("MY_UNIQUE_MUTEX_NAME");
        }
        catch
        {
            //Если получили исключение значит такого мутекса нет, и его нужно создать
            Mutex mutex = new Mutex(true, "MY_UNIQUE_MUTEX_NAME");
            return true;
        }
        //Если исключения не было, то процесс с таким мутексом уже запущен
        return false;
    }
 
//Все это ложить еще до загрузки формы, что бы сначала проверяло на то, есть ли такой потом с таким именем
if (IsSingleInstance())
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
Но думаю такой способ не подойдет в сетевом диске, так что лучше занести какой то общий файл вроде реестра, или где то на "С", к которому обращаются все пользователи и там проверять уже. Но все же попробуйте
1
911 / 796 / 329
Регистрация: 08.02.2014
Сообщений: 2,391
18.09.2017, 11:56
Irina3gger, при запуске программы создаете рядом с exe файл, при запуске проверяете на наличие этого файла, если он есть не давать запуск программы, если нету то запускаем и создаём файл + естественно для того экземпляра приложения нужно еще сделать метку что он создал файл, и при закрытии этот файл нужно удалить
0
Unnamed
 Аватар для kingzfate
160 / 158 / 81
Регистрация: 09.06.2011
Сообщений: 852
18.09.2017, 11:57
SeIZVeIZ, надо его хотя бы прятать, такой файл и удалить просто
0
911 / 796 / 329
Регистрация: 08.02.2014
Сообщений: 2,391
18.09.2017, 12:02
kingzfate, ну с такими темпами можно и программу себе скопировать, это скорее вопрос уже к настройкам папки, и действиям из вне, файл можно и создать скрытым с атрибутом системный
0
 Аватар для Irina3gger
0 / 0 / 0
Регистрация: 12.09.2017
Сообщений: 53
18.09.2017, 12:06  [ТС]
SeIZVeIZ, А можете показать пример как реализовать эту манипуляцию с файлом
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18276 / 14199 / 5368
Регистрация: 17.03.2014
Сообщений: 28,881
Записей в блоге: 1
18.09.2017, 12:55
Irina3gger, Работа с XML в многопользовательском режиме
0
 Аватар для Irina3gger
0 / 0 / 0
Регистрация: 12.09.2017
Сообщений: 53
18.09.2017, 12:59  [ТС]
OwenGlendower, я пробовала сделать то вы посоветовали, но не работает или я делаю что-то не так
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18276 / 14199 / 5368
Регистрация: 17.03.2014
Сообщений: 28,881
Записей в блоге: 1
18.09.2017, 13:30
Irina3gger, код приведенный по ссылке нужно разместить в начале метода Main. Это было сделано? При запуске он должен создавать файл file.xml.lock рядом с exe. Проверь происходит ли это. Если нет, то попробуй указать путь следющим образом:
C#
1
lockStream = new FileStream(Path.Combine(Application.StartupPath, "file.xml.lock"), ...
0
 Аватар для Irina3gger
0 / 0 / 0
Регистрация: 12.09.2017
Сообщений: 53
18.09.2017, 13:52  [ТС]
OwenGlendower, Так? Явно что-то не так я делаю
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
    static class Program
    {
        /// <summary>
        /// Главная точка входа для приложения.
        /// </summary>
        [STAThread]
        static void Main()
 
            static class Lock
        {
            static FileStream lockStream;
 
            public static bool AcquireLock()
            {
                if (lockStream == null)
                {
                    try
                    {
                        lockStream = new FileStream("file.xml.lock", FileMode.Open, FileAccess.ReadWrite, FileShare.None, 1, FileOptions.DeleteOnClose);
                    }
                    catch
                    {
                    }
                }
                return lockStream != null;
            }
        }
 
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
    }
}
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18276 / 14199 / 5368
Регистрация: 17.03.2014
Сообщений: 28,881
Записей в блоге: 1
18.09.2017, 14:20
Irina3gger, класс Lock нужно разместить в отдельном файле. Метод Main должен выглядеть так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/// <summary>
/// Главная точка входа для приложения.
/// </summary>
[STAThread]
static void Main()
{
    if (!Lock.AcquireLock())
    {
        // Файл занят
        MessageBox.Show("Файл занят!");
        Application.Exit();
    }
 
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(new Form1());
}
P.S. С таким уровнем знаний тебе рано работать без присмотра. Неужели рядом нет более опытного коллеги которому можно задавать вопросы?
0
 Аватар для Irina3gger
0 / 0 / 0
Регистрация: 12.09.2017
Сообщений: 53
18.09.2017, 16:23  [ТС]
OwenGlendower, к сожалению нет, приходится паниковать и рвать на себе волосы, и спасибо форумам за помощь

Добавлено через 9 минут
OwenGlendower, Сделала так вы сказали, создала отдельный файл Lock.cs и положила туда код что вы присылали для блокировки и в Main сделала , то файл не создался. И оповещение о том что файл занят появляется, но при его закрытии открывается программа и все продолжает работать

Добавлено через 10 минут
OwenGlendower, использовала
C#
1
lockStream = new FileStream(Path.Combine(Application.StartupPath, "file.xml.lock"), ...
но тоже ни чего не происходит

Добавлено через 1 час 40 минут
OwenGlendower, Смогла создать файл все работает, только вот когда возникает окно что "Файл занят" если нажать ОК то все равно открывается программа как ее закрыть?
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18276 / 14199 / 5368
Регистрация: 17.03.2014
Сообщений: 28,881
Записей в блоге: 1
18.09.2017, 16:57
Цитата Сообщение от Irina3gger Посмотреть сообщение
Смогла создать файл все работает, только вот когда возникает окно что "Файл занят" если нажать ОК то все равно открывается программа как ее закрыть?
Замени Application.Exit(); на return;
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
18.09.2017, 16:57
Помогаю со студенческими работами здесь

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

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

Приложение не запускается из сетевой папки на других ПК, если запущено на каком-то конкретном
Есть программа на c#. В ней показываются отчеты, созданные в FastReport. Программу пользователи запускают с сетевого диска. Проблема. ...

Если приложение запущено, но свёрнуто/невидимо, как оно может перехватить нажатие клавиши prtScn
Здравствуйте. задался вот вопросом по хукам в WPF дот нетовских приложениях. Если приложение запущено, но свёрнуто/невидимо, как оно может...

Сообщение "приложение остановлено" постоянно, даже когда приложение вообще не запущено
Собственно ,сабж в топике


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru