2011-12-22 17 views
19

Edición:
que tiene una aplicación de WPF fullscreen, que actúa como un tablero de instrumentos. La computadora está en dominio y las políticas de dominio hacen que la computadora se bloquee en 10 minutos después de la última actividad del usuario. Quiero evitar que la estación de trabajo (o escritorio) se bloquee automáticamente.
Un ejemplo de este tipo de comportamiento: Windows Media Player, que impide esto mientras se está ejecutando una película.evitar que Windows estación de trabajo (escritorio) se bloqueen durante la ejecución de un programa WPF

soluciones conocidas (un poco Soluciones provisionales):

  1. Es posible send a Win32 Mouse Move event cada intervalo fijo de tiempo (por ejemplo, cada minuto)
  2. Es posible enviar una clave para el programa (por ejemplo, "Mayúsculas izquierda" tecla de arriba) cada intervalo fijo de tiempo (por ejemplo, cada minuto)

PREGUNTA:
¿Cómo puedo evitar que la estación de trabajo de Windows se bloquee sin usar estas soluciones?

responsabilidad:
estaba bastante segura, no debería haber contestado una pregunta similar en algún lugar en StackOverflow, pero no encontró ninguna. Te agradecería si pudieras dirigirme en la dirección correcta.

+4

Usted está buscando el Win32 [ 'SetThreadExecutionState()' función] (http://msdn.microsoft.com/en-us/library/windows/ desktop/aa373208.aspx). Pero la mejor solución es la Política de grupo. –

+0

¡Oh, genial! ¿Podrías publicar eso como una respuesta? –

+0

Quizás también desee agregar esto como un enlace: http://pinvoke.net/default.aspx/kernel32.SetThreadExecutionState –

Respuesta

21

La solución se ha señalado a través de los comentarios, pero estoy proporcionando una solución sencilla de arranque para cualquier otra persona que llega a través de una búsqueda en la Web:

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

un lugar alternativo para poner la lógica sería dentro de una controlador de eventos para StateChanged en la ventana principal de la aplicación:

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); 
     } 
    }); 
Cuestiones relacionadas