john1990_1 Ответов: 1

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


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

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

Cursor.Position = new Point(
//Screen.PrimaryScreen.Bounds.X + 
Screen.PrimaryScreen.Bounds.Width / 2,
// Screen.PrimaryScreen.Bounds.Y +
 Screen.PrimaryScreen.Bounds.Height / 2);

Richard MacCutchan

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

john1990_1

Или я могу заставить свою программу смотреть в Even Viewer с таймером каждые 100 миллисекунд и проверять, была ли разблокировка в последние 150 миллисекунд, а затем, если да, не делать это действие снова в течение 400 миллисекунд...

Richard MacCutchan

Ну, все, что тебе подходит.

john1990_1

Я ожидал некоторой помощи, так как то, что я нахожу в Google, не работает.

1 Ответов

Рейтинг:
8

Michael Haephrati

Подождите, пока Событие переключения сеанса.[^].

static void SystemEvents_SessionSwitch(object sender, Microsoft.Win32.SessionSwitchEventArgs e)
{
     if (e.Reason == SessionSwitchReason.SessionUnlock)
     {
         //unlock screen
         Console.WriteLine("Screen unlocked");
     }
}


john1990_1

Thx, я добавил в Main() это:
SessionSwitch += SystemEvents_SessionSwitch;
И все же событие не срабатывает (даже до точки останова на "если").

Dave Kreskowiak

Он работает найти в приложении Windows Forms. Класс SystemEvents обертывает функцию Win32 WTSRegisterSessionNotification. Для работы ему требуется окно с насосом сообщений, поэтому он не будет работать в консоли или сервисном приложении Windows.

john1990_1

Я запускаю его в приложении Windows Forms, может быть, мне следует переместить его в класс FormMain, а не в класс Program и Main()?

Dave Kreskowiak

Уххх, да. Насос сообщений в приложении Forms не запускается до тех пор, пока не будет вызван метод Run.

john1990_1

Я переоделся на:
FormMain_Shown недействительным(объект отправителя, EventArgs в электронной)
{
SessionSwitch += SystemEvents_SessionSwitch;
}
И поместите все это в FormMain, который вызывается из Run in Main (), может быть, мне следует запустить другую форму и закрыть ее в Main (), чтобы она начала стрелять?

Dave Kreskowiak

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

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

Так и должно быть

SystemEvents.SessionSwitch += SystemEvents_SessionSwitch;

john1990_1

Thx, для будущих читателей: это сработало для меня:
статический void HandleSessionSwitch(отправитель объекта, Microsoft.Win32.SessionSwitchEventArgs e)
{
if (e.Reason == Microsoft.Win32.SessionSwitchReason.SessionUnlock)
{
Ящик для сообщений.Показать("экран разблокирован");
}
}

частная FormMain_Load недействительным(объект отправителя, EventArgs в электронной)
{
Майкрософт.С Win32.SystemEvents.SessionSwitch += HandleSessionSwitch;