Hacer invisible un formulario

Published 127 weeks, 3 days ago
Wed Jan 25 2006
Otro truco interesante, que me tuvo un poco martirizado hasta que lo encontré, es el siguiente. Imaginaos que estamos desarrollando una aplicación que va a residir en el área de notificación de Windows. Hay multitud de tutoriales en Internet al respecto, así que no profundizaré en ello. Pero un pequeño detalle me traía por la calle de la amargura: cuando hacía ALT+TAB, en la lista de ventanas disponibles aparecía la de mi aplicación; a pesar de ser invisible. Y yo sólo quería que la aplicación apareciera como visible,... bueno, pues cuando realmente fuera visible, si me perdonáis la perogrullada.

Tras mucho navegar, encontré lo siguiente:
//Impide que la aplicación sea visible al hacer ALT+TAB
private const int GWL_EXSTYLE (-20);
private const int 
WS_EX_TOOLWINDOW 0x80;
private const int 
WS_EX_APPWINDOW 0x40000;

[DllImport("user32", CharSet=CharSet.Auto)]
private static extern int GetWindowLong(IntPtr hWnd, int nIndex);

[DllImport("user32", CharSet=CharSet.Auto)]
private static extern int SetWindowLong(IntPtr hWnd, int nIndex, int
    
dwNewLong);

private void 
frmMain_Activated(object sender, EventArgs e)
{
    SetWindowLong(
this.Handle, GWL_EXSTYLE, (GetWindowLong(this.Handle,
        GWL_EXSTYLE) | WS_EX_TOOLWINDOW) & ~WS_EX_APPWINDOW)
;
}

Colorized by: CarlosAg.CodeColorizer

Como podéis ver, este código API de Win32 lo único que hace es aplicar un estilo determinado a la ventana actual. Llamar a la API en el evento Activated del form asegura que la aplicación será invisible desde un buen principio. Por cierto, que esto está probado con una aplicación que tiene dos formularios, y el inicial sólo sirve para contener el menú contextual y el icono de la bandeja de notificación, por lo que nunca será necesario que sea visible.

La aplicación en concreto es una pequeña utilidad que sirve para rotar periódicamente el fondo de escritorio de Windows, y alguna otra cosilla hace, y que lleva rondando por mis equipos un montón de tiempo. Está casi terminada, al menos la versión 1.0, pero a ver cuándo tengo tiempo de adecentarla para poder enseñarla.

No ejecutar más de una vez el mismo proceso

Published 127 weeks, 3 days ago
Wed Jan 25 2006
Todos sabemos que, normalmente, el punto de arranque de una aplicación WinForms es la función Main(). Un pequeño truco que nos puede quitar muchos quebraderos de cabeza más adelante es impedir activamente que una aplicación pueda ejecutarse más de una vez. Para ello, podemos usar el siguiente código:

/// <summary>
///Punto de entrada de la aplicación
/// </summary>
[STAThread]
static void Main() 
{
if(Process.GetProcessesByName(
   Process.GetCurrentProcess().ProcessName).GetUpperBound(
0)==0)
   {
      Application.Run(
new frmMain());
   }
}

Colorized by: CarlosAg.CodeColorizer

La clave de todo esto está en la clase Process. Perteneciente al espacio de nombres System.Diagnostics, una de sus utilidades es obtener el nombre del proceso actual (mediante Process.GetCurrentProcess().ProcessName, que devuelve un tipo string) y otra es la de obtener todos los procesos de un determinado nombre (Process.GetProcessesByName, que devuelve un array de objetos Process). Efectivamente, lo que hace el if() en esa línea es buscar el proceso que estamos arrancando en la lista de procesos en uso en la máquina y si no lo encuentra, o lo que es lo mismo el tamaño del array devuelto por GetProcessesByName es 0, arranca la aplicación.

Una nueva esperanza

Published 127 weeks, 5 days ago
Mon Jan 23 2006
Bueno, pues después de un tiempo dándole vueltas aquí estoy: nuevo blog, dominio propio, nuevo motor de blog y nuevas ganas de convertir esto en algo más que las divagaciones de un picacódigos estándar.

La idea es hacer de Picacódigos un espacio mucho más técnico de lo que era antiguamente, sin que ello impida el que siga hablando de otras cosas. Me explico: el estar alojado en un servidor y no depender de Blogger ni de ningún otro motor externo me permitirá, además de introducir las entradas habituales en cualquier blog, el colgar entradas más largas con artículos o tutoriales o incluso ejemplos de código.

Ésa es, al menos, la intención.

En todo caso, sed todos bienvenidos a este nuevo alojamiento. Todavía quedan cosas por hacer, páginas por subir, el layout de la página y demás (sobre todo lo notaréis los que abráis esta página con FireFox), y actualizar el blogroll, subir iconitos, enlaces a Last.fm y esas cosas. Pero poco a poco iré haciendo de ella lo que quiero que sea.