En la primera entrada de esta ya dilatada serie, Tablets MultiTouch MS Windows 7: Desarrollo de Aplicaciones, se analizaron las ventajas que presenta Windows 7 cara a la programación de un dispositivo tablet. Una de las ventajas que se presentaban era dotar a los objetos de inercia. Esta propiedad posibilita que los objetos cobren vida y sean más naturales sus movimientos ante las acciones del usuario.
Ahora podemos operar de forma táctil manejando un determinado objeto incorporado en una aplicación pudiéndolo lanzar, controlar la velocidad de lanzamiento y la propia inercia que adquiere el objeto, como puede apreciarse en la siguiente imagen.

Inertia
Para poder trabajar con esta propiedad debemos interactuar directamente con las librerías nativas de Windows o bien podemos hacer uso de WPF (Windows Presentation Fundation). En la entrada de hoy comentaremos el código necesario para trabajar con las librerías nativas de Windows 7, para ello utilizaremos una DLL proporcionada por Microsoft, y su código lo podemos descargar desde este link de descarga de librería. Esta DLL “Windows7.Multitouch” hará de intermediaria entre la aplicación y las librerías nativas de Windows. En futuras entradas comentaremos como realizar esta operativa sólo con WPF.
Una vez descargado y abierto el proyecto de la DLL “Windows7.Multitouch”, nos dirigimos al código de nuestra librería, que dispone de dos módulos relacionados con Inertia, el “Manipulationinterop” y “ManipulationInertiaProcessor”.

Proyecto DLL Inertia
La presente entrada se centra en “Manipulationinterop”. Este módulo va incluir los objetos COM nativos de Windows 7 para ser utilizados desde un proyecto .NET.
La primera actuación que realiza la DLL es registrar los GUID (Globally Unique Identifier ) de los COM de Windows 7 relacionados con Touch.
internal class IIDGuid
{
// IID GUID strings for relevant COM interfaces.
internal const string IManipulationEvents = "4f62c8da-9c53-4b22-93df-927a862bbb03";
internal const string IInertiaProcessor = "18b00c6d-c5ee-41b1-90a9-9d4a929095ad";
internal const string IManipulationProcessor = "A22AC519-8300-48a0-BEF4-F1BE8737DBA4";
}
internal class ClassIDGuid
{
internal const string InertiaProcessor = "abb27087-4ce0-4e58-a0cb-e24df96814be";
internal const string ManipulationProcessor = "597D4FB0-47FD-4aff-89B9-C6CFAE8CF08E";
}
De los objetos COM invocados en esta librería, interesa “IInertiaProcessor” al ser el encargado de gestionar la inercia de los objetos en Windows 7. Para añadirlo a la DLL en .Net será necesario implementar las llamadas del propio COM. Esta inclusión se realiza haciendo coincidir los métodos del objeto COM con nuestros métodos y delegando su acción a una llamada al objeto nativo COM. Esto se traduce en código de la siguiente manera: Primero se indica que el método es una importación de un objeto COM por medio de la directiva “ComImport()”, además se señala a que GUID pertenece y cuál es el tipo de interfaz, como se muestra en las siguientes líneas de código:
[ComImport(),
Guid(IIDGuid.IInertiaProcessor),
InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
internal interface IInertiaProcessor : IConnectionPointContainer
Una vez incluido el nombre de la interfaz del objeto COM se pasa a añadir los diferentes métodos de éste, siempre incorporando la directiva “MethodImpl” para indicar a .Net la realización de la llamada a un objeto externo. Se muestra a continuación los métodos implementados para “IInertiaProcessor” :
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
void Reset();
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
bool Process();
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
bool ProcessTime([In] int timestamp);
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
void Complete();
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
void CompleteTime([In] int timestamp);
Ya solo queda añadir las propiedades del objeto COM a “IInertiaProcessor”. Estas son iguales que en .Net con sus dos campos “get” y “set” pero siempre añadiendo la directiva “MethodImpl” para indicar la llamada al objeto nativo. Se muestra a continuación una propiedad a modo de ejemplo:
float InitialOriginX
{
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
get;
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
set;
}
De esta manera hemos realizado diversa llamadas a un objeto COM nativo de Windows 7 y realizado en C++, pero para ser usado en nuestra aplicación .Net con C#.
En la siguientes entradas se analizarán métodos relacionados con la inercia de los objetos y se adaptación en aplicaciones .Net.
Para acabar, recuerda que si quieres aprender mucho más sobre los secretos de los sistemas Microsoft Windows, te recomendamos leer el libro de Sergio de los Santos
"Máxima Seguridad en Windows: Secretos Técnicos" , o siempre puedes suscribirte al Canal RSS de Windows Técnico para estar al día de las novedades e información técnica de
interés.

Enviado
abr 20 2011, 02:29
por
Ignacio Briones