uday vichare Ответов: 2

Перезагрузите приложение C# windows при переключении пользователя.


У меня есть одно простое приложение на c#, которое работает под логином пользователя. Я хочу закрыть это приложение, когда пользователь пытается переключить пользователя, и повторно запустить его, когда пользователь вошел в систему как тот же или другой пользователь.

Что я уже пробовал:

1. я попробовал добавить 1 поток, который будет работать непрерывно и в этом потоке :
private static void SwitchUserThread()
        {
            SystemEvents.SessionSwitch += new SessionSwitchEventHandler(SessionSwitchHandler);
            while (true)
            { }
        }


            private static void SessionSwitchHandler(object sender, SessionSwitchEventArgs args)
{
    try
    {
                WriteToLog(DateTime.Now + " : Inside SessionSwitch, args.Reason : " + args.Reason);
                switch (args.Reason)
                {
                    case SessionSwitchReason.ConsoleDisconnect:
                        WriteToLog(DateTime.Now + " : Inside SessionSwitch, args.Reason : " + args.Reason);
                        Application.Exit();
                        WriteToLog(DateTime.Now + " Application Exit ");
                        break;
                    case SessionSwitchReason.ConsoleConnect:
                        WriteToLog(DateTime.Now + " : Inside SessionSwitch, args.Reason : " + args.Reason);
                        Application.Run();
                        WriteToLog(DateTime.Now + " Application started Succefully ");
                        break;
                }
    }
    catch (Exception ex)
    {

    }
}

Kornfeld Eliyahu Peter

Почему приложение, а не сервис?
https://msdn.microsoft.com/en-us/library/microsoft.win32.systemevents(v=против 110). aspx

Dave Kreskowiak

Определите, что вы подразумеваете под "Когда пользователи пытаются переключить пользователя". Вы говорите о том, что если пользователь выходит из Windows и снова входит в систему как кто-то другой?

uday vichare

не выходя из системы и не включаясь.. Я имел в виду просто переключение пользователя с (win+l), который не полностью выходит из системы предыдущего пользователя.

Kornfeld Eliyahu Peter

Я не вижу в этом проблемы... При использовании fast user switch приложение, работающее в контексте пользователя A, будет отложено в сторону, а пользователь B получит новую среду с новым экземпляром приложения (например, открытое слово пользователя A не появится для пользователя B). Все, что вам нужно, это поместить ваше приложение в папку запуска (или реестр), и вы должны быть в порядке...

uday vichare

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

2 Ответов

Рейтинг:
1

Dave Kreskowiak

Почему вы не можете запустить несколько экземпляров? Ваше "требование" очень странно.

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

Существует системное событие, на которое вы можете подписаться Системные события.Событие SessionSwitch (Microsoft. Win32)[^].

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

Вы не получаете пользователя сеанса, который активен или деактивируется. То, что вы получаете, - это причина, по которой событие было вызвано в eventargs. Значения которых являются здесь[^].

Вам понадобится второе приложение, которое работает от имени пользователей из раздела запуска реестра и подписывается на событие SessionSwitch. Он должен был бы определить, когда запустить ваше приложение с одним экземпляром. Это включает в себя запуск приложения при запуске вашего "монитора", указание ему выйти из системы при обнаружении ConsoleDisconnect и перезапуск его при обнаружении ConsoleConnect.

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


Рейтинг:
0

RickZeeland

Вы можете использовать Приложение.Перезапуск() Приложение.Способ Перезагрузить (Системы.Окна.Формы)[^]
Но я бы рекомендовал делать это не из потока, а, например, в программе.


uday vichare

Это не работает, потому что перезапуск перезапустит приложение в том же пользовательском контексте, что и раньше. я хочу запустить его в новом пользовательском контексте. для этого я должен завершить приложение в предыдущем пользовательском контексте при переключении пользовательского события и повторно запустить его в новом пользовательском контексте.