Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.54/35: Рейтинг темы: голосов - 35, средняя оценка - 4.54
20 / 20 / 2
Регистрация: 26.01.2010
Сообщений: 106

Как избежать повторный запуск приложения?

28.01.2010, 13:41. Показов 6993. Ответов 23
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Подскажите как можно избежать повторного запуска программы? Поясню: я написал программу, в которой при нажатии кнопки открывается Nero. После этого программа должна автоматически нажать Enter, чтобы перейти в окно Nero, в котором мы перетаскиваем нужные для записи файлы в область записываемого диска. Проблема в том, что при нажатии на кнопку Nero запускается дважды - как этого можно избежать?
На всякий случай приведу листинг обработчика кнопки, вдруг это у меня где-то бага?

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
        private void btnProg_Click(object sender, EventArgs e)
        {
            try
            {
                Process prog = new Process();
                prog.StartInfo.ErrorDialog = true;
                prog.StartInfo.FileName = "C:\\Program Files\\Ahead\\Nero\\nero.exe";
                prog.Start();
                prog.WaitForInputIdle();
                IntPtr hWndNero = FindWindow("New Compilation", null);
                SetForegroundWindow(hWndNero);
                SendKeys.SendWait("{ENTER}");
 
            }             
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
28.01.2010, 13:41
Ответы с готовыми решениями:

Как запретить повторный запуск программы
При загрузке формы запретить запуск этой формы еще раз , допустим что бы выводило "Это программа уже запущена!".

Как правильно блокировать повторный запуск асинхронной функции ?
Допустим есть асинхронная функция, вызываемая по нажатию кнопки пользователем. Функция не быстрая, ходит по http Как можно запретить...

Повторный запуск метода
Это часть кода для запуска wcf службы. Запускаю вызывая Start(), останавливаю соответственно через Stop(). Все это находится в отдельном...

23
Заблокирован
28.01.2010, 16:03
Напиши весь код. Похоже ты сдесь используешь System.Runtime.InteropServices;
0
20 / 20 / 2
Регистрация: 26.01.2010
Сообщений: 106
28.01.2010, 16:15  [ТС]
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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.IO;
using System.Runtime.InteropServices;
using System.Text;
using System.Windows;
using System.Windows.Forms;
 
namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
     
        public Form1()
        {
            InitializeComponent();
 
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {            
            DirectoryInfo dir = new DirectoryInfo("C:\\1\\");
            FileInfo[] pdir = dir.GetFiles();
            foreach (FileInfo fi in pdir)
            {
                listBox1.Items.Add(fi.FullName.ToString());
            }
            txtFind.Text = "C:\\1\\";
        }
 
        private void listBox1_DoubleClick(object sender, EventArgs e)
        {
            try
            {
 
                System.Diagnostics.Process p = new System.Diagnostics.Process();
                p.StartInfo.FileName = listBox1.Text;
                p.Start();
 
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
 
        private void btnOpen_Click(object sender, EventArgs e)
        {
            try
            {
 
                System.Diagnostics.Process p = new System.Diagnostics.Process();
                p.StartInfo.FileName = listBox1.Text;
                p.Start();
 
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
 
        private void btnProg_Click(object sender, EventArgs e)
        {
            try
            {
                Process prog = new Process();
                prog = Process.GetCurrentProcess();
                prog.StartInfo.ErrorDialog = true;
                prog.StartInfo.FileName = "C:\\Program Files\\Ahead\\Nero\\nero.exe";
                prog.Start();
                //Process prog = Process.Start("C:\\Program Files\\Ahead\\Nero\\nero.exe");
                prog.WaitForInputIdle();
                IntPtr hWndNero = FindWindow("New Compilation", null);
                SetForegroundWindow(hWndNero);
                Application.DoEvents();
                Application.Exit();
                SendKeys.SendWait("{ENTER}");
 
            }             
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
 
        private void btnFind_Click(object sender, EventArgs e)
        {
            string s;
            s = txtFind.Text; 
            
            int index = listBox1.FindString(s, -1);
            if (index != -1)
            {
                listBox1.SetSelected(index, true);
                MessageBox.Show("Found the item \"" + s + "\" at index: " + index);
            }
            else
                MessageBox.Show("Item not found.");
        }
 
        private void btnExit_Click(object sender, EventArgs e)
        {
            this.Close();
        }
        [DllImport("User32.dll")]
        static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
        [DllImport("User32.dll")]
        static extern int SetForegroundWindow(IntPtr hWnd);
    }
}
0
Заблокирован
28.01.2010, 17:20
У меня другое Неро стоит. Вот так получилось
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Process prog = new Process();
                prog = Process.GetCurrentProcess();
                prog.StartInfo.ErrorDialog = true;
                prog.StartInfo.FileName = @"D:\Program Files\Nero\Nero 9\Nero Burning ROM\Nero.exe";
                prog.Start();
                //Process prog = Process.Start("C:\\Program Files\\Ahead\\Nero\\nero.exe");
                prog.WaitForInputIdle();
              
                IntPtr hWndNero = FindWindow(null,"Новый проект");
                SetForegroundWindow(hWndNero);
                Application.DoEvents();
                //добавил
                System.Threading.Thread.Sleep(5000);
 
                SendKeys.SendWait("{ENTER}");
                Application.Exit();
Поэксперементируй с System.Threading.Thread.Sleep.
Но все равно, как-то это все нестабильно
1
 Аватар для Mikant
1322 / 995 / 127
Регистрация: 08.12.2009
Сообщений: 1,299
28.01.2010, 17:50
Лучший ответ Сообщение было отмечено как решение

Решение

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
private Mutex mutex;
private const string mutexName = "MyProgramMutexToEnsureThatOnlyASingleInstanceIsRunning";
 
// код в начале программы
try
{
   mutex = Mutex.OpenExisting ( mutexName );
   //если выдается исключение - значит программа уже запущена
   MessageBox.Show ( "Извините, другой экземпляр программы уже запущен", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Information );
   //Environment.Exit (0); - можно было и так
}
catch
{
   //так как мьютекс не найден - создаем
   mutex = new Mutex ( true, mutexName );
   Application.Run(new MainForm());
}
5
 Аватар для body90
467 / 344 / 19
Регистрация: 26.05.2009
Сообщений: 2,696
28.01.2010, 19:44
А что нужно вообще делать, чтоб послать в другое приложение нажатие сочетания клавиш?
0
Заблокирован
28.01.2010, 21:25
Цитата Сообщение от body90 Посмотреть сообщение
А что нужно вообще делать, чтоб послать в другое приложение нажатие сочетания клавиш?
Посмотри внимательно выше, у автора вопроса в листинге все есть

Добавлено через 1 час 22 минуты
C#
1
2
3
4
5
6
7
8
 private void button2_Click(object sender, EventArgs e)
        {
            IntPtr hWndNero = FindWindow(null, "Калькулятор Плюс");
            SetForegroundWindow(hWndNero);
                       
            SendKeys.Send("%{F4}");//сочетание alt и F4
           
        }
1
 Аватар для body90
467 / 344 / 19
Регистрация: 26.05.2009
Сообщений: 2,696
28.01.2010, 22:09
А как получить список имен доступных приложений?
0
Заблокирован
28.01.2010, 22:57
Можно используя процессы. Возможно есть вариант и получше, но я его не знаю.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 private void button4_Click(object sender, EventArgs e)
        {
            label1.Text = "";
            System.Diagnostics.Process[] process = System.Diagnostics.Process.GetProcesses();
            foreach (System.Diagnostics.Process pro in process)
            {
                            
                try
                {       if( pro.MainWindowTitle!="")                               
                     label1.Text += pro.MainWindowTitle + Environment.NewLine;
                }
                catch { }
 
            }
 
        }
Добавлено через 13 минут
Да еще насчет сочетания клавиш. Может будет интересно
http://msdn.microsoft.com/ru-r... dkeys.aspx
1
 Аватар для body90
467 / 344 / 19
Регистрация: 26.05.2009
Сообщений: 2,696
29.01.2010, 08:22
Можно еще вопрос? Возможно тупой. Если я хочу что-то отправить винампу и аимпу (например, из моего приложения переключить трек или остановить). Что нужно делать?
0
20 / 20 / 2
Регистрация: 26.01.2010
Сообщений: 106
29.01.2010, 09:18  [ТС]
ssv_www, Mikant огромное спасибо вам за ответы - все отлично работает

Цитата Сообщение от body90 Посмотреть сообщение
Можно еще вопрос? Возможно тупой. Если я хочу что-то отправить винампу и аимпу (например, из моего приложения переключить трек или остановить). Что нужно делать?
Все просто сначала запускаешь винамп, как это показано в ответе ssv_www на мой вопрос, либо как показано у меня в вопросе на примере Nero. А дальше нужно просто знать комбинации клавиш, соответствующих необходимым тебе командам и реализовать подобно тому, как это сделано у меня. Конкретней смотри ссылку на msdn, которую кинул ssv_www.

Примерно так, но я не компилил - проверь сам
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
        private void button1_Click(object sender, EventArgs e)
        {
 
            try
            {
                Process win = new Process();
                win.StartInfo.ErrorDialog = true;
                win.StartInfo.FileName = "C:\\Program Files\\Winamp\\winamp.exe";
                win.Start();
                prog.WaitForInputIdle();                
                SendKeys.Send("x");
            }             
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
1
Заблокирован
29.01.2010, 10:04
Цитата Сообщение от pir Посмотреть сообщение
Все просто сначала запускаешь винамп,
[
Вопрос: А если мне не надо запускать винамп? Допустим он у меня уже запучен и я хочу управлять им. Что тогда?

Добавлено через 9 минут
У многих программ заголовок окна меняется, а название процесса остается неизменный. За редким исключением (некоторые системные процессы иногда пишутся в разных регистрах).
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
private void button6_Click(object sender, EventArgs e)
        {
            System.Diagnostics.Process[] process = System.Diagnostics.Process.GetProcesses();
            foreach (System.Diagnostics.Process pro in process)
            {
 
                if (pro.ProcessName == "winamp")
                    try
                    {
 
                        IntPtr hWnd = pro.MainWindowHandle;
                        SetForegroundWindow(hWnd);
                       // Application.DoEvents();
                        SendKeys.Send("{c}");
                       
                        break;
                    }
                    catch { }
                
            }
 
        }
0
20 / 20 / 2
Регистрация: 26.01.2010
Сообщений: 106
29.01.2010, 10:11  [ТС]
позже отвечу - на работу уже опаздываю)
0
Заблокирован
29.01.2010, 10:32
Цитата Сообщение от Mikant Посмотреть сообщение
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
private Mutex mutex;
private const string mutexName = "MyProgramMutexToEnsureThatOnlyASingleInstanceIsRunning";
 
// код в начале программы
try
{
   mutex = Mutex.OpenExisting ( mutexName );
   //если выдается исключение - значит программа уже запущена
   MessageBox.Show ( "Извините, другой экземпляр программы уже запущен", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Information );
   //Environment.Exit (0); - можно было и так
}
catch
{
   //так как мьютекс не найден - создаем
   mutex = new Mutex ( true, mutexName );
   Application.Run(new MainForm());
}
Я пользуюсь другим вариантом
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
using System.Threading;
 
 static class Program
    {
        
        private static Mutex _syncObject;
        private const string _syncObjectName = "{E663FA11-AE0D-480e-9FCA-4BE9B8CDB4E9}";
        /// 
        /// Главная точка входа для приложения.
        /// 
        [STAThread]
        static void Main()
        {
            bool createdNew;
            _syncObject = new Mutex(true, _syncObjectName, out createdNew);
            if (!createdNew)
            {
                MessageBox.Show("Программа уже запущена.");
                return;
            }
            // Продолжаем выполнение
 
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
    }
1
 Аватар для body90
467 / 344 / 19
Регистрация: 26.05.2009
Сообщений: 2,696
29.01.2010, 12:50
У винампа заголовок постоянно изменяется в зависимости от трека. На счет идей с процессами тоже спасибо. Я понимаю, как отправить сочетание. У меня другая проблема. Этот способ не сработает, если пользователя изменил стандартные настройки сочетаний. Как выйти из этой ситуации?
0
20 / 20 / 2
Регистрация: 26.01.2010
Сообщений: 106
29.01.2010, 13:26  [ТС]
Цитата Сообщение от ssv_www Посмотреть сообщение
Вопрос: А если мне не надо запускать винамп? Допустим он у меня уже запучен и я хочу управлять им. Что тогда?
вообще интересный вопрос... возможно, FindWindow и SetForegroundWindow решат эту проблему... хотя не уверен - вечером проверю
0
Заблокирован
29.01.2010, 13:27
Ну, всего непредусмотришь. Да и зачем пользователю менять стандартные настройки сочетаний?
Там в свойствах винампа есть закладка Global Hotkeys. Попробуй использовать те сочетания. У меня не получилось. Если у тебя получится - напиши.
Это я ответил body90.
0
 Аватар для body90
467 / 344 / 19
Регистрация: 26.05.2009
Сообщений: 2,696
29.01.2010, 14:03
Я меняю эти настройки. И не хотелось бы каждый раз делать окно активным
0
20 / 20 / 2
Регистрация: 26.01.2010
Сообщений: 106
29.01.2010, 15:44  [ТС]
Цитата Сообщение от body90 Посмотреть сообщение
И не хотелось бы каждый раз делать окно активным
Как же по твоему твоя программа будет определять в каком окне выполнять эмуляцию нажатия кнопки/кнопок? В момент запуска твоей программы у тебя может быть открыто 2, 3, 5 и т.д. окон причем из разных программ и если не сделать НУЖНОЕ окно ативным, то программное нажатие кнопки уйдет на какое-нибудь другое окно, а может даже в другую программу. Т.е. твоя программа будет работать, но будет нерациональной.
0
 Аватар для body90
467 / 344 / 19
Регистрация: 26.05.2009
Сообщений: 2,696
29.01.2010, 23:28
Мне и интересно, можно ли послать как-то какие-то данные в другую программу не через сочетания клавиш?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
29.01.2010, 23:28
Помогаю со студенческими работами здесь

Повторный запуск потоков
Добрый день всем. Необходима ваша помощь в следующем вопросе. Есть некий гипотетический код: while (true) { Thread Thrd = new...

Запрет на повторный запуск приложения
Здравствуйте. Необходимо запретить запускать приложение второй раз (из под любого пользователя). Нашёл два варианта: ...

Многопоточность и повторный запуск
Я пишу программу которая захватывает видео и управляет шаговым двигателем и проблема как раз закралась в управлении шаговым двигателем ...

Повторный запуск приложения
Пишу программу для сферы бесопастности, как известно любую программу можно убить через диспечера задач.:wall: Ребят подскажите в каком...

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
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(), которая. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru