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

Тест на простоту - Википедия

Простейший тест на простоту - пробное деление: учитывая входное число n, проверьте, делит ли любое простое число m от 2 до √n поровну

blockquote>

Я бы начал с определения функции, которая просто проверяет, является ли число простым или нет. Затем используйте эту функцию в цикле, который считает от 3, 5, 7, 9, ..., 999,999 и проверьте, является ли каждое число простым, если оно совпадает, затем добавьте его в переменную суммы.

from math import sqrt

def is_prime(num):
    # According to trial division we only need to check from 2 -> sqrt(num)
    for x in range(2, int(sqrt(num) + 1)):
        if num % x == 0:
             return False
    return True

sum = 2 # Start with 2 in sum because we skip it to make life easier
for x in range(3, 1000000, 2): # Don't bother checking even numbers
    if is_prime(x):
        sum += x
print("Sum: " + str(sum))

На моем компьютере это занимает около 10 секунд, чтобы найти ответ, который немного лучше, чем ваша реализация.

9
задан Dennis C 27 November 2008 в 16:51
поделиться

7 ответов

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

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

Пример приложения C # можно найти здесь в этом вопросе: Получить событие выхода из системы

4
ответ дан 4 December 2019 в 11:08
поделиться

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

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

7
ответ дан 4 December 2019 в 11:08
поделиться

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

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

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

3
ответ дан 4 December 2019 в 11:08
поделиться

Что вам нужно, так это реализация 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
ответ дан 4 December 2019 в 11:08
поделиться

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

0
ответ дан 4 December 2019 в 11:08
поделиться

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

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

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

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

3
ответ дан 4 December 2019 в 11:08
поделиться

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

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

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

1
ответ дан 4 December 2019 в 11:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: