Pregunta

Estoy tratando de escribir un programa simple para mi hermano pequeño. Está detrás de su computadora muchas veces, pero debería estar aprendiendo aritmética simple para la escuela: D

Quiero hacer el siguiente programa:

  • Él inicia su computadora
  • Necesita hacer algunos ejercicios simples y completar
  • Si hizo una cantidad X correcta, puede continuar usando su computadora.

¿Hay una forma simple (no necesita estar muy limpia XD) de bloquear su computadora hasta que mi programa dice que puede hacerlo?

PD (no me refiero al bloqueo como en el mecanismo estándar en Windows)

PPS no es necesario ser súper alta tecnología, solo que un usuario de computadora promedio no puede omitirlo cerrando el software: P

¿Fue útil?

Solución

Necesita algún tipo de diálogo modal del sistema (que no se admite formalmente desde Win Nt 4 (por algunas buenas razones). Sin embargo, hay este blog Eso te muestra cómo aún puedes lograr lo mismo.

Otros consejos

Si esto es más relevante, entonces una forma simple de bloquear la computadora para bien sin usar ningún gancho es hacer lo siguiente:

Primero, cree el Form_LostFocus EventHandler. Esto no está en la ventana Propiedades-> Eventos, por lo que tendrá que agregarla programáticamente:

this.LostFocus += new ...

Esto se llama cuando el FROM se enfoca, por lo que aquí debemos enfocarnos en el formulario:

this.Focus();
this.Activate();

Este método funciona mejor si el enfoque se da a un control en el formulario:

textBox1.Focus();

Luego, agregue un temporizador, con un intervalo de 100 ms, y habilitelo. Este temporizador verificará si el formulario tiene enfoque y, si no, le dará enfoque:

// in the Tick Eventhandler
if (!this.Focused)
    this.Focus();

Esto garantizará efectivamente que no importa lo que su usuario tenga que hacer, el programa siempre robará el enfoque, incluso si abre el administrador de tareas.

Luego, simplemente haga el programa Fullscreen: Establezca la propiedad 'Topmot' en verdadera. Establezca 'WindowState' en 'Maximizado'. Establezca 'FormBorderStyle' en 'Ninguno'.

Finalmente, maneje el Form_closing EventHandler.

// Global boolean value - set this to true when 
// the user has completed the set tasks
boolean complete = false;

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
    if (!complete)
        e.cancel = true;
}

Tenga en cuenta: en general, robar el enfoque es una práctica extremadamente mala.

Busque inspiración en el código para bizcocho, específicamente aquí y aquí. Es una aplicación para bebés/niños pequeños escritos por Scott Hanselman que bloquea el escritorio razonablemente bien. Probablemente pueda reutilizar algunas de las ideas allí.

Mi solución para mi hijo era crear una aplicación WPF de pantalla completa gigante con todas las barras de herramientas eliminadas, etc. y cargarla en el inicio. Como no había una forma visible de cerrarlo, no tenía idea de cómo cerrarlo, por lo que volvería a la cama. Finalmente aprendió a evitarlo, pero funcionó para él durante una feria.

No fue muy difícil de armar, y podría haber implementado algunas tácticas más para obtener su entrada de pantalla y detenerla si intentaba cerrarla, pero eso no era necesario cuando descubrió cómo evitarlo.

Con una aplicación WPF de pantalla completa, debería poder generar sus preguntas de matemáticas en un formato interesante si lo desea.

Si quieres algo rápido (aunque creo que Eddy y Jeroenh tienen respuestas de calidad) puedes hacerlo sin Winapi/Inerop, solo usa trucos de ventana.

Primero crea una propiedad HasCompletedTasks en tu Form, establecerlo en verdad cuando ha hecho sus cuestionarios:

public bool HasCompletedTasks { get; set; }
public void CompleteAndClose()
{
    //if (File.Exists(_fileName))
    //    File.Delete(_fileName);
    HasCompletedTasks = true;
    Close();
}

Ahora evite que la ventana cierre:

protected override void OnClosing(CancelEventArgs e)
{
    base.OnClosing(e);
    e.Cancel = !HasCompletedTasks;
}

Siguiente en el diseñador de formulario establecer el FormBorderStyle a None, la WindowState a Maximized y TopMost a True, o simplemente pegar este código justo debajo InitializeComponent();:

this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
this.WindowState = FormWindowState.Maximized;
this.TopMost = true;

// const string MonitorFolder = "C:\\TasksNotDone";
// Directory.CreateDirectory(MonitorFolder);
// _fileName = Path.Combine(MonitorFolder, DateTime.Now.ToFileTimeUtc().ToString() + ".txt");
// File.WriteAllText(_fileName, DateTime.Now.ToString());

Si desea ser alertado si él descubre cómo cerrarlo (Ctrl+Alt+del), puede dejar archivos en el sistema que puede buscar (y regañarlo en consecuencia). Descoplamiento de las líneas en muestras para habilitar esto.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top