21 / 21 / 6
Регистрация: 07.01.2010
Сообщений: 376
1

Запрет на повторный запуск программы

07.06.2012, 20:38. Показов 10619. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Ничего, работающего на wpf, не нашел. Ну не считая использования мьютекса, где-то в каком-то далеком файле проекта. В этой ветке находил класс, но в нем ссылка на winforms.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.06.2012, 20:38
Ответы с готовыми решениями:

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

Запрет на двойной запуск приложения
Как запретить пользователю(умному) дважды запустить как мою программу, так и стороннюю?

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

Запрет на повторный запуск exe файла
Уважаемые форумчане скажите пожалуйста как в дельфи сделать так, чтобы при запуске exe файла во...

8
11 / 11 / 2
Регистрация: 29.05.2012
Сообщений: 51
08.06.2012, 12:32 2
сорь бро, а при чем тут wpf? Насколько я помню через пример с Мутексом, там отслеживался запущенный процесс, если таковой есть, то мы делаем выход, либо переключаемся на запущенный процесс и разворачиваем форму. Так и тут тоже самое. Создай класс Program
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Program : Application
    {       
        [STAThread]
        static void Main()
        {
           //Тут делай проверку запущенного процесса
           //Если все ок, то запускаем форму
 
            new Program();
        }
 
        public Program()
        {
            StartupUri = new System.Uri("/MainForm.xaml", UriKind.Relative);
            Run();           
        }
    }
0
826 / 717 / 110
Регистрация: 06.10.2010
Сообщений: 825
Записей в блоге: 1
09.06.2012, 22:54 3
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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
using System;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Text;
using System.Diagnostics;
using System.Threading;
using System.Reflection;
using System.IO;
 
namespace SingleInstance
{
    /// <summary>
    /// Summary description for SingleApp.
    /// </summary>
    public class SingleApplication
    {
        public SingleApplication()
        {
 
        }
        /// <summary>
        /// Imports 
        /// </summary>
    
        [DllImport("user32.dll")]
        private static extern int ShowWindow(IntPtr hWnd, int nCmdShow);
 
        [DllImport("user32.dll")]
        private static extern int SetForegroundWindow(IntPtr hWnd);
 
        [DllImport("user32.dll")]
        private static extern int IsIconic(IntPtr hWnd);
 
        /// <summary>
        /// GetCurrentInstanceWindowHandle
        /// </summary>
        /// <returns></returns>
        private static IntPtr GetCurrentInstanceWindowHandle()
        {    
            IntPtr hWnd = IntPtr.Zero;
            Process process = Process.GetCurrentProcess();
            Process[] processes = Process.GetProcessesByName(process.ProcessName);
            foreach(Process _process in processes)
            {
                // Get the first instance that is not this instance, has the
                // same process name and was started from the same file name
                // and location. Also check that the process has a valid
                // window handle in this session to filter out other user's
                // processes.
                if (_process.Id != process.Id &&
                    _process.MainModule.FileName == process.MainModule.FileName &&
                    _process.MainWindowHandle != IntPtr.Zero)    
                {
                    hWnd = _process.MainWindowHandle;
                    break;
                }
            }
            return hWnd;
        }
        /// <summary>
        /// SwitchToCurrentInstance
        /// </summary>
        private static void SwitchToCurrentInstance()
        {    
            IntPtr hWnd = GetCurrentInstanceWindowHandle();
            if (hWnd != IntPtr.Zero)    
            {    
                // Restore window if minimised. Do not restore if already in
                // normal or maximised window state, since we don't want to
                // change the current state of the window.
                if (IsIconic(hWnd) != 0)
                {
                    ShowWindow(hWnd, SW_RESTORE);
                }
 
                // Set foreground window.
                SetForegroundWindow(hWnd);
            }
        }
 
        /// <summary>
        /// Execute a form base application if another instance already running on
        /// the system activate previous one
        /// </summary>
        /// <param name="frmMain">main form</param>
        /// <returns>true if no previous instance is running</returns>
        public static bool Run(System.Windows.Forms.Form frmMain)
        {
            if(IsAlreadyRunning())
            {
                //set focus on previously running app
                SwitchToCurrentInstance();
                return false;
            }
            Application.Run(frmMain);
            return true;
        }
 
        /// <summary>
        /// for console base application
        /// </summary>
        /// <returns></returns>
        public static bool Run()
        {
            if(IsAlreadyRunning()) 
            {
                return false;
            }
            return true;
        }
 
        /// <summary>
        /// check if given exe alread running or not
        /// </summary>
        /// <returns>returns true if already running</returns>
        private static bool IsAlreadyRunning()
        {
            string strLoc = Assembly.GetExecutingAssembly().Location;
            FileSystemInfo fileInfo = new FileInfo(strLoc);
            string sExeName = fileInfo.Name;
            bool bCreatedNew;
 
            mutex = new Mutex(true, "Global\\"+sExeName, out bCreatedNew);
            if (bCreatedNew)
                mutex.ReleaseMutex();
 
            return !bCreatedNew;
        }
        
        static Mutex mutex;
        const int SW_RESTORE = 9;
    }
}
Использование:
C#
1
2
3
4
5
6
7
8
static void Main() 
{
   if(SingleInstance.SingleApplication.Run() == false)
   {
      return;
   }
   // Начало программы.
}
0
6048 / 3457 / 335
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
09.06.2012, 23:05 4
Как запретить одновременный запуск нескольких копий программы
0
_
2364 / 1243 / 78
Регистрация: 28.10.2009
Сообщений: 4,331
10.06.2012, 09:48 5
В коде приложения WPF пишем следующее (App_Startup - обработчик события Application.Startup)
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public partial class App : Application
    {
        //Запуск одной копии приложения
        System.Threading.Mutex mut;
        private void App_Startup(object sender, StartupEventArgs e)
        {
            bool createdNew;
            string mutName = "Приложение";
            mut = new System.Threading.Mutex(true, mutName, out createdNew);
            if (!createdNew)
            {
                Shutdown();
            }
            
        }
    }
2
21 / 21 / 6
Регистрация: 07.01.2010
Сообщений: 376
10.06.2012, 11:54  [ТС] 6
Забыл сказать, я еще тогда решил вопрос и воспользовался этим классом.
http://wpfsingleinstance.codeplex.com/
1
3 / 3 / 1
Регистрация: 24.06.2012
Сообщений: 51
09.02.2013, 16:43 7
Нужно заставить код правильно работать.
Нужно чтобы при повторном запуске приложения скрытое окно вновь появлялось.

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
    public partial class App : Application
    {
        [DllImport("user32.dll", SetLastError = true)]
        internal static extern int ShowWindow(int hwnd, int nCmdShow);
 
        [DllImport("user32.dll")]
        [return: MarshalAs(UnmanagedType.Bool)]
        static extern bool SetForegroundWindow(IntPtr hWnd);
 
        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        private static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);
 
        private void Application_Startup(object sender, StartupEventArgs e)
        {
            try
            {
                Process thisProc = Process.GetCurrentProcess();
                // Check how many total processes have the same name as the current one
                Process[] procs = Process.GetProcessesByName(thisProc.ProcessName);
                if (procs.Length > 1)
                {
                    foreach (Process proc in procs)
                    {
                        if (proc.Id != Process.GetCurrentProcess().Id)
                        {
                            // Пробовал и так
                            SendMessage(proc.MainWindowHandle, 0x99FF, IntPtr.Zero, IntPtr.Zero);
                            // И так
                            ShowWindow((int)proc.MainWindowHandle, 5);
                            SetForegroundWindow(proc.MainWindowHandle);
                        }
                    }
                    // If ther is more than one, than it is already running.
                    //MessageBox.Show("Одна копия приложения уже работает.");
                    Application.Current.Shutdown();
                    return;
                }
            }
            catch (Exception ex)
            {
 
            }
        }
    }
Перехватчик сообщения в случае SendMessage

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
        private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
        {
            if (msg == 0x99FF)
            {
                // обрабатываем сообщение
                try
                {
                        this.Show();
                        this.Activate();
                }
                catch (Exception ex)
                {
 
                }
            }
            return IntPtr.Zero;
        }
 
        protected override void OnSourceInitialized(EventArgs e)
        {
            base.OnSourceInitialized(e);
            // создаем экземпляр HwndSource
            hwndSource = PresentationSource.FromVisual(this) as HwndSource;
            // и устанавливаем перехватчик
            hwndSource.AddHook(WndProc);
        }
Скрытое окно ни в одном случае не показывается, но если оно просто не активно, то SetForegroundWindow выводит его поверх всех окон.
1
1 / 1 / 0
Регистрация: 04.07.2015
Сообщений: 2
25.08.2016, 21:32 8
Может я и опоздал, но собственно вот
WPF Single Instance Application
0
608 / 583 / 157
Регистрация: 29.06.2010
Сообщений: 1,620
31.05.2017, 14:48 9
чёрт, сколько же методов Main в приложении WPF я только что увидел... Eugene22, спасибо, долго искал какойнибудь e.Cancel к аргументу StartUpEventArgs.
0
31.05.2017, 14:48
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
31.05.2017, 14:48
Помогаю со студенческими работами здесь

Многопользовательский доступ или запрет на повторный запуск
И снова, здравствуйте! :) Создаваемая мной программа подразумевает ее использование многими...

Предотвратить повторный запуск программы
Приветствую Возникла проблема: Если запустить program.exe ещё раз (когда один экземпляр уже...

Повторный запуск программы с функцией plotyy
Здравствуйте! Помогите пожалуйста. Вот часть моей программы: pd2=P2(1,1:razm); pd3=P3(1,1:razm);...

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


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru