web-dev-qa-db-ja.com

Windows 7でスリープする前にタスクをスケジュールし、タスクが実行されるまでスリープイベントを保留します

これは私が見つけた他の質問(私は検索しました)とは異なることに注意してください: ラップトップの蓋を閉じるときに何かを実行する方法はありますか?

イベント#42(System、Kernel-Power、Event 42)でタスクをスケジュールするのと同じトリックを使用しましたが、問題は、タスク(少なくとも私の場合)が実際には前に実行されないことです。 寝る。スケジュールがそれを実行し、同時にスリープ状態になるようです。タスクの実行に時間がかかる場合は、頑張ってください。

私は次のようなバッチファイルを持っています:

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

私のタスクはnot実行されてからスリープ状態になります。 LEDが消え、HDDが1秒以内にカチッという音がするので、マシンはすぐにスリープ状態になりますが、スリープ状態になる前に3秒間保持したかったのです。

スケジューラーによって開始されたタスクがスリープイベントを延期していないようです-そしてそれには正当な理由があります(タスクがハングした場合はどうなりますか?)-しかし私の場合、これは残念です!

上記のように機能させるが、イベント42によってトリガーされる方法を知っている人はいますか?

乾杯

注:最初にSkypeを強制終了し、待機してからスリープイベントを送信するバッチ/プログラム/タスクを作成できることはわかっていますが、イベント42を使用してトリガーできます。他のユーザーは、Skypeが別のアカウントで実行されているときにこのマシンにログオンし、カスタムバッチ/プログラムではなく、スタートメニューの通常のスリープエントリを使用してスリープ状態に送信します。

NOTE2も、Windows\System32にあるtaskkillとsleepのフルパスで試行されました。これにより、Skype.exeが強制終了され、2秒間待機してから、Skype.exeが強制的に強制終了され、さらに1秒間待機します。これは、Skype for Win 7 x64のバグが原因で、スリープから復帰した後にSkypeがハングします。マイクロソフトがこの非常に古くてイライラするバグを修正するのを待つのではなく、私は自分自身の修正を実装したかったのです。

5
Normadize

イベント42は、通知beforeではなく、後続の診断の「ドキュメント」として意図されているため、発生が遅すぎます(プロセスの最後で、有用なことを行う時間がありません)。 /物事が起こります。 (MSFTモデレーターがどのようにできるのかわかりません アドバイス ?)

残念ながら、私はあなたの問題に対する実用的な解決策を見ていませんが、Windowsdoesは、イベントログにはありませんが、イベント前の通知を提供すると確信しています。これは、このスタンバイ前の通知をキャッチして、好きなことを実行する、常に実行されるバックグラウンドアプリケーション(〜「デーモン」)を作成/使用する必要があることを意味します。
これを実行できる既存のアプリケーションを認識していません。また、関連するWindowsAPIも認識していません。しかし、より良い答えが提供されるまで、解決策を見つけるのに役立つかもしれないいくつかの出発点があります:

更新:

MicrosoftがXPおよびVistaで許可した PBT_APMQUERYSUSPEND を廃止したため、「スリープイベントを延期する」方法はありません。代わりに 今はそう言っています ユーザーがコンピューターをスリープ状態にするのを防ぐことはできません。

アプリケーションは、ユーザーがラップトップの蓋を閉じるか、電源ボタンを押したときに特定の動作を期待することを尊重する必要があります。

PBT_APMSUSPEND イベントのみが残り、その後は

システムは、アプリケーションがこの通知を処理するのに約2秒かかります。

4
robert4