Как приостановить выполнение, пока пользователь не войдет в систему для запуска приложения в Win32

#c #winapi

#c #winapi

Вопрос:

Я создаю приложение на C с использованием Win32, которому необходимо приостановить его выполнение, когда сеанс заблокирован. Я использовал WM_WTSSESSION_CHANGE для обнаружения WTS_SESSION_LOCK WTS_SESSION_UNLOCK и обновления состояния моего приложения, которое отлично работает. Приложение должно запускаться при запуске, поэтому я разместил ярлык исполняемого файла здесь: C:ProgramDataMicrosoftWindowsStart MenuProgramsStartUp .

Проблема, с которой я сталкиваюсь, заключается в том, что приложение начинает свое выполнение до того, как пользователь вошел в WTS_SESSION_LOCK WTS_SESSION_UNLOCK систему или еще не был отправлен. Я не нашел ничего полезного в отношении этой проблемы. Есть идеи о том, как я мог бы проверить, что программа запущена, пока пользователь не вошел в систему?

Комментарии:

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

2. @JulianH В настоящее время у меня нет службы (демона в Linux), так как я начал проект, имея в виду, что мне нужен какой-то пользовательский интерфейс для управления пользователем. Возможно, я разделю проект на две части, чтобы исполняемый файл пользовательского интерфейса управлял сервисом, если это единственный способ.

3. ваш exe-файл запускается после входа пользователя в систему

4. Запуск должен выполняться после входа в систему… Однако вы можете поместить его в планировщик задач с триггером «При входе в систему» ( superuser.com/questions/15596 /… ). Будьте осторожны, вам нужно будет запретить запуск вашего приложения несколько раз…

Ответ №1:

Проблема, с которой я сталкиваюсь, заключается в том, что приложение начинает свое выполнение до входа пользователя в систему, поскольку WTS_SESSION_LOCK или WTS_SESSION_UNLOCK еще не отправлены.

Когда вы перезапускаете (или выключаете, а затем включаете) Windows, запускаемые приложения запускаются после входа пользователя в систему. Так что вы не получите WTS_SESSION_UNLOCK . Это ожидается, потому что пользователь уже вошел в систему до запуска вашего приложения.

Чтобы решить эту проблему, вы можете запросить информацию о сеансе через WTSQuerySessionInformation , чтобы проверить, активен ли текущий сеанс или нет при запуске вашего приложения. Активный указывает, что пользователь вошел в систему, чтобы вы могли начать выполнение своего приложения.

 WTSQuerySessionInformation(WTS_CURRENT_SERVER_HANDLE, WTS_CURRENT_SESSION, WTSSessionInfo, amp;sInfo, amp;BytesReturned);
  

После запуска Windows вы получите WTS_SESSION_LOCK и WTS_SESSION_UNLOCK нормально.