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.