Как узнать,что запущена именно UI?

138
19 февраля 2019, 18:30

Есть CL(command line) приложение, в качестве формы выводится форма для настроек. Так вот, при попытке вызвать второй раз форму отображается сообщение "мол, форма запущена".При другом раскладе, когда переданы данные и запускается процесс - нужно мне сделать так, чтобы можно было запускать не один процесс а несколько. Объяснил как мог. Можно ли как-то узнать -запущена именно UI или нет. Может, можно процессу назначить какой-то уникальный ID?

Answer 1

Возьмем класс из этого ответа

    class SingleGlobalInstance : IDisposable
    {
        //edit by user "jitbit" - renamed private fields to "_"
        public bool _hasHandle = false;
        Mutex _mutex;
        private void InitMutex()
        {
            string appGuid = ((GuidAttribute)Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(GuidAttribute), false).GetValue(0)).Value;
            string mutexId = string.Format("Global\\{{{0}}}", appGuid);
            _mutex = new Mutex(false, mutexId);
            var allowEveryoneRule = new MutexAccessRule(new SecurityIdentifier(WellKnownSidType.WorldSid, null), MutexRights.FullControl, AccessControlType.Allow);
            var securitySettings = new MutexSecurity();
            securitySettings.AddAccessRule(allowEveryoneRule);
            _mutex.SetAccessControl(securitySettings);
        }
        public SingleGlobalInstance(int timeOut)
        {
            InitMutex();
            try
            {
                if (timeOut < 0)
                    _hasHandle = _mutex.WaitOne(Timeout.Infinite, false);
                else
                    _hasHandle = _mutex.WaitOne(timeOut, false);
                if (_hasHandle == false)
                    throw new TimeoutException("Timeout waiting for exclusive access on SingleInstance");
            }
            catch (AbandonedMutexException)
            {
                _hasHandle = true;
            }
        }

        public void Dispose()
        {
            if (_mutex != null)
            {
                if (_hasHandle)
                    _mutex.ReleaseMutex();
                _mutex.Close();
            }
        }
    }

Но вызывать его будем только в том случае, если наша программа запущена без параметров. Вообще наше консольное приложение эмулирует какую то работу если ему передают параметры (не важно какие) или открывает форму если его вызвали без параметров. При открытии формы идет попытка захватить мьютекс, если попытка не удалась - то мьютекс уже захвачен и прекращаем работу. таким образом простая работа может быть запущена сколько угодно раз, окно настроек - только 1 инстанс одновременно

Код:

    [STAThread]
    static void Main(string[] args)
    {
        if (args?.Length > 0)
        {
            for (int i = 0; i < 100; i++)
            {
                Console.WriteLine($"Deleting files in progress: {i}%");
                Thread.Sleep(1000);
            }
        }
        else
        {
            try
            {
                using (var mutex = new SingleGlobalInstance(0))
                {
                    var wnd = new Window();
                    wnd.Title = "Settings";
                    wnd.Content = new Label() {Content = "I am settings window"};
                    wnd.Width = 300;
                    wnd.Height = 300;
                    wnd.WindowStartupLocation = WindowStartupLocation.CenterScreen;
                    wnd.ShowDialog();
                }
            }
            catch (TimeoutException)
            {
                Console.WriteLine("Settings window already opened!");
            }
        }
    }

Результат:

READ ALSO
Абстрактный generic класс, с переменным числом типов

Абстрактный generic класс, с переменным числом типов

Меня интересует может ли generic класс принимать несколько типов параметров, а точнее которое заранее неизвестно, как тот же кортеж?

155
Составной диапазон из разных ячеек EXCEL (C#)

Составной диапазон из разных ячеек EXCEL (C#)

Для ограничения доступа к ячейкам EXCEL через C# применяю метод WorksheetProtection

175
Проблема с срабатыванием события c# wpf mvvm

Проблема с срабатыванием события c# wpf mvvm

Есть 2 ViewModel это LoginViewModel и AuthViewModel В AuthViewModel идет инициализация и вызов делегата при срабатывании команды

170