#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
нормально.