Microsoft MVP

Email y Rss

email rss

Klout

Seguidores en facebook

Timeline de mi Twitter

Tienes preguntas?

Ideas de un Conejo
Más allá de los sistemas de información: (C#)=> videojuegos, soluciones a problemas interesantes y Sistemas Operativos
XNA
C#
Sistemas Operativos
Varios
Windows Phone
WinRT
XAML
Azure
HTML 5
Acerca de

C# – Cmo modificar la transparencia en la ventana de otro proceso?

March 17th, 2010 by JuanK

Follow @JuanKRuiz

Hola, continuando con la solución a temas un poco escabrosos (nada más recordar el tema de la ventana sin borde que no se deja minimizar ni maximizar) tengo este caso particular en el cual se desea que al abrir un nuevo proceso desde nuestra aplicación la ventana de este nuevo proceso tenga cierto nivel de transparencia.

 

Desde luego para resolver este caso aplica una solución más genérica a través de la cual podamos acceder a cualquier proceso en ejecución y modificar la transparencia de su ventana.

Pero como llegamos a hacerlo? como siempre nuestra buena amiga la API de Windows viene al rescate (super coooooooooooooow to the rescueeeeeee ).

 

Pasos a Seguir

En su nivel más básico los pasos a seguir se resumen en:

  1. Determinar el proceso al que le convertiremos la ventana a ventana con transparencia
  2. Buscar un handler a la ventana de ese proceso
  3. Establecer la transparencia en esa ventana

El paso 1 es bastante sencillo y no requiere mayor explicación, utilizaremos para este ejemplo una rutina para abrir un nuevo proceso y obtener su pid.

private static int LanzarProcesos(string ejecutable)
{
    ProcessStartInfo psInfo = new System.Diagnostics.ProcessStartInfo(ejecutable);
    Process process = new Process();
    process.StartInfo = psInfo;
    process.Start();
    return process.Id;
}

 

El paso 2. Buscar el handler a la ventana de un proceso, tiene un poco más de trabajo.

 

Conseguir un Handler a la Ventana de un Proceso

Esta parte no estaba tan sencilla :P . Pero gracias a este otro hilo podemos implementar una función Win32APITools.GetProcessWindowHandler lo que nos será de mucha utilidad:

 

Otro Post en Ideas de un Conejo

 

Establecer la Transparencia en la Ventana

Para realizar esta tarea utilizaremos la función GetWindowLong para hallar el estilo de la ventana por medio de su handler, y así mismo haremos uso de SetWindowLong para modificar dicho estilo adicionándole a la ventana el atributo de ventana por capas (layered window).

Una vez se ha modificado la ventana para soportar ser dibujada con transparencia, se debe llamar a SetLayeredWindowAttributes, para indicarle a la ventana que cantidad de transparencia debe tener.

/// <summary>Indca estilo de la ventana</summary>
const int GWL_EXSTYLE = unchecked((int)0xFFFFFFEC);
/// <summary>Atributo etendido para ventana por capas</summary>
const int WS_EX_LAYERED = 0x00080000;
/// <summary>Atributo para establecer la transparencia con base a un byte de color alpha</summary>
const int LWA_ALPHA = 0x2;

/// <summary>
/// Establece una ventana como transparente
/// </summary>
/// <param name="hwnd" />handlder de la ventana
/// <param name="transparencia" />Nivel de transparencia: 0 transparente, 255 opaco
private static void EstablecerTransparenciaVentana(IntPtr hwnd, byte transparencia)
{
    //Obtener valor de la propiedad
    int dwStyle = GetWindowLong(hwnd, GWL_EXSTYLE);

    //Establecer estilo de ventanas por capas
    dwStyle = dwStyle | WS_EX_LAYERED;
    SetWindowLong(hwnd, GWL_EXSTYLE, dwStyle);
    //Establecer valor de transparencia
    SetLayeredWindowAttributes(hwnd, 0, transparencia, LWA_ALPHA);
}

Perfecto eso es todo lo que necesitamos, así que ahora es hora de integrarlo todo.

Implementación

Ahora el ejemplo final, si se ejecuta sin parámetros llama a la consola de comandos estableciendo su nivel de transparencia en 128, pasarle como parámetro otro ejecutable y otra cantidad de transparencia ( de 0 a 255 ) es opcional.

Estos son dos screenshots que muestran lo que se pude hacer(click para ver versión grande)

image

image

Y este es el código completo.

using System;
using System.Diagnostics;
using System.Runtime.InteropServices;

class Program
{
    #region Constantes de la API
    /// <summary>Indca estilo de la ventana</summary>
    const int GWL_EXSTYLE = unchecked((int)0xFFFFFFEC);
    /// <summary>Atributo etendido para ventana por capas</summary>
    const int WS_EX_LAYERED = 0x00080000;
    /// <summary>Atributo para establecer la transparencia con base a un byte de color alpha</summary>
    const int LWA_ALPHA = 0x2;
    #endregion Constantes de la API

    #region Interoperabilidad con la API
    /// <summary>
    /// Retorna una propiedad de una ventana
    /// </summary>
    /// <param name="hWnd" />handler dela ventana
    /// <param name="nIndex" />propiedad a retornar
    /// <returns>la propiedad especificada</returns>
    [DllImport("user32.dll")]
    private static extern int GetWindowLong(IntPtr hWnd, int nIndex);

    /// <summary>
    /// Cambia una propiedad de una ventana
    /// </summary>
    /// <param name="hWnd" />handler de la ventana
    /// <param name="nIndex" />propiedad a modificar
    /// <param name="dwNewLong" />nuevo valor de la propiedad
    /// <returns>el valor anterior de la propiedad,0 si error, cuando el valor anterior de la propiedad era 0 devuelve 0 
    /// tambien pero si se usa GetLastError para verificar este no dara 0</returns>
    [DllImport("user32.dll")]
    private static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);

    /// <summary>
    /// Establece opacidad y transparencia de una ventana de capas (layered)
    /// </summary>
    /// <param name="hwnd" />handler de la ventana
    /// <param name="crKey" />color key
    /// <param name="bAlpha" />valor de byte alpha
    /// <param name="dwFlags" />acción a realizar
    /// <returns>true si exitoso, false sino</returns>
    [DllImport("user32.dll")]
    static extern bool SetLayeredWindowAttributes(IntPtr hwnd, int crKey, byte bAlpha, uint dwFlags);
    #endregion Interoperabilidad con la API

    /// <summary>Valor de transparencia por defecto</summary>
    const int INT_TRANSP_INICIAL = 128;
    /// <summary>Aplicación por defecto</summary>
    const string STR_DEFAULT_APP = @"cmd.exe";

    static void Main(string[] args)
    {
        byte transparencia;

        if (args.Length > 1)
            transparencia = ConvertirArgumentoTransparencia(args[1]);
        else
            transparencia = INT_TRANSP_INICIAL;

        int pid;
        //Lanzar proceso
        if (args.Length > 0)
            pid = LanzarProcesos(args[0]);
        else
            pid = LanzarProcesos(STR_DEFAULT_APP);

        //Obtener el handler de la ventana del proceso
        IntPtr hwnd = Win32APITools.GetProcessWindowHandler(pid);

        //Colocar la ventana con la transparencia
        EstablecerTransparenciaVentana(hwnd, transparencia);
    }

    /// <summary>
    /// Lanza el proceso y retorna el Pid
    /// </summary>
    /// <returns>Id de Proceso</returns>
    private static int LanzarProcesos(string ejecutable)
    {
        ProcessStartInfo psInfo = new System.Diagnostics.ProcessStartInfo(ejecutable);
        Process process = new Process();
        process.StartInfo = psInfo;
        process.Start();
        return process.Id;
    }

    /// <summary>
    /// Convierte el parámetro de entrada en un valor de transparencia válido
    /// </summary>
    /// <param name="cantidadTransparencia" />Cantidad de transparencia: 0 transparente ,  255 opaco
    /// <returns>El valor de transparencia calculado</returns>
    private static byte ConvertirArgumentoTransparencia(string cantidadTransparencia)
    {
        byte transparencia;
        if (!byte.TryParse(cantidadTransparencia, out transparencia))
            transparencia = INT_TRANSP_INICIAL;

        return transparencia;
    }

    /// <summary>
    /// Establece una ventana como transparente
    /// </summary>
    /// <param name="hwnd" />hnandlder de la ventana
    /// <param name="transparencia" />Nivel de transparencia: 0 transparente, 255 opaco
    private static void EstablecerTransparenciaVentana(IntPtr hwnd, byte transparencia)
    {
        //Obtener valor de la propiedad
        int dwStyle = GetWindowLong(hwnd, GWL_EXSTYLE);

        //Establecer estilo de ventanas por capas
        dwStyle = dwStyle | WS_EX_LAYERED;
        SetWindowLong(hwnd, GWL_EXSTYLE, dwStyle);
        //Establecer valor de transparencia
        SetLayeredWindowAttributes(hwnd, 0, transparencia, LWA_ALPHA);
    }
}

Happy Learning.

Print Friendly

Follow @JuanKRuiz

  • 2 Comentarios »
  • Publicado en la categoría 'C#, Windows'

 

Mini Review IE 9 developer preview en el MIX

March 17th, 2010 by JuanK

Follow @JuanKRuiz

Hola, quiero compartirles esta información muy importante acerca de lo que debemos esperar para IE9 desde el punto de vista técnico.

El equipo de desarrollo de IE9 ha centrado su atención en hacer IE9 un navegador sumamente rápido y eficiente desde varios puntos de vista y en este preciso momento ( apenas en una versión alpha ) ya hay cambios extremamente significativos respecto a la velocidad de ejecución de scripts y respecto a la adopción de estándares, si bien aún queda mucho por hacer, pero ya se puede ver que IE9 técnicamente hablando se pondrá a la altura de sus competidores.

 

image

Este es un compendio de características que se que a todos les interesará:

 

  1. Nuevo motor de scripts, y ojo no solo de javascript como google chome o mozilla por ejemplo. Su nombre clave es ”Chakra”
  2. El motor de scripts de la versión mostrada en el MIX tiene un benchmark muy aproximado a FireFox 3.7 alpha 2, y de acuerdo a su estado actual de alpha version, es presumible que iguale o incluso supere a chrome 4 o 5.
  3. Se esta hablando de soportar HTML 5 acelerado por hardware
  4. El motor de scripts, en maquinas con mas de un core ( es decir la mayoría actualmente ) corre siempre en un core diferente del del motor de IE, de tal forma que mientras IE muestra la página el motor esta compilando y optimizando los scripts necesarios.
  5. IE9 es el primer navegador en soportar HTML5 por hardware incluyendo soporte para SVG ( Scalable Vectorial Graphics ) es decir tendremos gráficos nativos de las páginas siendo procesados desde la GPU.
  6. El test ACID aun no lo soporta muy bien, si bien esta mucho mejor que otras versiones de IE, aún esta bajo teniendo una nota de 55/100 actualmente. Aunque el equipo de IE afirma tener un compromiso con llevar la evaluación a niveles mucho más altos.
  7. Integración con DirectWrite – texto acelerado por hardware

 

Los invito a todos a descargar el developer preview en este link  http://ie.microsoft.com/testdrive/Default.html y probarlo.

 

Para los interesados en hacer tests y mediciones hagan el siguiente ejercicio:

 

  1. Abran un navegador diferente de IE9 developer preview y visiten esta pagina : http://ie.microsoft.com/testdrive/Default.html
  2. Abran IE9 developer preview
  3. Comiencen a mirar el desempeño de cada uno de los browsers en cada una de las pruebas.

 

La sorpresa será que no en todas IE 9 será el mejor, pero si en la mayoría, al menos en mi caso que lo puede comparar contra opera 10.50.

 

Es evidente el poder de IE9 respecto a renderizado y animado de texto, así como la superioridad en algunos tipos específicos de animaciones basadas en HTML 5. Por otro lado en ejemplos como el de Falling Balls opera se mostro superior a simple vista.

 

Saludos a todos!!

        Print Friendly

        Follow @JuanKRuiz

        • 5 Comentarios »
        • Publicado en la categoría 'Product Reviews'

         

        « Anterior 1 2 … 45 46 47 48 49 … 59 60 Siguiente »

        Redes Sociales

        Follow @JuanKRuiz
        Answer Questions

        Busca en el blog

        Nube de Temas

        API - Azure - C# - codigo - Forms - IE - IE9 - Image - imagenes - IT - Microsoft - MVP - Pinned - PowerShell - Proceso - rendimiento - RSS - sistema - Sistemas Operativos - Site - Visual - WCF - Windows - Windows 8 - Windows Store - WinRT - WndProc - WPF - XAML - XNA

        Blogs recomendados

      1. VBCodigoPocketPC Espacio para tratar temas de programacion para dispositivos moviles, Pocket PC, Compact Framework, Embbeded Visual Basic, Visual Basic.NET , C# (C Sharp)
      2. Róbinson Moscoso Estaré publicando acá cosas sobre tecnologia .NET, situacioines cotidianas de las que voy aprendiendo… sirve como extensión de memoria.
      3. .Net C# Blog de Nelsón Venegas
      4. Warnov Microsoft Developer Evangelist
      5. IT LIfe Blog de mi Hermano que esta en el lado claro: IT
      6. Sorey Garcia Una chica del común con la firme intención de no serlo
      7. Black Byte videojuegos, modelado y animación 3d
      8. Road to IT World Cosas interesantes de IT
      9. Marcela Chitiva Un poco de esto… un poco de aquello
      10. Surviving the Nigth El mejor blog para aquellos que nos gustan los “internals”
      11. Meta

        1. Log in
        2. WordPress

        Ideas de un Conejo is powered by Wordpress. Theme designed by Juan Carlos Ruiz.