Developer's Diary

30 mayo, 2013

API SendMessage

Filed under: .net, API, Curso C#, Programación, Tips, Uncategorized — Etiquetas: , , , — jnavero @ 10:02 PM

Mientras preparo el/los siguientes post de Apache FOP, os dejo una api nueva, en esta ocasión SendMessage que sirve para enviar mensajes a una aplicación.

Antes de empezar a explicar esta API (SendMessage), voy a dar una pequeña introducción que es medio mentira pero, que servirá para definir mejor que es esto de los mensajes, con ello pretendo dar un punto de vista genérico a todo lo que nos rodea.

Por así decirlo, los mensajes son los eventos que produce una aplicación o que puede producir una aplicación o el sistema operativo, por ejemplo, cerrar una ventana, hacer click en un botón ect. Todos estos eventos, se pueden majenar con las APIs de gestión de mensajes sin más aquí os dejo la “Ficha de esta API”

API: SendMessage

Tipo de Función: Gestión de mensajes

LRESULT WINAPI SendMessage(
_In_ HWND hWnd,
_In_ UINT Msg,
_In_ WPARAM wParam,
_In_ LPARAM lParam
);

Parametros:

hWnd: Indica el manejador de la ventana u objeto al que le enviaremos un mensaje

Msg: Es el identificador del mensaje que se le pasará ver (abajo expongo una web con los mensajes posibles)

wParam: Valor de 32 Bits especifico del mensaje que se envía

lParam: Valor de 32 Bits especifico del mensaje que se envía

Retorna un resultado en función del mensaje enviado. Si la función falla retorna cero.

Ejemplo: Este ejemplo lo hice para responder a un post de MSDN está en VB pero, en C# es similar. Lo que hace exactamente, es cerrar un Messagebox automáticamente enviando un mensaje para cerrar la ventana.


'Antes de comenzar, he creado un nuevo proyecto de Windows con un botón y un timer con un intervalo de 2000ms (2seg).
'Primero declaramos las funciones necesarias para llamar a la api (En este caso he usado VB.NET, en C# es muy parecido).
Declare Auto Function FindWindow Lib "USER32.DLL" (ByVal lpClassName As String, ByVal lpWindowName As String) As IntPtr
Declare Function SendMessageA Lib "user32.dll" (ByVal hWnd As IntPtr, ByVal wMsg As Int32, ByVal wParam As Int32, ByVal lParam As String) As Int32

'Declaro la constante WM_CLOSE que me servirá para cerrar una ventana.
Private Const WM_CLOSE = &H10

Private Sub Button_Click(sender As System.Object, e As System.EventArgs) Handles Button.Click
Timer1.Start() ' Arranco el timer
MessageBox.Show("Prueba del mensaje", "Atencion")
End Sub

Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick
Timer1.Stop() ' paro el timer (no me interesa nada mas que una sola vez)
Dim ptr As IntPtr = FindWindow(Nothing, "Atencion") 'Busco la ventana para conseguir su Handle
If ptr IntPtr.Zero Then
SendMessageA(ptr, WM_CLOSE, Nothing, Nothing) ' Con el Handle (manejador) de la ventana le envio el mensaje para cerrarla, por lo que nuestro MessageBox se cerrará a los 2 segundos.
End If
End Sub

Podemos consultar los posibles mensajes aquí: http://www.pinvoke.net/default.aspx/Constants.WM

Saludos y hasta la próxima.

Anuncios

Dejar un comentario »

Aún no hay comentarios.

RSS feed for comments on this post. TrackBack URI

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

A %d blogueros les gusta esto: