Ищу инверсную версию "RunOnceEx".
RunOnceEx запускает некоторую программу до запуска оболочки пользователя (рабочего стола и панели задач). Процесс входа в систему не будет продолжен до завершения runonceex.
Я хочу сделать то же самое, но при выходе пользователя из системы. Когда он / она выходит из системы, все запущенные программы завершаются, покидает оболочку (рабочий стол и панель задач), затем «« Я хочу, чтобы моя программа была запущена в этот момент »», и наконец, выход.
Я думаю, что это возможно, потому что это делает "mobsync.exe". Но не могу найти, где и как это сделать.
Как сказал @VonC, просто добавьте несколько записей в реестр. как это сложно!
Вы ищете решение на C / C++ или .NET? Кроме того, mobsync.exe - это программа Microsoft, которая, скорее всего, использует записи реестра, как и все ответы, от которых вы отказываетесь.





нашел в первом результате в Google для меня
Чтобы выполнить программу, вы можете создать сценарий для ее запуска и использовать групповую политику для ее применения. В редакторе групповой политики перейдите в Конфигурация пользователя -> Параметры Windows -> Сценарии (Вход / Выход).
Поскольку я спрашиваю в stackoverflow, а не в Superuser, я ищу решения для программирования
Вам нужна реализация GINA. Вы можете запускать свои собственные команды в функции WlxIsLogoffOk, которая вызывается, когда пользователь инициирует выход из системы.
Как только вы создадите правильную dll GINA, вы можете зарегистрировать ее здесь: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\@GinaDLL
Вот реализация, которая может соответствовать вашим потребностям (она предоставляет ключ реестра для выхода из системы, в котором вы можете указать свою команду): http://wwwthep.physik.uni-mainz.de/~frink/newgina_pre09/readme.html
+1, потому что это законный ответ, но я думаю, что реализация dll GINA для того, что этот человек хочет выполнить, является чрезмерным.
Как уже упоминали VonC и TFD, редактор групповой политики - это еще один способ управления реестром.
Просто внесите с помощью gpedit изменения (в Userconfig - Настройки Windows - Скрипты), которые вам нравятся, а затем загляните в реестр на [HKEY_CURRENT_USER\Software\Policies\Microsoft\Windows\System\Scripts].
чтобы узнать, как это сделать напрямую.
Также на моем ПК (висит в домене) есть скрытая папка C:\WINDOWS\System32\GroupPolicy с подпапками для пользователя и машины. У обоих есть дополнительные подпапки, называемые Shutdown и Startup. Может быть, ты тоже сможешь использовать эти.
Если вам нужно что-то простое и работающее для одного (или любого) пользователя, вы можете создать простое приложение, например, на C++ или C#.
Самый простой - иметь C# в лотке (просто добавив компонент лотка в форму), а также регистр и обработчик событий для события Форма. Это выглядело бы так:
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» выше).
Если вы хотите, чтобы запущенная программа выполняла код при выходе из системы, вам следует перехватить сообщение WM_QUERYENDSESSION и найти для lParam значение ENDSESSION_LOGOFF (0x80000000).
Важно проверить это значение lParam, потому что другие указывают на «принудительное закрытие» - т.е. ваш процесс может быть убит еще до того, как ваш код будет запущен. Фактически, большинство сообщений о завершении работы / завершении сеанса предназначены только для того, чтобы дать вам возможность запустить код очистки в последнюю минуту, и они не так безопасны для ответа с помощью длительных действий; но эта конкретная комбинация должна быть в порядке.
Примечание: я никогда не пробовал запускать отдельный процесс в ответ на сообщение WM_QUERYENDSESSION. Возможно, оконный менеджер запретит это, как при выключении. Я думаю, попробуй и увидишь.
Если вы находитесь в среде .NET (вы не указали), более быстрый способ - добавить обработчик событий к событию Microsoft.Win32.SystemEvents.SessionEnding.
Чтобы запустить это только для текущего пользователя, вы можете использовать WMI для получения информации при завершении работы / выходе из системы.
Либо вы пишете небольшое приложение C# (или любой другой язык, который может использовать WMI), либо сценарий vbs для прослушивания события Win32_ComputerShutdownEvent WMI.
Пример приложения C# можно найти здесь, в этом вопросе: Получить событие выхода из системы
Я просил «программируемый» способ - то есть я могу настроить его во время установки или опцию в приложении. Групповая политика хороша, но она просто не устраняет требования. Microsoft жестко кодирует "mobsync.exe"?