Как запустить мою программу перед выходом из Windows XP? - PullRequest
9 голосов
/ 27 ноября 2008

Я ищу обратную версию "RunOnceEx".

RunOnceEx запускает некоторую программу до запуска оболочки пользователя (рабочий стол и панель задач). Процесс входа не будет продолжен до завершения runonceex.

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

Я думаю, что это возможно, потому что "mobsync.exe" делает это. Но я не могу найти где и как это сделать.

Ответы [ 7 ]

7 голосов
/ 27 ноября 2008

Предупреждение, как сказано здесь , gpedit.msc позволит вам настроить сценарий выхода из системы для всех пользователей .

Если вам нужен этот скрипт только для одного пользователя, вам нужно объявить его непосредственно в реестре, как в HKCU, так и в HKLM.

4 голосов
/ 17 декабря 2009

Чтобы запустить это только для текущего пользователя, вы можете использовать WMI для получения информации, когда происходит выключение / выход из системы.

Либо вы пишете небольшое приложение C # (или любой другой язык, который может использовать WMI), либо сценарий VBS для прослушивания события Win32_ComputerShutdownEvent *1004*.

Пример приложения C # можно найти здесь в этом вопросе: Get Log off event from system

3 голосов
/ 17 декабря 2009

Если вы хотите, чтобы работающая программа выполняла код при выходе из системы, вам следует перехватить сообщение WM_QUERYENDSESSION и найти значение lParam ENDSESSION_LOGOFF (0x80000000).

Важно проверить это значение lParam, потому что другие указывают на «принудительное закрытие» - т. Е. Ваш процесс может быть остановлен до того, как ваш код будет даже запущен. На самом деле, большинство сообщений о завершении работы / завершении сеанса предназначены только для того, чтобы дать вам возможность запустить код очистки в последнюю минуту, и на них небезопасно реагировать длительными действиями; но эта конкретная комбинация должна быть в порядке.

Примечание. Я никогда не пытался запустить отдельный процесс в ответ на сообщение WM_QUERYENDSESSION. Возможно, что оконный менеджер запретит это, как это происходит во время выключения. Попробуйте и посмотрите, я думаю.

Если вы находитесь в среде .NET (вы не указали), более быстрый способ - добавить обработчик события к событию Microsoft.Win32.SystemEvents.SessionEnding.

3 голосов
/ 27 ноября 2008

найдено в первом результате на Google для меня

Чтобы выполнить программу, вы можете создать скрипт для ее запуска и использовать групповую политику для ее принудительного применения. В редакторе групповой политики перейдите к Конфигурация пользователя -> Параметры Windows -> Сценарии (вход / выход из системы)

больше информации здесь

1 голос
/ 16 декабря 2009

Как уже упоминалось в VonC и TFD, редактор групповой политики - это просто еще один способ манипулирования реестром.

Просто внесите с помощью gpedit те изменения (в Userconfig - Настройки Windows - Сценарии), которые вам нравятся, и затем посмотрите в реестре на [HKEY_CURRENT_USER\Software\Policies\Microsoft\Windows\System\Scripts] чтобы узнать, как вы можете сделать это напрямую.

Также на моем ПК (висит в домене) есть скрытая папка C:\WINDOWS\System32\GroupPolicy с подпапками для пользователя и машины. Оба имеют дополнительные подпапки, которые называются Shutdown и Startup. Может быть, вы также можете использовать эти.

1 голос
/ 15 декабря 2009

Что вам нужно, это реализация 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

0 голосов
/ 17 декабря 2009

Если вам нужно что-то простое и работающее для одного (или любого) пользователя, вы можете, например, создать простое приложение на 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» выше).

...