2009-05-05 17 views
1

私のアプリケーションはC#で動作し、サードパーティのフレームワークを使用しています。多くのapplication.my質問のUIとして機能します。私のアプリケーションが実行され、システムがスタンバイ/ハイバネーションのOS操作をしてはいけません。どういうわけか、私はOS/OSによって提起されたスタンバイ/ハイバネーションのイベントをキャンセルしなければなりません。 Sunはスタンバイおよび休止状態を解除するにはどうすればよいですか?

+0

ユーザーが手動で電源設定を行うことを強くお勧めします。私たちは人々がデータを失い、アプリケーションが突然その寿命が非常に重要であると考えて翌日にはバッテリーが完全に消耗したときに、コンピュータを外出していないようにしました。誰かがアプリケーションを閉じるのを忘れる/無視する可能性が最も低い場合でも、コンピュータを役に立たなくすることによって恩恵を返さないことは非常に重要です。 –

答えて

1

.NET内からイベントをキャンセルする方法はありません

感謝。 WM_POWERBROADCASTを処理してBROADCAST_QUERY_DENYを返すことによって、P/InvokeとWin32 APIでそれを行う必要があります。正しい方向への押しのためにthis CodeGuru pageを見てください。

また、ユーザーがログオフまたは中断/休止状態になったときに.NETで発生するイベントの詳細については、this pageがあります。

+0

こんにちはLC Iユーザーfollwingコード 保護オーバーライドボイドのWndProc(REF System.Windows.Forms.MessageのM) .... m.Result =新規のIntPtr((INT)WindowMessage.BROADCAST_QUERY_DENY)。 .... リターン 私は、二次ウィンドウでコードを使用するときにこれが働いている(私のアプリでは、二次は、C#ウィンドウですウィンドウです) 主ウィンドウは、データを使用して、私が作成されたバックエンドapplication.iから持っていますこの方法をオリマーウィンドウ部分に使用する。 私は 'wndproc'メソッドがalllowedされていないファイルで使用する必要があります。 任意のアイデア ありがとう 日 –

+0

私は100%プライマリとセカンダリのウィンドウであなたに従うことはわかりませんが、任意の "ウィンドウ"(Windows.Forms.Form)はメッセージループとWndProcコールバックを持つ必要があります。 Application.Run()を持っているフォームにコードを入れてください。 それ以外の場合は、そこに座ってこのメッセージを待ち受ける小さな隠しフォームを作成できます。 –

+0

こんにちは 私はそれを短くします ウィンドウはフレームワーク内で描画されますフレームワークが最初に私たちはフレームワーク上で制御を開始することを意味します。 フレームワークはメニューを持っていて、アプリケーション名を含んでいます paricular menu対応のアプリケーションは、ウィンドウを描画するためのデータを送信します。windowsを描画するために必要なすべての詳細をwindowsに通知します。フレームワーク。 –

4

blog postには、SetThreadExecutionStateを使用してPCがスリープ状態になるのを防ぐ方法が記載されています。コードは次のようになります。

public partial class Window1 : Window 
{ 
    private uint m_previousExecutionState; 

    public Window1() 
    { 
     InitializeComponent(); 

     // Set new state to prevent system sleep (note: still allows screen saver) 
     m_previousExecutionState = NativeMethods.SetThreadExecutionState(
      NativeMethods.ES_CONTINUOUS | NativeMethods.ES_SYSTEM_REQUIRED); 
     if (0 == m_previousExecutionState) 
     { 
      MessageBox.Show("Call to SetThreadExecutionState failed unexpectedly.", 
       Title, MessageBoxButton.OK, MessageBoxImage.Error); 
      // No way to recover; fail gracefully 
      Close(); 
     } 
    } 

    protected override void OnClosed(System.EventArgs e) 
    { 
     base.OnClosed(e); 

     // Restore previous state 
     if (0 == NativeMethods.SetThreadExecutionState(m_previousExecutionState)) 
     { 
      // No way to recover; already exiting 
     } 
    } 
} 

internal static class NativeMethods 
{ 
    // Import SetThreadExecutionState Win32 API and necessary flags 
    [DllImport("kernel32.dll")] 
    public static extern uint SetThreadExecutionState(uint esFlags); 
    public const uint ES_CONTINUOUS = 0x80000000; 
    public const uint ES_SYSTEM_REQUIRED = 0x00000001; 
} 

あなたがポストに記述されたアプリケーションのような場合は、更新されたバージョンhereあります。

0

Powercfgおよびshutdown(特に、システムシャットダウンを中止するのにshutdown /a)が有用である可能性があります。

関連する問題