2011-12-22 10 views
19

問題の実行中にロックから:
を私はダッシュボードとして機能WPF fullscreenアプリケーションを、持っています。コンピュータはドメインとドメインのポリシーに属しているため、最後のユーザー操作の10分後にコンピュータがロックされます。ワークステーション(またはデスクトップ)が自動的にロックされないようにしたい。
このような動作の例:Windows Media Playerは、ムービーの実行中にこれを防止します。防ぐWindowsワークステーション(デスクトップ)WPFプログラム

既知の解決策(ちょっと回避策):

  1. それは時間のすべての固定間隔send a Win32 Mouse Move eventすることが可能である(例えば、毎分)
  2. プログラムにキーを送信することが可能です(例えば、 "左Shift" キーアップ)時間毎一定間隔(例えば、毎分)

QUESTION:
これらの回避策を使用せずにWindowsワークステーションがロックされないようにするにはどうすればよいですか?

免責事項:
は、私は同様の質問がStackOverflowの上のどこかに答えがあるはず、かなり確信していたが、私はいずれかを見つけることができませんでした。あなたが私を正しい方向に向けることができれば、私は感謝します。

+4

あなたは、Win32を探している[ 'SetThreadExecutionState()'関数](http://msdn.microsoft.com/en-us/library/windows/デスクトップ/ aa373208.aspx)。しかし、よりよい解決策はグループポリシーです。 –

+0

ああ、素晴らしい!それを回答として投稿できますか? –

+0

また、これをリンクとして追加することもできます。http://pinvoke.net/default.aspx/kernel32.SetThreadExecutionState –

答えて

21

ソリューションは、コメントを通じて指摘されているが、私はウェブ検索を経由して到着した他の誰のための簡単なスターターソリューションを提供しています:

/// <summary> 
/// Interaction logic for App.xaml 
/// </summary> 
public partial class App : Application 
{ 
    [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
    static extern EXECUTION_STATE SetThreadExecutionState(EXECUTION_STATE esFlags); 

    public App() 
    { 
     InitializeComponent(); 

     App.Current.Startup += new StartupEventHandler((sender, e) => 
      { 
       SetThreadExecutionState(EXECUTION_STATE.ES_DISPLAY_REQUIRED | EXECUTION_STATE.ES_CONTINUOUS); 
      }); 
     App.Current.Exit += new ExitEventHandler((sender, e) => 
      { 
       SetThreadExecutionState(EXECUTION_STATE.ES_CONTINUOUS); 
      }); 
    } 
} 

[FlagsAttribute] 
public enum EXECUTION_STATE : uint 
{ 
    ES_AWAYMODE_REQUIRED = 0x00000040, 
    ES_CONTINUOUS = 0x80000000, 
    ES_DISPLAY_REQUIRED = 0x00000002, 
    ES_SYSTEM_REQUIRED = 0x00000001 
    // Legacy flag, should not be used. 
    // ES_USER_PRESENT = 0x00000004 
} 

内にあるロジックを置くための代替場所をメインアプリケーションウィンドウのStateChangedのイベントハンドラ:

this.StateChanged += new EventHandler((sender, e) => 
    { 
     if (WindowState == System.Windows.WindowState.Maximized) 
     { 
      SetThreadExecutionState(EXECUTION_STATE.ES_DISPLAY_REQUIRED | EXECUTION_STATE.ES_CONTINUOUS); 
     } 
     else 
     { 
      SetThreadExecutionState(EXECUTION_STATE.ES_CONTINUOUS); 
     } 
    }); 
関連する問題