1

ユーザー モード モジュールと連携して実行されるサービス アプリケーションがあります。このソフトウェアを使用すると、ユーザー モード コードが最初に Windows ユーザーをログオフし、その直後にサービス アプリケーションがシステムをスリープ モードにする特殊な電源操作を実行できます。

このシナリオは、一部のシステムでは正常に機能しますが、他のシステムではスリープ操作が失敗します。スリープが成功することもありますが、システムを起動して再度実行しようとすると、スリープ API (SetSuspendState) がハングアップし、システムが動作している間は戻りません。

テストを行っている間、ほとんどのシステムで問題を解決しているように見える (Sleep(5000) API を使用して) ハードコーディングされた遅延を設定しましたが、他のシステムでも同じ結果が得られます。この場合、問題を実際に解決しないか、そもそもなぜそれが起こったのかという質問に答えないため、より長い遅延を導入するのは嫌いです. さらに、10 秒でも十分ではない「遅い」システムがあると確信しています...

では、スリープ API でこれらの障害を修正する方法を知っている人はいますか?

PS。最新バージョンの Windows 7 でテストを実行します。

4

3 に答える 3

1

利用SystemEvents Classしてください..うまくいくことを願っています..

Microsoft.Win32.SystemEvents.SessionEnded+=
                       new SessionEndedEventHandler(SystemEvents_SessionEnded);

そしてハンドラメソッド..

private void SystemEvents_SessionEnded(object sender, SessionEndedEventArgs e)
{
    if (e.Reason == SessionEndReasons.Logoff)
    {
        //this may sleep the system even when user logs off manually.
        Application.SetSuspendState(PowerState.Suspend, true, true);
    }
}

using Microsoft.Win32;名前空間をインポートする必要があります

于 2012-10-19T07:46:06.697 に答える
0

システムのスリープをブロックしている何かがある可能性があります。ドライバーはシステムのスリープを禁止でき、一部のシステムは単にスリープできません。

SetSuspendStateが動作しない状況に遭遇した場合は、「powercfg-energy」および「powercfg-requests」を実行します。このユーティリティは睡眠の問題を診断するのに非常に便利なので、「powercfg /?」もチェックする必要があります。それのすべてを見るには特別な力があります。

于 2012-10-19T05:11:47.653 に答える
-1

この解決策がうまくいったので、これを自分の質問への回答として投稿する必要があります。ちょっと面倒なアプローチなので、誰かが別の解決策を投稿していただければ幸いです。

つまり、ユーザーをログオフする前に、セッション ID を収集する必要があります。次に、ユーザー アカウントがログオフするための API を発行します。その間、別のスレッドからの WTS_SESSION_LOGOFF 通知をリッスンして待機し、セッション (以前に収集されたもの) がログオフされるまで待機する必要があります。

しかし、それだけではありません。なんらかの不明な理由 (ドキュメントを見つけることができませんでした) により、その後、WTSConnected 状態でユーザー名のないセッションを待つ必要があります。そうして初めて、スリープまたは休止状態のために SetSuspendState を呼び出すことができます。

于 2012-10-31T05:40:23.643 に答える