Windows 7 APIs: Trabajando con el TaskBar (Csharp)

Como parte de una serie de Presentaciones en universidades mostrando como se le puede sacar provecho al TaskBar de Windows 7 pues en este post tratare de explicar lo mas sencillo posible… Mi enfoque sigue siendo el mismo que es el desarrollo web pero en esta ocasión hare la excepción (Soy desarrollador no me culpen por intentar aprender mas cosas) 🙂 jejeje

Primero lo primero debemos ir a esta dirección y descargar las API’s de Windows 7 para poder trabajar con el TaskBar: http://code.msdn.microsoft.com/WindowsAPICodePack

Luego de esto pues manos a la obra, para ver el articulo completo con las imagenes y codigo puedes entrar aqui: Windows 7 APIs- Trabajando con el TaskBar (Csharp)

SilverLight 4: NotificationWindows

Continuando con la fiebre de SilverLight 4, esta ocasión les escribiré como mostrarle al usuario final una ventana de notificación ya sea para el común alerta o aviso. Esta funcionalidad funciona solo cuando la aplicación esta fuera del Navegador.

Sin mas ni mas aquí les dejo el tutorial espero que lo disfruten y le saquen muchísimo provecho:

1. Crearemos nuestro proyecto de SilverLight Application

image

2. Le daremos OK a la ventana que nos muestra Visual Studio 2010 para ver nuestro aplicativo SilverLight en un proyecto web.

image

3. Luego de agregaremos un nuevo Item a nuestro proyecto de SilverLight donde agregaremos un UserControl al que llamaremos “Notificador” quien será nuestro mensaje de notificación:

image

4. En ese nuevo UserControl agregaremos el Siguiente Codigo XAML reemplazando el grid que ya se encuentra agregado, sencillamente le estamos agregando dos filas donde la cabecera tiene un alto de 20 y agregamos dos border (uno en cada fila del grid) y 2 textblock (uno en cada border)  además de darle un poquito de color a ambos borders:

     <Grid x:Name="LayoutRoot" Background="White">
        <Grid.RowDefinitions>
            <RowDefinition Height="20" />
            <RowDefinition />
        </Grid.RowDefinitions>
        <Border Grid.Row="0" Padding="8 2 8 2">
            <Border.Background>
                <LinearGradientBrush StartPoint="0.5,0" EndPoint="0.5,1">
                    <GradientStop Color="#FF87BCDB" Offset="0.0" />
                    <GradientStop Color="#FF6EB3C7" Offset="1.0" />
                </LinearGradientBrush>
            </Border.Background>
            <TextBlock x:Name="titulo" FontWeight="Bold" TextWrapping="Wrap" />
        </Border>
        <Border Grid.Row="1" Padding="8">
            <Border.Background>
                <LinearGradientBrush StartPoint="0.5,0" EndPoint="0.5,1">
                    <GradientStop Color="#ECECF4" Offset="0.0" />
                    <GradientStop Color="#C3C2D6" Offset="1.0" />
                </LinearGradientBrush>
            </Border.Background>
            <TextBlock x:Name="mensaje" TextWrapping="Wrap"  />
        </Border>
    </Grid>

5. Ahora en el la hoja de código del UserControl agregaremos lo siguiente:

        public void MostrarMensaje(string _titulo, string _mensaje)
        {
            titulo.Text = _titulo;
            mensaje.Text = _mensaje;
        }

6. Regresemos a nuestro UserControl Principal (MainPage.xaml) y agregaremos un botón:

        <Button Content="Notificar" Height="23" Name="btnNotificacion" VerticalAlignment="Center" Width="75" />

7. Ahora nos dirigimos al código y en el constructor de la pagina escribiremos lo siguiente:

   btnNotificacion.Click += new RoutedEventHandler(btnNotificacion_Click);

8. Luego de crear el evento click del boton escribiremos lo siguiente:

        void btnNotificacion_Click(object sender, RoutedEventArgs e)
        {
            if (App.Current.InstallState == InstallState.Installed)
            {
                if (App.Current.IsRunningOutOfBrowser)
                {
                    NotificationWindow nwAlerta = new NotificationWindow();
                    nwAlerta.Height = 80;
                    nwAlerta.Width = 320;
                    //Invocamos al UserControl Notificador.xaml
                    Notificador nota = new Notificador();
                    //Le pasamos los parametros al metodo creado
                    nota.MostrarMensaje("Mi titulo es de Prueba", "Este es una demostracion de como funciona el NoticationWindows en SilverLight 4");
                    nota.Width = nwAlerta.Width;
                    nota.Height = nwAlerta.Height;
                    nwAlerta.Content = nota;
                    nwAlerta.Show(4000);
                }
                else
                {
                    MessageBox.Show("Debe estar instalada la aplicacion para ver la Notificacion");
                }
            }
            else
            {
                MessageBox.Show("Debe estar instalada la aplicacion para ver la Notificacion");
            }
        }

9. Para que esto pueda correr sin problemas debemos decirle a nuestra aplicación SilverLight que puede correr fuera del navegador de lo contrario nos arrojaría error, aunque si ven el código anterior estamos validando de que la aplicación se encuentre instalada para poder mostrar la notificación. Para habilitar que corra fuera del Navegador haremos lo siguiente:

Boton derecho del mouse sobre el proyecto y luego Propiedades y habilitan el check que se muestra en la imagen

image

Si desean agregar alguna configuración adicional como iconos, cambiar el titulo o la descripción pueden hacerlo en el botón que se les aparece al lado “Out-Of-Browser Settings”

Luego de esto pueden ejecutar su aplicación y darle botón derecho en el navegador para instalar su aplicación y hacer las pruebas 🙂


SilverLight 4: Captura del WebCam y Microfono

SilverLight 4 ha ido tomando mucho revuelo en los últimos días y no es para menos con la inclusión de muchas funcionalidades excelentes que harán de SilverLight un punto de entrada al desarrollo de aplicaciones potentes y lo interesante de todo es que en muchas empresas sin la necesidad de tener una infraestructura fuerte puedes montar estas aplicaciones.

Sin mas rodeo en esta oportunidad les comentare como crear un proyecto sencillo que acepte las características de captura de video y de audio. La demo en caso de no verse aquí podrán verlo en esta dirección: http://ajdev.net/Publicacion/Articulo/52.aspx

1. Crearemos un Nuevo Proyecto en Visual Studio 2010 de tipo “SilverLight Aplicación”

image

2.Visual Studio 2010 nos indicara si deseamos crear un Proyecto Web para testear nuestra aplicación SilverLight le daremos OK.

image

3. Agregaremos 3 Controles el cual seran Dos Botones y Grid:

        <Button Content="Iniciar Captura" Height="26" HorizontalAlignment="Left" Margin="64,47,0,0" Name="btnCapturar" VerticalAlignment="Top" Width="120" />
        <Button Content="Paralizar Captura" Height="26" HorizontalAlignment="Left" Margin="209,47,0,0" Name="btnStop" VerticalAlignment="Top" Width="122" />
        <Grid Height="166" HorizontalAlignment="Left" Margin="12,122,0,0" Name="grid1" VerticalAlignment="Top" Width="376" />

4. Declararemos una variable privada del tipo CaptureSource quien almacenara las entrada de audio y video:

        private CaptureSource _cs = new CaptureSource();      

5. Nos ubicaremos en el constructor del formulario (UserControl) y escribiremos los siguientes eventos:

        public MainPage()
        {
            InitializeComponent();
            btnCapturar.Click += new RoutedEventHandler(btnCapturar_Click);
            btnStop.Click+=new RoutedEventHandler(btnStop_Click);
        }

6. Escribiremos en los eventos del Boton Capturar y el Stop las siguientes lineas:

        void btnCapturar_Click(object sender, RoutedEventArgs e)
        {
            //Validamos si permite captura de video y audio
            if (!CaptureDeviceConfiguration.AllowedDeviceAccess )
            {
                CaptureDeviceConfiguration.RequestDeviceAccess();
            }

            //Si la validacion fue efectiva podemos asignarle a la variable
            //antes declara (_cs) el video y el audio
            if (CaptureDeviceConfiguration.RequestDeviceAccess())
            {
                System.Windows.Media.VideoCaptureDevice videodev;
                System.Windows.Media.AudioCaptureDevice audiodev;
                videodev = CaptureDeviceConfiguration.GetDefaultVideoCaptureDevice();
                audiodev = CaptureDeviceConfiguration.GetDefaultAudioCaptureDevice();
                if (videodev != null && audiodev!=null)
                {
                    _cs.AudioCaptureDevice = audiodev;
                    _cs.VideoCaptureDevice = videodev;
                    VideoBrush vb = new VideoBrush();
                    vb.SetSource(_cs);
                    _cs.Start();
                    grid1.Background = vb;
               }
            }
        }

        private void btnStop_Click(object sender, RoutedEventArgs e)
        {
            //se paraliza la visualizacion del video y el audio
            _cs.Stop();
        }

Con esto podemos porbar nuestra aplicacion… espero que le sea de ayuda… aqui les dejo el codigo XAML completo y el Codigo en C# del ejemplo mostrado:

XAML:

<UserControl x:Class="DemoWebCam.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    d:DesignHeight="300" d:DesignWidth="400">

    <Grid x:Name="LayoutRoot" Background="White">
        <Button Content="Iniciar Captura" Height="26" HorizontalAlignment="Left" Margin="64,47,0,0" Name="btnCapturar" VerticalAlignment="Top" Width="120" />
        <Button Content="Paralizar Captura" Height="26" HorizontalAlignment="Left" Margin="209,47,0,0" Name="btnStop" VerticalAlignment="Top" Width="122" Click="btnStop_Click" />
        <Grid Height="166" HorizontalAlignment="Left" Margin="12,122,0,0" Name="grid1" VerticalAlignment="Top" Width="376" />
        
    </Grid>
</UserControl>

C#:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Collections.ObjectModel;
using System.Windows.Media.Imaging;

namespace DemoWebCam
{
    public partial class MainPage : UserControl
    {
        ObservableCollection<WriteableBitmap> _images = new ObservableCollection<WriteableBitmap>();
        private CaptureSource _cs = new CaptureSource();      

        public MainPage()
        {
            InitializeComponent();
            btnCapturar.Click += new RoutedEventHandler(btnCapturar_Click);
            btnStop.Click+=new RoutedEventHandler(btnStop_Click);
        }

        void btnCapturar_Click(object sender, RoutedEventArgs e)
        {
            //Validamos si permite captura de video y audio
            if (!CaptureDeviceConfiguration.AllowedDeviceAccess )
            {
                CaptureDeviceConfiguration.RequestDeviceAccess();
            }

            //Si la validacion fue efectiva podemos asignarle a la variable
            //antes declara (_cs) el video y el audio
            if (CaptureDeviceConfiguration.RequestDeviceAccess())
            {
                System.Windows.Media.VideoCaptureDevice videodev;
                System.Windows.Media.AudioCaptureDevice audiodev;
                videodev = CaptureDeviceConfiguration.GetDefaultVideoCaptureDevice();
                audiodev = CaptureDeviceConfiguration.GetDefaultAudioCaptureDevice();
                if (videodev != null && audiodev!=null)
                {
                    _cs.AudioCaptureDevice = audiodev;
                    _cs.VideoCaptureDevice = videodev;
                    VideoBrush vb = new VideoBrush();
                    vb.SetSource(_cs);
                    _cs.Start();
                    grid1.Background = vb;
               }
            }
        }

        private void btnStop_Click(object sender, RoutedEventArgs e)
        {
            //se paraliza la visualizacion del video y el audio
            _cs.Stop();
        }
    }
}