Saltar al contenido principal

Desarrollo

Inicio
Novedades
Desarrollo
Infraestructura
Recursos
Dynamics Mobile
Ring blog
Foros
Eventos
Blog Mnug
MobileNugTV
Buscar

Mobile .Net users group > Desarrollo
Seccion para desarrolladores

 Desarrollo sobre Windows Mobile

Personalizando un control Listview
 
Como la mayoría de los desarrolladores el sentido del diseño lo tuve aparcado durante algún tiempo, pero a medida que te involucras en los desarrollos, y sobre todo cuando estas cerca del cliente de das cuenta que una buena funcionalidad no lo es todo, el cliente/usuario final, no tiene porque comprender la complejidad de un desarrollo y posiblemente no sepa valorarla, en cambio una interfaz de usuario atractiva cambia las cosas, algunas de las principales novedades respecto a tecnología móvil en estos últimos tiempos ha ido principalmente en esa dirección, creando nuevos medios de interacción con el usuario, como pueden ser los acelerometros, o interfaces de usuario atractivas como el Touch flow de htc... pero eso lo estoy dejando para un post posterior.
 
Este fin de semana rastreando por la msdn e recopilado unos cuantos métodos para crear un control Listview personalizado para Compact Framework.
 
Curiosamente todas las funcionalidades que vamos a utilizar para la creación de este control YA están contenidas en el mismo de forma nativa, pero por algún motivo que aún no he descubierto, estas propiedades no están accesibles en el control desde código manejado, por lo que únicamente tendremos que enviar los mensajes necesarios para activar las funcionalidades que deseemos y obtener un resultado como el de la imagen... (insisto... no soy diseñador jeje)
 
 
Para poder crear nuestro propio control listView crearemos un control personalizado que herede del control ListView y a continuación declararemos la funciones que harán las llamadas a nativo, para esto tan solo necesitamos la invocación a SendMessage (Manejado , Nativo)
 
Una vez agregada la llamada declararemos las propiedades que extenderán nuestro control Gradient, GridLines, BackgroundImage y DoubleBuffering éstas funciones hacen relación con las constantes LVS_EX_GRADIENT, LVS_EX_GRIDLINES, LVM_SETBKIMAGE y LVS_EX_DOUBLEBUFFER respectivamente. Si queréis ver todas las posibilidades visitar este enlace.
 
Como no soy muy dado a andarme por las ramas aquí os dejo un ejemplo con el código fuente del control y la aplicación de ejemplo, lo único destacar lo siguiente, he buscado los ejemplos para mostrar como utilizar la funcionalidad bien mediante p/invoke o bien mediante MessageWindow.SendMessage desde el espacio de nombres Microsoft.WindowsCE.Forms.
 
 
Un saludo a todos y espero que os sea útil, por su puesto si lo ampliáis seria fantástico que lo compartáis. Esto mismo se puede hacer con otros controles. Así que adelante.
Fecha de creación: 03/01/2009 21:00
Redactor: Jose Antonio Gallego

Implementando un Hard-Reset por código en Windows Mobile 6.x

Un tema bastante peliagudo en los tiempos que corren es el de la seguridad de los datos que almacenamos en nuestras aplicaciones, sobre todo cuando hablamos de aplicaciones de gestión empresarial, en las cuales almacenamos datos confidenciales de nuestros clientes, como facturación, deudas, compras habituales...

Si bien es cierto que si en nuestra empresa contamos con un servidor Exchange podemos forzar el borrado remoto, también es cierto que hasta que no nos demos cuenta de que el dispositivo ha "cambiado" de dueño no podremos dar dicha orden.

Aquí os dejo un ejemplo muy simple de como implementar el hard-reset del dispositivo para Windows Mobile 6.x utilizando el sistema de aprovisionamiento OMA Client.

Este sistema nos permite configurar nuestros dispositivos, desde agregar enlaces a la lista de favoritos del Explorer, hasta el ejecutar el borrado mediante Hard-Reset de nuestro dispositivo, esto último es lo que ha propiciado la redacción de este post.

Para ello es tan sencillo como componer el documento XML correspondiente.

<wap-provisioningdoc>
  <characteristic type="RemoteWipe">
      <parm name="doWipe" value="1"/>
  </characteristic>
</wap-provisioningdoc>

En este documento vemos que vamos a ejecutar la característica RemoteWipe y como parámetro le especificamos la acción doWipe.

Como ejecutamos esto desde nuestra aplicación, muy sencillo, para ello utilizaremos el método ProcessConfiguration esta clase se encuentra dentro del ensamblado Microsoft.WindowsMobile.Configuration por lo que deberemos agregar este nombre de espacio como referencia a nuestro proyecto.

Éste método tiene dos parámetros, veamos la sintaxis:

XmlDocument ProcessConfiguration (XmlDocument configDoc,bool metadata)

Donde configDoc será el documento XML con el que se aprovisionará nuestro dispositivo, y con el parámetro de metadata especificamos si vamos a recoger la respuesta, este último parámetro es muy útil si queremos controlar los errores que se puedan producir o por si el archivo de aprovisionamiento debe generar una salida, como puede ser por haber realizado algún tipo de consulta.

Una vez visto esto vamos a por el ejemplo:

public bool doWipe()
{
string WipeCSP = @"<wap-provisioningdoc>
                    <characteristic type='RemoteWipe'>
                    <parm name='doWipe' value='1'/>
                    </characteristic>
                   </wap-provisioningdoc>";

//Documento en el que almacenaremos la respuesta
System.Xml.XmlDocument xmlDocRes;

//Documento donde cargaremos el xml de aprovisionamiento

XmlDocument configDoc = new XmlDocument();
configDoc.LoadXml(WipeCSP);

//Llamada al configuration manager
xmlDocRes = ConfigurationManager.ProcessConfiguration(configDoc, true);

//TODO: aquí iría el procesamiento del documento de retorno
return true;
}

Ojo que esto solo es valido para dispositivos con Windows Mobile 6.0 o superior no funciona en Windows Mobile 5.0 ni en Windows Mobile 2003.

Otro tema importante es que, muy bien, ya he flaseado la PDA pero que pasa con mi tarjeta de almacenamiento... y es que muchas veces los datos guardados en la tarjeta de memoria de nuestro dispositivo es mucho más importante que el contenido de la propia PDA, bien porque la aplicación guarde los datos en la tarjeta de memoria (bien porque hayamos hechos fotos comprometedoras que no queremos que nadie vea jeje) a partir de Windows Mobile 6.1 también es posible forzar el cifrado de la tarjeta SD utilizando el mismo sistema que hemos implementado para realizar el reset de la pda, tan solo hemos de utilizar el siguiente xml de aprovisionamiento y listo.

<wap-provisioningdoc>
<characteristic type="MobileEncryption">
   <parm name="Enable" value="1" />
</characteristic>
</wap-provisioningdoc>

Con esto y un bizcocho aquí os dejo un listado de enlaces para los que estéis interesados en investigar un poquito más en el tema del aprovisionamiento de los dispositivos móviles.

Understanding Provisioning (MSDN)

Options for Delivering Provisioning XML Files to Windows Mobile-Based Devices

Ejecutando archivos de aprovisionamiento desde nativo c++

Como final, desearos a todos una felices fiestas, ya que a muchos no nos ha tocado la lotería, nos seguiremos viendo por aquí.

Fecha de creación: 23/12/2008 11:00
Redactor: Jose Antonio Gallego
Servicios en Windows Mobile bajo codigo manejado

Recientemente me encontrado con un proyecto en Codeplex para la utlización de servicios bajo Windows Mobile de Peter Nowak llamado Managed Services for Windows Mobile. Se trata de una librería bajo código administrado que permite la creación de Servicios de forma aproximada a como lo hace Windows Desktop.


Entre sus características destaca: 

  • Para utilizar esta libreria no se requiere de acceso a P/Invoke.
  • Está desarrollada en .NET CF 2.0.
  • Ejecuta servicios automáticamente al iniciar el sistema
  • Contiene un administrador bastante sencillo de utilizar.

Por las pruebas que he realizado en un emulador tiene, aparentemente -está en versión Alpha-, buena pinta. Desde el mismo site de Codeplex viene con un ejemplo de servicio, documentación, código fuente y el Service Manager utility, con lo que ejecutarlo o crear tu propio servicio no es demasiado complicado, otra cosa es entender realmente como funciona internamente.

Por lo visto, está basado en un post del blog de Pavel Bánský, en el que explica cómo desarrollar servicios para Windows Mobile bajo código administrado. Todo parte de la idea de ejecución in-process de una DLL bajo \Windows\Services.exe, sin embargo la forma más habitual para hacerlo es mediante código nativo. Pavel muestra como encapsular las llamadas a WinCE y Peter se basa en el resultado para crear una librería íntegra para la creación de servicios bajo código administrado.

Si quereis profundizar más sobre el tema mirad en Services.exe Application Development for Windows Mobile-based Devices.

Fuente: www.desarrollobile.net

www.desarrollomobil.net

Fecha de creación: 02/12/2008 0:00
Redactor: Jose Miguel Torres
1 - 3 Siguiente

 Desarrollo sobre Windows Embedded

Kit de Certificación para Windows Embedded CE 6.0
 
Atención fanticos de las certificaciones, hace un tiempo ya se publico la existencia en MSDN de un kit de certificación GRATUITO para Windows CE 6.0.

Windows Embedded

Este kit además de permitirnos (una vez registrados) descargar todo su contenido en pdf incluye además un voucher con el 50% de descuento para poder realizar el examen. Pero ojito que la oferta ¡¡¡CADUCA el 30 de Agosto!!!
 
El kit incluye los siguientes capitulos y podrés acceder a ellos en este enlace
 
Capitulo 1 - Customizing the Operating System Design
Capitulo 2 - Building and Deploying the Runtime Image
Capitulo 3 - Performing System Programming
Capitulo 4 - Debugging and Testing the System
Capitulo 5 - Customizing a Board Support Package
Capitulo 6 - Developing Device Drivers
 
¡¡Daros prisa que solo queda poco más de un mes!!
 
 
Redactor: Jose Antonio Gallego
Datos adjuntos:
Como crear una imagen en XPe para arrancar desde un USB
 
Gracias a las nuevas características incluidas en el Feature pack 2007 de Windows XPe ahora es posible configurar de un modo sencillo el arranque del sistema desde una unidad de almacenamiento USB.

En el documento adjunto se muestra como realizar esta tarea paso a paso.

INDICE
Iniciando el sistema operativo XPe desde un dispositivo USB
1. Iniciando el sistema operativo XPe desde un dispositivo USB
1.1. Requerimientos para el arranque desde un USB
1.2. Limitaciones del arranque USB
1.3. Iniciando XPe desde un USB
Paso1: Formatear el dispositivo USB
Paso 2: Crear el archivo .pmq
Paso 3: Importar el archivo .pmq al Target Designer
Paso 4: Agregar el componente para el arranque desde un USB
Paso 5: Construir una imagen arrancable desde USB y pasarla al dispositivo USB 10
2. Resolución de errores
2.1. Formatear de forma correcta el dispositivo de almacenamiento
2.2. Verificar la compatibilidad de la BIOS y la unidad de almacenamiento USB
2.3. Verificar los dispositivos de inicio.

[Ver documento] PDF 14 páginas 548 KB (561.152 bytes)
Redactor: Jose Antonio Gallego
Datos adjuntos: Datos adjuntos

 Trucos

Como recuperar imágenes guardadas en SQL ce
 
Hace unas semanas pusimos como poder guardar imagenes dentro de una base de datos de SQL Ce... pero que cabeza que no pusimos como recuperarlas!!! pero ya esta... tranquilos que aquí va el ejemplo.
 

public Image RecuperarImagen()
{
Image dibujo = null;

//Declaramos y abirmos la conexión
SqlCeConnection conexion = new SqlCeConnection("Data source=" + cadenaConexion);

conexion.Open();

//Creamos el comando SQL para recuperar la imagen, atentos a @Imagen
string comandoSQL = "SELECT Imagen FROM Cliente WHERE Nombre = @nombre";

SqlCeCommand comando = new SqlCeCommand(comandoSQL, conexion);

//Asignamos el array de bytes al parametro @nombre
comando.Parameters.Add("@nombre", "PACO");

SqlCeDataReader reader;

reader = comando.ExecuteReader();

if (reader.Read())
{

//  Aqui va la parte interesante
Byte
[] imagenByteData = (Byte[])reader[0];

//Creamos un stream en memoria para guardar la imagen
MemoryStream memStream = new MemoryStream(imagenByteData);

//Guardamos la imagen utilizando la funcion Bitmap que nos permite recuperar imagenes desde un stream
dibujo =
new Bitmap(memStream);
memStream.Close();
}

conexion.Close();
//Retornamos la imagen
return
dibujo;

}

    

Podéis descargar la solución de ejemplo competa para Visual Studio 2005, Windows Mobile 5.0 y SQL CE 3.1 <aqui>

Datos adjuntos:
Redactor: Jose Antonio Gallego
Enviando pulsaciones de teclado en Compact Framework

Hace unos días me vi en la necesidad de tener que enviar pulsaciones de teclado en una aplicación en Compact Framework, tras trastear un poquillo encontré esta solución en MSDN que os paso a continuación.

Aquí os dejo un ejemplo un poquito modificado para lo que yo necesitaba por si os es útil.
 

[DllImport("coredll.dll", SetLastError = true)]

static extern void keybd_event(byte bVk, byte bScan, int dwFlags, int dwExtraInfo);

 

/// <summary>

/// Eventos de la tecla

/// </summary>

const int KEYEVENTF_KEYUP = 0x2;

const int KEYEVENTF_KEYDOWN = 0x0;

       

 

private void mnuTest_Click(object sender, EventArgs e)

  {

    //Enviamos el texto

    sendKeys("MOBILE NET USERS GROUP");

  }

 

/// <summary>

/// Procesa la cadena y la envia al teclado

/// </summary>

/// <param name="mytext"></param>

public void sendKeys(string mytext)

  {

    mytext = mytext.ToUpper();

    foreach (char ch in mytext)

      {

        keybd_event((byte)ch, 0, KEYEVENTF_KEYDOWN,0);

      }

    }

  }

 

Esto es valido a partir de Windows CE 5.0 y posterior

Descarga el ejemplo en este enlace

Datos adjuntos:
Redactor: Jose Antonio Gallego
Como bloquer tu Windows Mobile con PIN Lock por codigo
 
Se trata de ejecutar el sistema de bloqueo de PIN de Windows Mobile. Es muy sencillo peeeeero (siempre hay un pero) es necesario que previamente hayamos configurado un PIN en nuestra PDA, para ello iremos a Inicio->Configuracion->Personal->Bloquear y configuraremos un PIN.
 
En nuestra aplicación tan solo tendremos que realizar la siguiente llamada a SHDeviceLockAndPrompt (más informacion en MSDN).

La funcion nos retornara 0 si SE EMPEZO a ejcutar correctamente, esto no quiere decir que sea cien por cien fiable! si no tenemos un PIN configurado el valor de retorno será el correcto pero NO se bloqueará el dispositivo.
 

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;

public class LockDevice

{
  [
DllImport("aygshell.dll")]
 
private extern static IntPtr SHDeviceLockAndPrompt();

  public IntPtr PINLock()
  {
    
IntPtr hresult = SHDeviceLockAndPrompt();
    
return hresult;
   }
}

Esto es valido a partir de Windows CE 5.1 y posterior

Datos adjuntos:
Redactor: Jose Antonio Gallego
1 - 3 Siguiente
 
 

WebCast Grabados

 Lectura recomendada


SQL Server Compact 2008


 Trucos de desarrollo

Como cargar una imagen guardada en SQL CEUtilizar Mayús+Entrar para abrir el menú (nueva ventana)
Enviando pulsaciones de teclado en Compact FrameworkUtilizar Mayús+Entrar para abrir el menú (nueva ventana)
Como bloquear tu Windows Mobile con PIN LockUtilizar Mayús+Entrar para abrir el menú (nueva ventana)
Como activar el Bluetooth en tu PDAUtilizar Mayús+Entrar para abrir el menú (nueva ventana)
Como apagar la PDA por código en Windows MobileUtilizar Mayús+Entrar para abrir el menú (nueva ventana)
Como insertar una imagen en una base de datos de SQL CEUtilizar Mayús+Entrar para abrir el menú (nueva ventana)
Como obtener el IMSI de la tarjeta SIMUtilizar Mayús+Entrar para abrir el menú (nueva ventana)
Como utilizar la camara desde codigo en Windows MobileUtilizar Mayús+Entrar para abrir el menú (nueva ventana)
Detectar cuando conectamos la PDA a la cunaUtilizar Mayús+Entrar para abrir el menú (nueva ventana)
Como personalizar las propiedades de Outlook MobileUtilizar Mayús+Entrar para abrir el menú (nueva ventana)
Envio de correo con T-SQLUtilizar Mayús+Entrar para abrir el menú (nueva ventana)

 Artículos desarrollo mobile

Personalizando un control Listview
Implementando un Hard-Reset por código en Windows Mobile 6.x
Servicios en Windows Mobile bajo codigo manejado
Disponible el emulador de Internet Explorer 6 para Mobile en Visual Studio
Como utilizar el GPS con Compact Framework
Sony Ericcson lanza un nuevo SDK Create XPERIA™ X1 Panels para Windows Mobile® 6.1
Windows Mobile API Usage Tool
Aplicaciones en modo Kiosco para Windows Mobile
Barman MobileNUG Friki desarrollo en Compact Framework
Desarrollar sobre compact GDI. Buscaminas MNUG
Servicios en una PDA para tareas en background
SharpDevelop: IDE Open Source para CF
Skin personalizado para Smartphone HTC620 QVGA
Como crear un elemento en el menú TODAY de Windows Mobile
Desarrollar sobre OutlookMobile
Videos para dispositivos
Como activar el vibrador de una PDA
Desarrollo de soluciones de movilidad en WM5, WM6 con VS .NET
Novedades en Visual Studio 2008 y Compact Framework 3.5
Modificar colores en un bitmap sin utilizar GDI en CF
Crear un autorun para tarjetas SD

 Enlaces recomendados

  Novedades Compact Framework 3.5 (en-EN)
  Videos desarrollo sobre dispositivos (en-EN)
  Preparación examen 70-540 Desarrollo mobile 5.0
  Windows Mobile Developer Center
  Preparación examen 70-571 Desarrollo Windows Embedded CE 6.0
  MSDN Desarrollo para dispositivos VS2005 [es-ES]
  MSDN Desarrollo para dispositivos con VS2008 [es-ES]
  Introducción al desarrollo con Windows Mobile
  Windows Live Dev
  New site for mobile developers [en-US]

 Colaboradores


DesarrolloMobile.NET