¿Cómo hacer el sistema de formularios modal usando C #?

Necesito mostrar la forma como nivel superior de todo el sistema, por ejemplo, sobre / todas / otras ventanas en la pantalla. Me doy cuenta de que esto suele ser una mala práctica de UI, pero tengo en mente un escenario muy específico.

Tenemos la intención de utilizar PC con Windows normales para registradores de efectivo POS. Hay una opción en la pantalla para abrir el cajón de efectivo. Sería bastante malo para alguien simplemente presionar algo en una pantalla y obtener acceso al dinero cuando el empleado no está mirando. Así que equipamos las PC con lectores RFID y cada empleado tiene su propia tarjeta RFID que se utilizará para la autenticación.

Sin embargo, necesito un mecanismo para bloquear la computadora (o hacerla inutilizable) cuando el empleado se va. Cerrar la sesión parece ser demasiado molesto.

Cualquier idea bienvenida.

LP, Dejan

Bueno, después de un día de prueba y error llegué a una especie de solución.

Implica los siguientes pasos:

1. Cuando se presiona el botón “Bloquear”, se crea nuevo (vacío) / desktop /. El progtwig se ejecuta en este escritorio con el formulario de pantalla completa y el procedimiento de inicio de sesión. No hay nada más para cambiar o ejecutar en este escritorio.

2. El administrador de tareas está deshabilitado a través del registro. Por supuesto, alguien no invitado todavía puede acceder al menú Ctrl-Alt-Delete, pero no hay nada de daño particular que pueda hacer allí.

3. Alt-F4 y tales están deshabilitados.

4. Cuando se realiza la autenticación, el progtwig vuelve al escritorio original y todo continúa de la forma habitual.

Hay algunos P / Invocación requeridos, por supuesto. Si alguien quiere hacer algo similar, tal vez encuentre útil el ejemplo de mis huesos desnudos – enlace de texto

LP, Dejan

Creo que deberás considerar llamar a la API de Win32 para lograr esto.

Tendrá que mirar en:

ShowWindow y SetWindowPos

e invocarlos con un código similar al siguiente (tenga en cuenta que se trata de un pseudo-código):

[DllImport("user32.dll")] static extern bool ShowWindow(IntPtr hWnd, int nCmdShow); static void ShowTopmost(Form frm) { ShowWindow(frm.Handle, SW_SHOWMAXIMIZED); SetWindowPos(frm.Handle.ToInt32(), HWND_TOPMOST, 0, 0, [width of desktop], [height of desktop], SWP_SHOWWINDOW); } 

El formulario tiene una propiedad TopMost.

establecer Form.TopMost = true