8

電源ボタンが押されたときに PC のシャットダウン/再起動を制御する必要があるキオスク スタイルのアプリケーションに取り組んでいます。この投稿のおかげで、私はそこまでの道のりの約 90% を達成しています。

  1. コントロール パネルで、acpi 電源ボタンを押すアクションをシャットダウンに設定します。
  2. WndProc メッセージ WM_QUERYENDSESSION をリッスンします。
  3. 受け取ったときに、完全に文書化されていない問題が発生します。

    [DllImport("user32.dll", SetLastError = true)]
    static extern int CancelShutdown();
    
  4. WndProc から戻り、独自のメッセージ ボックスを表示して、ユーザーにシャットダウン/再起動またはキャンセルを求め、ユーザーのアクションに応答します。

タスクバーから起動/シャットダウンを行うと、すべてがうまく機能します(必要なだけ速く論文を発行できます)。電源ボタンを初めて押したときも、すべて正常に機能します。その後電源ボタンを押すと、WM_QUERYENDSESSION メッセージを受け取るまでに 1 分ほどの遅延が見られます。

Windows が ACPI イベントを発行する頻度に関する設定またはレジストリ エントリはありますか? Linuxでは、同じマシンがボタンを押すのと同じ速さでACPIイベントを発生させるため、ハードウェアではないことはわかっています。

ありがとう。

4

2 に答える 2

3

職場でのお願いで、この質問を Microsoft サポートに直接伝えることができました。3 人目のサポート エンジニアでは、基本的に、これはアプリケーション レベルでは不可能であると言われました。CancelShutdown()文書化されていないものを呼び出すと、パワー マネージャまたは acpi ドライバが「混乱」し、WM_QUERYENDSESSIONメッセージの遅延が発生するというのが彼の信念でした。これCancelShutdown()は文書化されていないため、MS はこれ以上調査するつもりはありません。

では、どのように電源ボタンを押すようにフックしますか? デバイス ドライバー、具体的にはACPI Filter Driverを作成する必要があります。これについては現在調査中です。

于 2013-05-17T14:25:03.210 に答える
0

ハードウェアの製造元に相談するか、スタートボタンを配線して、これを処理するハードウェアに信号を送信しないようにしない限り、それは不可能だと思います。あなたはそれを遅らせることしかできませんが、それでも100%の保証は得られないと思います.

Windows 8.1 では (おそらく) キオスク モードが導入される予定です。多分それはあなたが探しているものです;-)

于 2013-05-01T20:56:33.530 に答える