[WP7] Skydrive, subiendo archivos en Windows Phone 7

Dentro de los servicios Live de Microsoft, uno de los servicios que más importancia esta tomando últimamente es Skydrive. Este servicio de almacenamiento nos ofrece entre otras cosas 7 gigas de almacenamiento online, acceso con clientes tanto online como desde Mac, Windows, Ipad, Windows Phone, edición y visualización de archivos de Office, etc.

Todo esto unido a su gratuidad hace que por lo menos nos tengamos que plantear su uso en nuestros desarrollos en el caso de necesitar almacenar documentos fuera de nuestro teléfono.

Vamos a comenzar programando la subida de un archivo, para ello creamos un nuevo proyecto Windows Phone Application. Tenemos añadir dos referencias a nuestro proyecto del SDK de Live, Microsoft.Live y Microsoft.Live.Controls.

A continuación añadimos el control SignInButton a nuestro toolbox:

 

 

Una vez lo tengamos disponible en el toolbox, podemos arrastrarlo a nuestra MainPage.xaml. Debemos añadirle en las propiedades nuestro ClientID.

 

 

También vamos a añadir un botón para realizar las subidas de archivos, podemos subir cualquier tipo de archivo pero para no complicar la demostración simplemente vamos a seleccionar una imagen de la galería de imágenes de Windows Phone para subirla posteriormente.

En el SignInButton tenemos añadir el evento SessionChanged donde controlamos si estamos validados o no, dentro de este método simplemente vamos a habilitar el botón de “Upload”, según el estado de la conexión a Skydrive.

Dentro del evento SessionChanged tenemos lo siguiente:

Es una comprobación del estado de la conexión, para habilitar o no el botón que nos permite subir las imágenes. Además guardamos el estado de la sesión, nos hará falta para subir la imagen a Skydrive.

En el botón Upload vamos a editar el evento Click, abriendo la galería de imágenes

Rellenamos ahora el evento que acabamos de declarar:

Se comprueba que la selección de la imagen se ha realizado correctamente y pasamos la imagen a un objeto Stream.

Por ultimo declaramos el evento Completed y subimos la imagen con el evento UploadAsync. Esto nos dejara la foto en la raíz de nuestro Skydrive.

Este es el aspecto del evento LiveConnectClientUploadCompleted, podríamos hacer cualquier cosa, en este caso he optado por recoger la dirección de la imagen y lanzarla en el explorador de Windows Phone.

Todo el código está disponible desde aquí.

Un saludo :)

[WP7] Nueva versión del toolkit de Silverlight para Windows Phone

Hola a tod@s,

hace un par de días ha aparecido la versión estable del Silverlight Toolkit for Windows Phone, la última versión estable salio por febrero de este año.
Pero bueno, el caso es que ya la tenemos aquí y trae algunas novedades.

Antes de nada para los que no se hallan actualizado, es necesario tener instalado la ultima versión de las herramientas de desarrollo para «Mango».

Se han añadido algunos componentes: PhoneTextBox, DateTimePickers, LockablePivots, MultiSelectList, LongListSelector, HubTitle, ExpanderView y HeaderedItemsControl. Y como siempre se han solucionado algunos fallos y se ha optimizado el rendimiento de los componentes.

La verdad es que viene bastante completo, podeis ver la descripción de todas las novedades en el blog de Jeff Wilcox.

Y nada, a parte de dejaros los enlaces correspondientes os recomiento que os bajeis el XAP de ejemplo y que lo metais en el emulador o en vuestro movil para ver como funciona 🙂

Recursos:

Windows Phone SDK 7.1 Beta 2

Silverlight Toolkit for Windows Phone

Saludetes 😉

 

[WP7] Detectar la reproducción de música

Uno de los puntos en los que tenemos que estar atentos para que nuestras aplicaciones logren pasar el proceso de certificación del MarketPlace es si el dispositivo está reproduciendo música en el momento de ejecutar nuestra aplicación.

En el caso de que el usuario esté escuchando música nuestra aplicación debería  pedirle permiso antes de poder cortar esa reproducción.

Detectar si se reproduce música es sencillo, simplemente vamos a añadir a la clase App.xaml.cs el namespace Microsoft.XNA.Framework.Media y así podremos hacer uso de una variable booleana MediaPlayer.GameHasControl esta variable nos dice si tu programa tiene el control sobre la reproducción de sonido.

El ejemplo que muestro a continuación lo he realizado usando Silverlight por lo que el namespace que indico arriba no viene por defecto , así que pulsamos con el botón derecho del ratón en la carpeta de referencias y pulsamos en agregar referencia y del listado que obtenemos usamos Microsoft.XNA.Framework.

 

wp7sound1

 

wp7sound2

 

Al añadir la referencia Visual Studio nos advierte de que pueden aparecer “rayos y centellas” cuando menos lo esperemos, no tengáis miedo y decidle que SI queréis continuar Sonrisa.

wp7sound3

 

Es hora de abrir la clase App.xaml.cs y añadir el siguiente código al evento Application_Launching que ejecuta lo que sea necesario cuando se está iniciando la aplicación:

 

1 private void Application_Launching(object sender, LaunchingEventArgs e) 2 { 3 FrameworkDispatcher.Update(); 4 if (MediaPlayer.GameHasControl==false) 5 { 6 if (MessageBox.Show("Quieres cortar la reproducción de música en background", "Aviso", MessageBoxButton.OKCancel) == MessageBoxResult.Cancel) 7 { 8 Application.Current.Exit+=new EventHandler(Current_Exit); 9 } 10 11 } 12 }

Antes de nada lo primero que podéis ver es la instrucción FrameworkDispacher.Update(). En XNA la clase Game se encarga automáticamente de llamar a este método para conocer el estado de diferentes componentes del dispositivo, como el proyecto lo estamos realizando con Silverlight debemos ser nosotros quienes llamemos al método en el momento que lo necesitemos.

A continuación pregunto por el control del sonido, en el caso de que no lo tenga mi aplicación lanzo un MessageBox, si el usuario pulsa “Ok” la aplicación corta automáticamente la reproducción de sonido en background y toma el control y en el caso de pulsar “Cancel” sale de la aplicación inmediatamente.

Creo que es la forma mas sencilla que tenemos de programar nuestra aplicación para que pase este punto de la certificación.

Espero que sirva, un saludo Sonrisa

[WP7] Estados de certificado de una aplicación

Actualmente cuando terminados una aplicación para Windows Phone 7 y la subimos al MarketPlace de Microsoft para su certificado y posterior publicación, se nos va informando del estado en el que se encuentra este proceso de certificación.

Voy a enumerar al menos los que conocemos los usuarios del APP Hub:

Submission in Progress

Tienes que finalizar el proceso de subida de la aplicación pulsando el botón de finalización.

Ready for Testing

La aplicación todavía no ha sido introducida en el proceso de testing.

Testing in Progress

La aplicación se encuentra en la cola de testing a la espera de que un tester se encuentre disponible.

Ready for Signing

La aplicación ha pasado las pruebas de certificación y está preparada para pasar a la fase de publicación.

Ready for Publishing

En esta fase la aplicación es publicada automáticamente en el MarketPlace si así lo hemos elegido durante el proceso de subida, sino deberemos activar la publicación manualmente.

Published to Marketplace

La aplicación se encuentra publicada, aunque algunas veces tarda un día en aparecer en el MarketPlace.

Certification Failed

La aplicación ha fallado la publicación y tienes que arreglar la parte en la que falla, para ello Microsoft proporciona un reporte bastante concreto en mi opinión sobre como debería comportarse la aplicación y como reproducir el error en nuestro ordenador.

None

Si en algún momento te encuentras tu aplicación en este estado ponte en contacto con la gente de soporte pues puede que halla ocurrido algún error durante el proceso de subida.

 

Por último quiero indicar que el tiempo de publicación de una aplicación en el caso de que pase la certificación oscila entre cuatro y cinco días laborables.

 

Espero que os sirva, un saludo y que tengáis una buena entrada y salida de año Sonrisa

[WP7] Tombstoning o que hacer cuando nos llaman al movil

Como ya sabréis el cambio en la forma de desarrollar aplicaciones para Windows Phone 7 ha sido bastante radical con respecto a como se hacía en Windows Mobile 6.5. Ahora tenemos que seguir unas guías de estilo, tener en cuenta los botones del dispositivo, el contenido del programa, etc,. Pues bien, una de las diferencias más notables que podemos encontrar es la imposibilidad de correr mas de una aplicación al mismo tiempo, no hay manera de cambiar de una aplicación a otra  sin cerrar la primera (siempre que la aplicación no sea nativa del sistema).

Aquí voy a aclarar una expresión que ha llevado a muchas discusiones / criticas, que es: ¿¡Windows Phone 7 no proporciona multitarea!? la respuesta es por un lado “no”, no nos permite a los desarrolladores en general mantener nuestras aplicaciones en segundo plano al estilo de WM6.5 y por otro lado “si”, si permite multitarea pero lo restringe a las aplicaciones propias del sistema operativo (y supongo que a las aplicaciones de terceros a los que Microsoft de su consentimiento).

¿Por que han hecho esto así? bueno pues básicamente para dar más agilidad a la máquina y que no se produzca un desperdicio de recursos en el aparato, además disponemos de mecanismos como las notificaciones para avisar al usuario de cambios o actualizaciones de los datos de nuestro programa.

Esta restricción de la multitarea no solo es idea de Microsoft, antes que ellos ya la ha practicado Apple con su IPhone. En Android por ejemplo esta faceta no se controla, dejando al desarrollador al cuidado de estas tareas.

Pero vamos al tema del post de hoy “tombstoning”, como ya he dicho solo podemos tener ejecutándose una aplicación al mismo tiempo sin contar con las del sistema y además existen situaciones en las cuales el sistema se “apropia” de la pantalla, como es en el caso de las llamadas de teléfono. Cuando nos llaman al teléfono la aplicación que tenemos en pantalla se cierra inmediatamente y no tenemos opción de guardar la información con la que trabajábamos en ese momento.

Para estos casos tenemos el “tombstoning”, que nos permite programar el guardado automático de la información del programa cuando el sistema o nosotros detenemos su ejecución. Disponemos de algunos eventos para guardar o cargar nuestros datos, estos son:

  • Launching
  • Activated
  • Closing
  • Deactivated

Launching y Closing se producen cuando lanzamos la aplicación y cuando la cerramos, por otro lado disponemos de Activated y Deactivated que suceden cuando nos llaman al teléfono o pulsamos el botón de Volver.

Voy a mostrar un ejemplo en el que persisto el texto de un textbox y donde muestro la hora a la que se desactivo la aplicación.

Lo primero de todo es abrir Visual Studio y elegir un nuevo proyecto de tipo “Windows Phone Application”

imagen1

Lo creamos y abrimos la clase App.xaml.cs, aproximadamente a la mitad de la clase podemos ver los eventos que os comentaba arriba. Bueno ponemos el cursor del ratón en el evento Deactivated y haciendo uso de PhoneApplicationService guardamos la hora en la que el programa se interrumpe por una llamada:

1 private void Application_Deactivated(object sender, DeactivatedEventArgs e) 2 { 3 PhoneApplicationService.Current.State["desactivadoHora"] = DateTime.Now; 4 }

Ahora abrimos MainPage.xaml, veremos algo como esto:

imagen2

 

Tenemos que añadir a la interfaz un TexBox y un TexBlock para que quede de la siguiente forma:

imagen3

 

1 <Grid x:Name="LayoutRoot" Background="Transparent"> 2 <Grid.RowDefinitions> 3 <RowDefinition Height="Auto"/> 4 <RowDefinition Height="*"/> 5 </Grid.RowDefinitions> 6 7 <!--TitlePanel contains the name of the application and page title--> 8 <StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28"> 9 <TextBlock x:Name="ApplicationTitle" Text="MY APPLICATION" Style="{StaticResource PhoneTextNormalStyle}"/> 10 <TextBlock x:Name="PageTitle" Text="page name" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/> 11 </StackPanel> 12 13 <!--ContentPanel - place additional content here--> 14 <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"> 15 <TextBox Height="279" HorizontalAlignment="Left" Margin="36,50,0,0" Name="textBox1" Text="" VerticalAlignment="Top" Width="384" TextChanged="textBox1_TextChanged" /> 16 <TextBlock Height="57" HorizontalAlignment="Left" Margin="36,361,0,0" Name="textBlock1" Text="" VerticalAlignment="Top" Width="389" /> 17 </Grid> 18 </Grid>

Ahora en el evento TextChanged del TextBox añadimos la siguiente línea:

1 private void textBox1_TextChanged(object sender, TextChangedEventArgs e) 2 { 3 PhoneApplicationService.Current.State["textoEscrito"] = textBox1.Text; 4 }

De esta manera guardamos el texto cada vez que cambia.

Cuando el programa se ve interrumpido por la llamada de teléfono y volvemos a la aplicación MainPage llama automáticamente al método OnNavigatedTo  (este evento ocurre cada vez que se carga una clase que deriva de Page). Nosotros lo sobrescribimos para que cuando se ejecute cargue los datos que hemos guardado anteriormente:

1 protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e) 2 { 3 if (PhoneApplicationService.Current.State.ContainsKey("textoEscrito")) 4 { 5 textBox1.Text = (string)PhoneApplicationService.Current.State["textoEscrito"]; 6 } 7 8 if (PhoneApplicationService.Current.State.ContainsKey("desactivadoHora")) 9 { 10 textBlock1.Text = "La aplicación se desactivo a las: "; 11 textBlock1.Text += ((DateTime)PhoneApplicationService.Current.State["desactivadoHora"]).TimeOfDay.ToString(); 12 } 13 else 14 { 15 textBlock1.Text=""; 16 } 17 18 }

Simplemente tenemos que comprobar que existen las claves que indicamos y en caso afirmativo mostrar la información.

Ahora ejecutamos el programa e introducimos texto en el TextBox, para simular la llamada de teléfono o que abrimos otro programa pulsamos la tecla de Windows.

imagen4

imagen5

Cuando queramos ir hacia atrás, pulsamos la tecla de Volver y veremos una pantalla en la que se está recuperando la información:

imagen6

imagen7

Por último aquí podéis ver la información recuperada y la hora a la que el programa quedo inactivo.

Espero que os sirva a todos los que estáis programando en WP7, el código lo tenéis aquí abajo:

 

 

Saludos Sonrisa

[WP7] Almacenamiento de archivos en local

Como todos sabréis a estas alturas el almacenamiento de archivos en local dentro los dispositivos con Windows Phone 7 ha cambiado bastante respecto de sus predecesores.

Microsoft está apostando fuerte por los servicios en la nube y este es un claro ejemplo en el que se nos invita a los desarrolladores a almacenar los datos de nuestra aplicación en un servicio a través de Internet.

Sin embargo almacenar datos de configuración, preferencias del usuario o datos como caché en la nube puede ser más incómodo que almacenarlos en local. Para lograr esto podemos utilizar el almacenamiento aislado o Isolated Storage.

El Isolated Storage es un lugar de almacenamiento aislado del sistema y del resto de las aplicaciones. Tiene como ventaja fundamental que a estos espacios aislados no se puede acceder desde otras aplicaciones lo cual aporta más seguridad a las aplicaciones.

Vamos a ver un par de métodos para almacenar datos como la configuración de un programa que haga el usuario o los datos que se quieran cachear para que estén disponibles de manera más rápida.

La primera es guardando los datos en app.config de la aplicación y la segunda guardando un archivo como tal dentro del espacio reservado para la aplicación móvil.

 

 

Usando el App.Config

Bueno como siempre lo primero de todo será crear un nuevo proyecto, usaremos Silverlight para construir la aplicación de Windows Phone 7.

La interfaz simplemente va a contener un textbox con el que vamos a introducir valores, el botón para dar la orden y un listbox donde iremos mostrando los datos almacenados.

 

image
Vamos a crear algunos métodos para facilitarnos el proceso de lectura y escritura, por un lado necesitamos poder almacenar el valor junto con la clave que lo identifica.

 

        private void EstablecerValor(string clave, string valor)
        {
            if (IsolatedStorageSettings.ApplicationSettings.Contains(clave))
                IsolatedStorageSettings.ApplicationSettings[clave] = valor;
            else
                IsolatedStorageSettings.ApplicationSettings.Add(clave, valor);

            IsolatedStorageSettings.ApplicationSettings.Save();
        }
 
Bueno, lo que hace este método es comprobar si la clave ya está contenida en el AppSettings, si lo está actualiza el valor y si no lo guarda como nuevo. 
Ahora necesitamos leer el valor introducido, para esto pasamos la clave al método ObtenerValor y en el caso de existir nos es devuelto. 
  

        private string ObtenerValor(string clave)
        {
            if (IsolatedStorageSettings.ApplicationSettings.Contains(clave))
                return IsolatedStorageSettings.ApplicationSettings[clave].ToString();
            else
                return default(string);
        }
 

Ya solo necesitamos algunas funciones para conocer la cantidad de datos que tenemos guardados, rellenar la lista y actualizar el contador que

vamos a utilizar.

 

        private int CantidadClaves()
        {
            return IsolatedStorageSettings.ApplicationSettings.Count;
        }

        private void RellenarLista()
        {
            listBox1.Items.Clear();

            for (int i = 0; i < CantidadClaves(); i++)
            {
                listBox1.Items.Add(ObtenerValor(i.ToString()));
            }

            ActualizarContador();
        }

        private void ActualizarContador()
        {
            contador = CantidadClaves();
        }
 

Ahora en el evento Click del botón hacemos una llamada a EstablecerValor y luego relleno el listbox.

 

        private void btnGuardar_Click(object sender, RoutedEventArgs e)
        {
            EstablecerValor(contador.ToString(), txtEntrada.Text);
            RellenarLista();
        }
 

Los valores guardados permanecerán en el teléfono mientras este no se resetee.
El código completo es este:


 

     public partial class MainPage : PhoneApplicationPage
    {
        int contador = 0;

        public MainPage()
        {
            InitializeComponent();
            RellenarLista();
        }

        private void btnGuardar_Click(object sender, RoutedEventArgs e)
        {
            EstablecerValor(contador.ToString(), txtEntrada.Text);
            RellenarLista();
        }


        private string ObtenerValor(string clave)
        {
            if (IsolatedStorageSettings.ApplicationSettings.Contains(clave))
                return IsolatedStorageSettings.ApplicationSettings[clave].ToString();
            else
                return default(string);
        }

        private void EstablecerValor(string clave, string valor)
        {
            if (IsolatedStorageSettings.ApplicationSettings.Contains(clave))
                IsolatedStorageSettings.ApplicationSettings[clave] = valor;
            else
                IsolatedStorageSettings.ApplicationSettings.Add(clave, valor);

            IsolatedStorageSettings.ApplicationSettings.Save();
        }

        private int CantidadClaves()
        {
            return IsolatedStorageSettings.ApplicationSettings.Count;
        }

        private void RellenarLista()
        {
            listBox1.Items.Clear();

            for (int i = 0; i < CantidadClaves(); i++)
            {
                listBox1.Items.Add(ObtenerValor(i.ToString()));
            }

            ActualizarContador();
        }

        private void ActualizarContador()
        {
            contador = CantidadClaves();
        }

    }
 
Usando archivos

Bueno, ahora usando el proyecto anterior o creando uno nuevo vamos a usar dos botones, uno para guardar en el archivo y otro para cargar sus datos, y dos textbox, uno para escribir y otro para mostrar el contenido de lo guardado.

Tendría el siguiente aspecto:

 

image

 

Los métodos más importantes son el de Guardar y el de Cargar información del archivo.

 

        public void Guardar(string texto, string archivo)
        {
            using (var almacenamiento = IsolatedStorageFile.GetUserStoreForApplication())
            using (var StreamEscritura = new IsolatedStorageFileStream(archivo, FileMode.Create, almacenamiento))
            using (var escritor = new StreamWriter(StreamEscritura))
            {
                escritor.Write(texto);
            }
        }

        public string Cargar(string archivo)
        {
            try
            {
                using (var almacenamiento = IsolatedStorageFile.GetUserStoreForApplication())
                using (var StreamLectura = new IsolatedStorageFileStream(archivo, FileMode.Open, almacenamiento))
                using (var lector = new StreamReader(StreamLectura))
                {
                    return lector.ReadToEnd();
                }
            }
            catch (IsolatedStorageException e)
            {
                return "No se ha encontrado el archivo + Excepción: " + e;
            }
        }
 

La forma de operar con el archivo es muy similar, obtenemos el espacio de almacenamiento de la aplicación mediante GetUserStoreForApplication.

Luego tenemos que usar una instancia de IsolatedStorageFileStream para poder manipular el archivo. Hay que indicar el nombre del archivo, el lugar donde está almacenado y como manipulamos el archivo, tenemos varias opciones para esto, Create, Open, Append, Truncate, etc.

Por último hacemos uso de un objeto StreamWriter o StreamReader para escribir o leer en el archivo.

Os dejo aquí como quedaría todo el código de la aplicación:

 

    public partial class MainPage : PhoneApplicationPage
    {

        public MainPage()
        {
            InitializeComponent();
        }

        private void btnGuardar_Click(object sender, RoutedEventArgs e)
        {
            Guardar(txtWriter.Text, "archivoPrueba.txt");
            txtWriter.Text = "";
        }

        private void btnCargar_Click(object sender, RoutedEventArgs e)
        {
           txtLoader.Text = Cargar("archivoPrueba.txt");
        }

        private void txtWriter_SelectionChanged(object sender, RoutedEventArgs e)
        {
            txtLoader.Text = "";
        }

        public void Guardar(string texto, string archivo)
        {
            using (var almacenamiento = IsolatedStorageFile.GetUserStoreForApplication())
            using (var StreamEscritura = new IsolatedStorageFileStream(archivo, FileMode.Create, almacenamiento))
            using (var escritor = new StreamWriter(StreamEscritura))
            {
                escritor.Write(texto);
            }
        }

        public string Cargar(string archivo)
        {
            try
            {
                using (var almacenamiento = IsolatedStorageFile.GetUserStoreForApplication())
                using (var StreamLectura = new IsolatedStorageFileStream(archivo, FileMode.Open, almacenamiento))
                using (var lector = new StreamReader(StreamLectura))
                {
                    return lector.ReadToEnd();
                }
            }
            catch (IsolatedStorageException e)
            {
                return "No se ha encontrado el archivo + Excepción: " + e;
            }
        }
 
    }
 
Como veis no es muy complicado hacer uso del IsolatedStorage en WP7 y nos permite tener en local datos de uso frecuente.
Un saludoGuiño

[ Windows 7] Cambio de idioma

Por fin saco un ratillo para poner algo en el blog, en esta ocasión vamos a ver un pequeño tip sobre como cambiar fácilmente el idioma de nuestro Windows 7.

El jueves pasado salió a la luz la versión RTM de Windows 7 para subscriptores de MSDN y de TechNet, bueno la imagen estaba disponible en inglés y había que aplicar posteriormente el pack del idioma correspondiente.

No es nada difícil cambiar el idioma, pero si nunca lo has hecho o es la primera vez que tienes Windows 7, es normal que le pregunten a uno como se hace. Así que este post va dedicado a todas esas personas que me buscan de servicio técnico en verano Stick out tongue

Inicialmente tenemos algo así, inglés por todos lados, así que nos vamos a nuestro querido “Panel de Control”.

En el podemos ver señalada la sección “Clock, Languaje, and Region” (un lugar idóneo para cambiar el idioma ¿no creéis? Big Smile). Si pinchamos sobre ella veremos lo siguiente:

un menu en el que cambiar la fecha y la hora, y una segunda opción donde cambiar el idioma.

Si clickamos en la segunda opción nos aparece un asistente para instalar o desinstalar idiomas, pulsamos en “Install display languajes”.

 

En este paso nos da la opción de bajarlo del sitio de Microsoft e instalarlo, o instalarlo directamente si ya disponemos del mismo, como es mi caso. Pulsamos sobre la segunda opción y buscamos el archivo que contiene el idioma.

Ahora pulsamos en “Next” y aceptamos la licencia para comenzar el proceso de instalación.

Cuando termina de instalarlo nos muestra los idiomas instalados, seleccionamos el “español” y pulsamos la casilla que hay más abajo para que aplique el idioma a todo el sistema.

 

Pulsamos sobre “Change display languaje” y nos pide reiniciar el sistema.

 

 

Al cabo de unos segundos nuestro sistema tiene un idioma un poco más familiar Smile

Bueno, pues eso es todo, disfrutad de la playa o de los chaparrones que están cayendo estos días.

 

SaludetesCool

[ Windows 7 ] Cambiar el aspecto de la pantalla de login

Hoy vamos a ver como cambiar el fondo de pantalla en el inicio de sesión de Windows 7.

 

Antes de nada, he visto que existen algunos programas que hacen el proceso que viene a continuación de manera casi automática, pero dado que después de probar varios he comprobado que unos funcionan y otros no, lo mejor creo que es hacerlo a mano (que por lo menos a mi no me falla).

Lo primero de todo es ver si tenemos la carpeta backgrounds en la siguiente dirección: C:WindowsSystem32oobeinfobackgrounds, si no la tenemos debemos ir hasta el directorio oobe, crear info y dentro de este backgrounds.

A continuación vamos a editar el registro de Windows, ya sabéis, Inicio -> Ejecutar y ponéis Regedit, debemos ir hasta:

HKEY_LOCAL_MACHINESoftwareMicrosoftWindowsCurrentVersionAuthenticationLogonUIBackground

Y fijarnos si tiene la clave OEMBackground puesto a 1. Si no es así o no existe lo creamos pulsando con el botón derecho del ratón en la parte derecha del registro y añadiendo un valor DWORD con el nombre que he indicado, lo ponéis a 1 y cerráis el registro.

Ahora vamos a preparar la imagen de fondo, escoged la que queráis, a ser posible de la resolución de vuestra pantalla, la guardáis en la carpeta backgrounds con el nombre backgroundDefault.jpg y con un tamaño que no supere los 256kb.

Solo queda reiniciar vuestra máquina para comprobar el resultado.

Saludetes

P.D.: los archivos que he utilizado los podeis encontrar en mi Skydrive

Variables globales en un sitio ASP.NET

Me encuentro ahora mismo desarrollando un sitio web en ASP.NET  para una asignatura de la universidad y esta tarde me he encontrado con que necesito tener accesibles algunos datos en cualquiera de las páginas que componen el sitio web, así que voy a dejar aquí las dos formas de hacer esto que he encontrado.

Para poneros en situación os diré que mi sitio web está compuesto por una MasterPage, varias páginas de contenido asociadas a la MasterPage y dos páginas más que no están asociadas; la MasterPage tiene un control de LoginName del cual quiero obtener el nombre del usuario que está logueado en cada momento en cualquier página.

Aclaración: podemos obtener el nombre de usuario logueado en el site mediante «this.User.Identity.Name», que sería mucho más correcto para obtener el nombre del usuario en cualquier momento. Sin embargo la idea es ejemplificar como llevar un dato de una parte a otra del site en situaciones en las que no dispongamos del tipo de facilidades como la que tenemos en el caso concreto que he utilizado de ejemplo en el post.

En el Web.config

Para hacer esto he visto varias maneras, la primera de todas se trata de guardar los datos en el Web.config en la zona de «appSettings», esto lo haría de la siguiente forma:

Primero añadiendo una clave a la zona de appSettings en el Web.config

<appSettings>  

        <add key=»username» value=»valor» />

</appSettings>

Y luego en el código de la página en la que lo necesitemos podemos obtener o modificar el valor de la clave mediante:

System.Configuration.ConfigurationSettings.AppSettings[«username»] 

En el Global.asax

Otra manera que he visto es utilizando el archivo Global.asax. Este archivo opcional en los desarrollos de ASP.NET nos permite manejar eventos que ocurren a nivel de la aplicación y de sesión, también nos permite declarar valores que necesitemos entre las diferentes solicitudes.

El archivo Global.asax para que funcione tiene que permanecer en la raíz de la aplicación y solo se admite uno por aplicación ejecutada. Si tenemos algún otro archivo de este tipo en algún subdirectorio no se tendrán en cuenta por la aplicación.

Cuando declaremos una variable dentro de Global.asax estará disponible en todas las páginas de la aplicación. Lo podemos hacer de la siguiente manera:

En el fichero Global.asax declaramos una variable string y luego en Session_Start otorgamos el valor de la cadena a un objeto de tipo Session que en mi caso se llama valorCadena.

public class Global : System.Web.HttpApplication
    {
        string cadena=»valor inicial»;
        protected void Application_Start(object sender, EventArgs e) { }
        protected void Session_Start(object sender, EventArgs e)
        {
            Session[«valorCadena»] = cadena;
        }

          ……

Luego en la página que lo necesitemos podemos escribir valores:

       Session[«valorCadena»] = «la_cadena_que_quiera_poner»;

y leer de la variable:

       Label1.Text = (string)Session[«valorCadena»];

Aporte: Jorge Dieguez nos hace un comentario interesante: «..te recomiendo que en lugar de una(o varias) varaibles sueltas uses una clase que te centralize el acceso a la infromacion de contexto(usuario,su perfil, o lo que sea), esta clase es la responable de almacenear el estado en algun lugar(por ejemplo en la sesion) la idea es que la aplicacion no sepa como y donde se guarda la informacion de contexto..». Quizás es la solución más elegante de todas las planteadas.

Pues nada, si hay alguna corrección o manera más de hacer esto ponedlo en los comentarios y así vamos completando entre todos el post

P.D.: Si queréis más información sobre Global.asax podéis leer algo más aquí

Saludetes 🙂