Как запустить мою программу перед выходом из Windows XP?

StackOverflow https://stackoverflow.com/questions/324220

Вопрос

Я ищу обратную версию " 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 " выше).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top