4

Обратите внимание, что это отличается от других вопросов, которые я нашел (я искал), например: Есть ли способ выполнить что-то при закрытии крышки ноутбука?

Я использовал тот же прием для планирования задачи для события № 42 (Система, Kernel-Power, Событие 42), но проблема в том, что задача - по крайней мере, в моем случае - на самом деле не выполняется перед сном. кажется, что расписание выполняет его и идет спать одновременно. если выполнение задачи занимает больше времени, то неудача.

У меня есть командный файл, который делает:

@echo off
cd /d %~dp0
taskkill /t /im skype.exe
sleep 2
taskkill /t /f /im skype.exe
sleep 1

Моя задача не выполняется перед сном. Машина сразу же переходит в спящий режим, так как я вижу, как гаснут светодиоды, и слышит щелчок жесткого диска менее чем за 1 секунду, тогда как я хотел, чтобы он удерживался в течение 3 секунд перед сном.

Кажется, что задачи, запущенные планировщиком, не задерживают событие сна - и для этого есть веские причины (что, если ваша задача зависает?), - но в моем случае это облом!

Кто-нибудь знает способ заставить его работать так, как задумано выше, но при этом срабатывает событие 42?

ура

ПРИМЕЧАНИЕ. Я знаю, что могу создать пакет / программу / задачу, которая сначала убивает скайп, ждет, а затем отправляет событие Sleep, но я хотел бы иметь возможность запустить его с помощью Event 42. Другие пользователи иногда входят в систему на этом компьютере, когда Skype работает под другой учетной записью, и они отправляют его в спящий режим, используя обычную запись режима ожидания в меню «Пуск», а не пользовательский пакет / программу.

NOTE2 также пробовал с полными путями для taskkill и sleep, которые находятся в Windows\System32. Это убивает Skype.exe, затем ждет 2 секунды, затем принудительно убивает Skype.exe и затем ждет еще 1 секунду. Это связано с ошибкой в Skype для Win 7 x64, которая зависает после выхода из режима сна. вместо того, чтобы ждать, пока Microsoft исправит эту очень старую и расстраивающую и о чём-то чрезмерно сообщаемую ошибку, я хотел реализовать собственное исправление.

1 ответ1

3

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

К сожалению , я не видел рабочее решение вашей проблемы, но я уверен , что Windows , не предусматривает уведомления до наступления события, хотя и не в журнале событий. Это означает, что вам нужно создать / использовать постоянно работающее фоновое приложение (~ "демон"), которое перехватывает это предварительное уведомление и затем делает все, что вам нравится.
Я не знаю ни о существующем приложении, которое может это сделать, ни о соответствующих API-интерфейсах Windows; но пока не будет получен лучший ответ, вот некоторые отправные точки, которые могут помочь вам в разработке решения:

ОБНОВИТЬ:

Нет никакого способа «отложить событие сна», потому что Microsoft прекратила PBT_APMQUERYSUSPEND, который позволял это в XP и Vista. Вместо этого теперь говорится, что вы не можете запретить пользователю переводить компьютер в спящий режим:

Приложения должны учитывать, что пользователь ожидает определенного поведения, когда закрывает крышку ноутбука или нажимает кнопку питания.

Оставалось только событие PBT_APMSUSPEND , после которого

Система предоставляет приложению около двух секунд для обработки этого уведомления.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .