Как запустить мою программу перед выходом из Windows XP?
-
11-07-2019 - |
Вопрос
Я ищу обратную версию " RunOnceEx ".
RunOnceEx запускает некоторую программу до запуска пользовательской оболочки (рабочий стол и панель задач). Процесс входа не будет продолжаться до завершения runonceex.
Я хочу сделать то же самое, но при выходе из системы. Когда он / она выходит из системы, все запущенные программы закрываются, покидая оболочку (рабочий стол и панель задач), а затем "Я хочу, чтобы моя программа выполнялась в этот момент", наконец, вышел из системы.
Я думаю, что это возможно, потому что " mobsync.exe " делает это. Но я не могу найти, где и как это сделать.
Решение
Чтобы запустить это только для текущего пользователя, вы можете использовать WMI для получения информации, когда происходит выключение / выход из системы.
Либо вы пишете небольшое приложение C # (или любой другой язык, который может использовать WMI), либо сценарий vbs для прослушивания события Win32_ComputerShutdownEvent WMI.
Пример приложения C # можно найти здесь в этом вопросе: Получить событие выхода из система р>
Другие советы
Предупреждение, как сказано здесь , gpedit.msc
позволит вам настроить сценарий выхода из системы для всех пользователей .
Если вам нужен этот скрипт только для одного пользователя, вам нужно объявить его непосредственно в реестре, как в HKCU
, так и в HKLM
.
найдено в первом результате в Google для меня
Чтобы выполнить программу, вы можете создать скрипт для ее запуска и использовать групповую политику для ее принудительного применения. В редакторе групповой политики перейдите к Конфигурация пользователя -> Параметры Windows -> Сценарии (вход / выход из системы)
Если вы хотите, чтобы работающая программа выполняла код при выходе из системы, вам следует перехватить сообщение WM_QUERYENDSESSION
и найти значение lParam
для ENDSESSION_LOGOFF
(0x80000000).
Важно проверить это значение lParam
, потому что другие указывают на «принудительное закрытие». - т. е. ваш процесс может быть уничтожен еще до того, как ваш код будет разрешен к запуску. На самом деле, большинство сообщений о завершении работы / завершении сеанса предназначены только для того, чтобы дать вам возможность запустить код очистки в последнюю минуту, и на них небезопасно реагировать длительными действиями; но эта конкретная комбинация должна быть в порядке.
Примечание. Я никогда не пытался запустить отдельный процесс в ответ на сообщение WM_QUERYENDSESSION
. Возможно, что оконный менеджер запретит это, как это происходит во время выключения. Попробуйте и посмотрите, я думаю.
Если вы находитесь в среде .NET (вы не указали), более быстрый способ - добавить обработчик события в событие Microsoft.Win32.SystemEvents.SessionEnding
.
Вам нужна реализация GINA а>. Вы можете запускать свои собственные команды в WlxIsLogoffOk функция, которая вызывается, когда пользователь инициирует выход из системы
После создания соответствующей библиотеки GINA ее можно зарегистрировать здесь: HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ Winlogon \ @GinaDLL
Вот реализация, которая может соответствовать вашим потребностям (она предоставляет раздел реестра Logoff, где вы можете указать свою команду): http://wwwthep.physik.uni-mainz.de/~ Frink / newgina_pre09 / readme.html
Как уже упоминалось в VonC и TFD, редактор групповой политики - это еще один способ манипулирования реестром.
Просто внесите с помощью gpedit те изменения (в Userconfig - Параметры Windows - Сценарии), которые вам нравятся, и затем просмотрите реестр в [HKEY_CURRENT_USER \ Software \ Policies \ Microsoft \ Windows \ System \ Scripts]
чтобы узнать, как вы можете сделать это напрямую.
Также на моем ПК (висит в домене) есть скрытая папка C: \ WINDOWS \ System32 \ GroupPolicy
с подпапками для пользователя и компьютера. Оба имеют дополнительные подпапки, которые называются Shutdown и Startup. Может быть, вы также можете использовать эти.
Если вам нужно что-то простое и работающее для одного (или любого) пользователя, вы можете, например, создать простое приложение на C ++ или C #.
Самым простым является наличие в трее C # (путем простого добавления компонента лотка в форму), а также регистрация и обработчик события для события FormClosing . Это будет выглядеть так:
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
if (e.CloseReason != CloseReason.UserClosing)
{
// It's not the user closing the application,
// Let's do whatever you want here, for example starting a process
Process notePad = new Process();
notePad.StartInfo.FileName = "notepad.exe";
notePad.StartInfo.Arguments = "ProcessStart.cs";
notePad.Start();
}
}
Таким образом, ваше приложение будет запущено с Windows или с пользователем. Он будет ждать (используя немного памяти) и будет делать что-то, когда система выключится или пользователь выйдет из системы и т. Д. (Отметив " CloseReason " выше).