2011-12-22 10 views
19

Issue:
Mam aplikacji WPF fullscreen, który działa jako deski rozdzielczej. Komputer jest w domenie, a zasady domeny wymuszają zablokowanie komputera w 10 minut po ostatniej aktywności użytkownika. Chcę uniemożliwić automatyczną blokadę stacji roboczej (lub pulpitu).
Przykład takiego zachowania: Windows Media Player, który zapobiega temu podczas działania filmu.Prevent systemu Windows Workstation (pulpit) od blokowania podczas uruchamiania programu WPF

znanych rozwiązań (kinda Obejścia):

  1. Możliwe jest send a Win32 Mouse Move event wszelkich stałych odstępach czasu (na przykład co minutę)
  2. Jest możliwe, aby wysłać klucz do programu (na przykład „Lewy Shift” w górę) każdy ustalony przedział czasu (na przykład co minutę)

PYTANIE:
Jak mogę zapobiec blokowaniu stacji roboczej Windows bez korzystania z tych obejść?

Zastrzeżenie:
Byłam pewna, nie powinno być podobne pytanie odpowiedział gdzieś na StackOverflow, ale nie znaleźliśmy żadnych. Byłbym wdzięczny, gdybyś mógł wskazać mi właściwy kierunek.

+4

szukasz Win32 [ 'SetThreadExecutionState()' funkcja] (http://msdn.microsoft.com/en-us/library/windows/ desktop/aa373208.aspx). Ale lepszym rozwiązaniem są zasady grupy. –

+0

Och, świetnie! Czy możesz to opublikować jako odpowiedź? –

+0

Możesz również dodać to jako link: http://pinvoke.net/default.aspx/kernel32.SetThreadExecutionState –

Odpowiedz

21

Rozwiązanie zostało wskazane przez komentarze, ale ja zapewniając proste rozwiązanie rozrusznika dla nikogo przybywającego za pośrednictwem wyszukiwarki internetowej:

/// <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 
} 

alternatywnego miejsca, aby umieścić logiki byłby w ramach obsługi zdarzeń dla StateChanged na okna głównego aplikacji:

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); 
     } 
    }); 
Powiązane problemy