Esconder la ventana de una aplicación cónsola

3490 vistas

En Win9x y NT podemos usar la función [/b]ShowWindow[/b] juntamente con FindWindows del API. [/b]ShowWindow[/b] en este caso esconde la ventana de la cónsola en la pantalla, en la barra de herramientas y en el gestor de programas. En un entorno NT usando las "policies" podremos evitar que un usuario pueda cerrar esta aplicación cónsola.



delphi
  1. var
  2.   NuevoTitulo: String;
  3.   AntiguoTitulo: Array[0..512]of char;
  4. begin
  5.   // memoria del título en curso de la ventana
  6.   GetConsoleTitle(PChar(@AntiguoTitulo), SizeOf(AntiguoTitulo));
  7.   // construir un nombre único
  8.   NuevoTitulo := Format('%d%d', [GetTickCount, GetCurrentProcessId]);
  9.   // damos el título único a la cónsola
  10.   SetConsoleTitle(Pchar(NuevoTitulo));
  11.   Writeln('ocultar ventana');
  12.   // espera para asegurarnos que el título se ha actualizado. MÃnimo Sleep(40)
  13.   Sleep(2000);
  14.   // Ocultar ventana
  15.   // FindWindows obtiene el handle.
  16.   ShowWindow( FindWindow(NIL, PChar(NuevoTitulo)), SW_HIDE);
  17.  
  18.   Writeln('mostrar la ventana');
  19.   Sleep(2000);
  20.   // muestra la ventana escondida anteriormente
  21.   ShowWindow( FindWindow(NIL, PChar(NuevoTitulo) ), SW_SHOW);
  22.   // reasignamos título original
  23.   SetConsoleTitle(PChar(@AntiguoTitulo));
  24. end.



En Windows XP y 2003 sólo podemos usar la función GetConsoleWindow junto a la función ShowWindow.



delphi
  1. function GetConsoleWindow:HWnd;Stdcall; external 'Kernel32.dll';
  2. var
  3.   Titulo: Array[0..512] of char;
  4. begin
  5.   // guardar el título de la ventana
  6.   GetConsoleTitle(PChar(@Titulo), SizeOf(Titulo));
  7.   ...
  8.   ShowWindow(GetConsoleWindow, SW_HIDE);
  9.   ...
  10. end.



Queda otra posibilidad y es crear un programa cónsola y modificar la directiva $APPTYPE. Reemplazando únicamente la directiva {$APPTYPE CONSOLE} por {$APPTYPE GUI}, habremos terminado.

Nota: en este caso los handles estándars usados para las funciones Write y Read no estarán accesibles. Usarlos probocará errores en la ejecución.

El código ha sido probado en Windows 98 SE, NT, W2K y XP.