Aplicando “Full Glass” a la consola de windows


En esta entrada vamos a ver como podemos aplicar una transparencia total tipo “aero glass” a la consola de windows mediante C++. El código solo es funcional para el SO Windows y las versiones Vista/7/8.

Para aplicar la transparencia total a la ventana de la CMD vamos a utilizar la API DwmEnableBlurBehindWindow que es la encargada de habilitar el efecto “Desenfoque” en la ventana, su sintaxis es la siguiente:


HRESULT WINAPI DwmEnableBlurBehindWindow(
    HWND hWnd,
    _In_ const DWM_BLURBEHIND *pBlurBehind
);

Parametros:

hWnd: El handle a la ventana en la cual el efecto de difuminado será aplicado.

pBlurBehind [in]: Un puntero a la estructrua DWM_BLURBEHIND que provee los datos para el efecto

Valor de retorno

Si esta función se ejecuta correctamente, devuelve S_OK. De lo contrario, devuelve un código de error HRESULT.

La definicion de la estructura DWM_BLURBEHIND es como sigue:


typedef struct _DWM_BLURBEHIND {
    DWORD dwFlags;
    BOOL fEnable;
    HRGN hRgnBlur;
    BOOL fTransitionOnMaximized;
} DWM_BLURBEHIND, *PDWM_BLURBEHIND;

Miembros:

dwFlags: Una combinación bit a bit de Desenfoque Posterior DWM  de valores constantes que indican cuál de los miembros de esta estructura se han establecido.

fEnable: TRUE para registrar el identificador de ventana para desenfoque posterior DWM; FALSE para anular el registro el identificador de ventana de desenfoque posterior DWM.

hRgnBlur: La región en el área de cliente donde el desenfoque posterior se aplicará. Un valor NULL aplicará el efecto borroso detrás de todo el área cliente.

fTransitionOnMaximized: TRUE si la coloración de la ventana debe hacer una transición para que coincida con la ventana maximizada, de lo contrario, FALSE.

Muy bien, veamos el código que nos harán el trabajo:


//---------------------------------------------------------------------------
#include <windows.h>
#include <tchar.h>
#include <dwmapi.h>
//---------------------------------------------------------------------------
#pragma comment (lib,"dwmapi.lib")
//---------------------------------------------------------------------------
HRESULT EnableBlurBehind(HWND);
HRESULT ExtendIntoClientAll(HWND);
bool SetFullGlass(LPSTR);
//---------------------------------------------------------------------------
HRESULT EnableBlurBehind(HWND hwnd)
{
    HRESULT hr = S_OK;
    DWM_BLURBEHIND blurBehind = {DWM_BB_ENABLE | DWM_BB_TRANSITIONONMAXIMIZED, TRUE, NULL, TRUE};

    if(SUCCEEDED(ExtendIntoClientAll(hwnd)))
        hr = DwmEnableBlurBehindWindow(hwnd, &blurBehind);
    return hr;
}
//---------------------------------------------------------------------------
HRESULT ExtendIntoClientAll(HWND hwnd)
{
// Los margenes negativos tienen un significado especial para la API  //DwmExtendFrameIntoClientArea.
// Los margenes negativos crean el efecto de "ventana de cristal", donde //el area cliente
//  es procesada como una superficie solida sin borde de ventana.
    MARGINS margins = {-1};
    HRESULT hr = S_OK;

// Extiende el marco por toda la ventana.
    hr = DwmExtendFrameIntoClientArea(hwnd,&margins);
    if (SUCCEEDED(hr))
    {
        //codigo que deseemos
    }
    return hr;
}
//---------------------------------------------------------------------------
bool SetFullGlass(LPSTR class_name)
{
// Le pasamos la clase de la ventana de la consola
    HANDLE hwnd = FindWindow(class_name, NULL);
    if(hwnd != NULL)
        return(EnableBlurBehind(hwnd) == S_OK);
    return false;
}
//---------------------------------------------------------------------------

Un ejemplo de uso puede ser el que sigue:


if(!SetFullGlass("ConsoleWindowClass"))
    MessageBox(NULL, "No se ha podido realizar la accion", "Error", MB_ICONERROR);

Y veremos como pasamos de esto

Captura2_compressed

A esto

Captura_compressed

Si vemos bien el codigo, se ha utilizado otra API, me refiero a DwmExtendFrameIntoClientArea que se usa para crear el efecto en toda el area cliente incluyendo los bordes. Deberiamos quitar esta llamada si quisiéramos dejar los bordes intactos

Anuncios

4 Respuestas a “Aplicando “Full Glass” a la consola de windows

  1. hola men soy de guanajay como tu que bien por fin uno se decidio a dar su conocimineto en la materia y espero mucho mas de ti por que me han hablado y he visto aun que tu no me conoscas en persona talves.

    Me gusta

    • Hola
      Pues si, creo que a las redes cubanas les hace falta bastante espacios de esta indole, donde se puedan compartir conocimientos de cualquier tipo, gracias a la plataforma y la gente del jc por darnos esta oportunidad, la primera en la intranet cubana ;).
      Espero que no te hayan hablado tan mal de mi….jaja (broma)…quizas nos podamos conocer en persona, estamos bien cerca…jeje.
      Saludos y gracias x comentar

      Me gusta

  2. Caramba, siempre quise saber como hacerlo en Win2. Soy usuario de Linux y siempre me ha gustado las terminales transparentes. Eso es lo que se llama un aporte aunque solo use Win2 para algunas tareas puntuales de mi trabajo.

    Me gusta

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s