2008-11-27 5 views
9

Я ищу обратную версию «RunOnceEx».Как запустить мою программу перед выходом на Windows XP?

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

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

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

+0

я просил для «программируемых» способом - то, что я могу установить его во время моей установки или опции в приложении. Групповая политика отличная, но она просто не исправляет требования. Являются ли жесткие диски Microsoft «mobsync.exe»? – 2009-11-29 14:14:55

+1

Как сказал @VonC, justr добавляет некоторый реестр. как трудно это! – TFD 2009-12-13 22:28:05

+0

Вы ищете решение в C/C++ или .NET? Кроме того, mobsync.exe является программой Microsoft и более чем вероятно использует записи реестра, такие как все ответы, которые вы отказываетесь. – 2009-12-17 17:42:14

ответ

4

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

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

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

3

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

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

more information here

7

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

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

1

Что вам нужно - это реализация GINA. Вы можете запускать пользовательские команды в WlxIsLogoffOk функции, которая вызывается, когда пользователь инициирует выход из системы

После создания правильного GINA DLL вы можете зарегистрировать его здесь: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\@GinaDLL

Вот реализация, которая может соответствовать вашим потребностям (он предоставляет раздел реестра выхода из системы, где вы можете указать свою команду): http://wwwthep.physik.uni-mainz.de/~frink/newgina_pre09/readme.html

1

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

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

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

0

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

3

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

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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^