Comment : utiliser la classe MessageWindow
Mise à jour : novembre 2007
Le .NET Compact Framework fournit les classes MessageWindow et Message pour générer et recevoir des messages Windows. La classe MessageWindow crée une fenêtre dans le code natif avec un handle de votre formulaire et exécute les appels de code non managé requis aux fonctions Windows natives. La classe MessageWindow est disponible uniquement dans le .NET Compact Framework.
Utilisez le handle de fenêtre de la fenêtre de messages, Hwnd, pour l'envoi de messages Windows à la fenêtre de messages. Vous pouvez générer des messages à l'aide de Create dans le code managé ou en utilisant un contrôle natif dans votre application. Vous pouvez recevoir uniquement les messages que vous générez. Vous ne pouvez pas utiliser MessageWindow pour contrôler les messages de système d'exploitation.
La fenêtre de messages notifie un formulaire, à l'aide de la méthode WndProc, lorsqu'elle détecte des messages spécifiques, qui vous permettent de fournir le code en réponse à un message Windows.
Remarque : |
---|
Notez que le .NET Compact Framework permet de marshaler des délégués en tant que pointeurs fonction et d'appeler directement des fonctions managées à partir de code natif, comme une alternative à MessageWindow. Pour plus d'informations, consultez Interopérabilité dans le .NET Compact Framework. |
Exemple
Cet exemple montre les fonctionnalités de MessageWindow, mais sans un composant natif. Il envoie des messages Windows qui contiennent les coordonnées x et y du pointeur actuel, vers un formulaire lorsque le pointeur de la souris est dans un Rectangle dans un contrôle personnalisé ou dans un contrôle Panel. Le contrôle personnalisé apparaît comme une zone sur le formulaire. Les deux contrôles utilisent la méthode OnMouseMove pour envoyer des messages. Ces messages contiennent les coordonnées x et y. Le formulaire répond aux messages WM_BOXUPDATE et WM_PNLUPDATE définis par l'utilisateur en mettant à jour une étiquette avec les coordonnées x et y actuelles, ainsi que le contrôle qui a envoyé le message.
Lorsque la souris est à l'extérieur de l'objet Box et de l'objet Panel, la méthode OnMouseMove du formulaire met à jour l'étiquette avec les coordonnées x et y dans le contexte du formulaire.
Imports System
Imports System.Windows.Forms
Imports Microsoft.WindowsCE.Forms
Public Class MessageWindowForm
Inherits System.Windows.Forms.Form
Private mainMenu1 As System.Windows.Forms.MainMenu
' Create an instance of MsgWindow, a derived MessageWindow class.
Private MsgWin As MsgWindow
Public Sub New()
InitializeComponent()
' Create the message window using this form for its constructor.
Me.MsgWin = New MsgWindow(Me)
End Sub
Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
MyBase.Dispose(disposing)
End Sub
#Region "Windows Form Designer generated code"
Private Sub InitializeComponent()
Me.mainMenu1 = New System.Windows.Forms.MainMenu
'
' MessageWindowForm
'
Me.Menu = Me.mainMenu1
Me.Text = "Message Window Test"
End Sub
#End Region
Shared Sub Main()
Application.Run(New MessageWindowForm)
End Sub
' Process taps to generate messages
' with the WParam and LParam parameters
' using the X and Y mouse coordinates.
Protected Overrides Sub OnMouseMove(ByVal e As MouseEventArgs)
Dim msg As Microsoft.WindowsCE.Forms.Message = _
Microsoft.WindowsCE.Forms.Message.Create(MsgWin.Hwnd, _
MsgWindow.WM_CUSTOMMSG, New IntPtr(e.X), New IntPtr(e.Y))
MessageWindow.SendMessage(msg)
MyBase.OnMouseMove(e)
End Sub
' This callback method responds to the Windows-based message.
Public Sub RespondToMessage(ByVal x As Integer, ByVal y As Integer)
Me.Text = "X = " + x.ToString() + ", Y= " + y.ToString()
End Sub
End Class
' Derive MessageWindow to respond to
' Windows messages and to notify the
' form when they are received.
Public Class MsgWindow
Inherits MessageWindow
' Assign integers to messages.
' Note that custom Window messages start at WM_USER = 0x400.
Public Const WM_CUSTOMMSG As Integer = &H400
' Create an instance of the form.
Private msgform As MessageWindowForm
' Save a reference to the form so it can
' be notified when messages are received.
Public Sub New(ByVal msgform As MessageWindowForm)
Me.msgform = msgform
End Sub
' Override the default WndProc behavior to examine messages.
Protected Overrides Sub WndProc(ByRef msg As Microsoft.WindowsCE.Forms.Message)
Select Case msg.Msg
' If message is of interest, invoke the method on the form that
' functions as a callback to perform actions in response to the message.
Case WM_CUSTOMMSG
Me.msgform.RespondToMessage(Fix(msg.WParam.ToInt32), Fix(msg.LParam.ToInt32))
End Select
' Call the base class WndProc method
' to process any messages not handled.
MyBase.WndProc(msg)
End Sub
End Class
using System;
using System.Windows.Forms;
using Microsoft.WindowsCE.Forms;
namespace MsgWindow
{
public class MessageWindowForm : System.Windows.Forms.Form
{
private System.Windows.Forms.MainMenu mainMenu1;
// Create an instance of MsgWindow, a derived MessageWindow class.
MsgWindow MsgWin;
public MessageWindowForm()
{
InitializeComponent();
// Create the message window using this form for its constructor.
this.MsgWin = new MsgWindow(this);
}
protected override void Dispose( bool disposing )
{
base.Dispose( disposing );
}
#region Windows Form Designer generated code
private void InitializeComponent()
{
this.mainMenu1 = new System.Windows.Forms.MainMenu();
this.Menu = this.mainMenu1;
this.Text = "Message Window Test";
}
#endregion
static void Main()
{
Application.Run(new MessageWindowForm());
}
// Process taps to generate messages
// with the WParam and LParam parameters
// using the X and Y mouse coordinates.
protected override void OnMouseMove(MouseEventArgs e)
{
Message msg = Message.Create(MsgWin.Hwnd,
MsgWindow.WM_CUSTOMMSG,
(IntPtr)e.X,
(IntPtr)e.Y);
MessageWindow.SendMessage(ref msg);
base.OnMouseMove(e);
}
// This callback method responds to the Windows-based message.
public void RespondToMessage(int x, int y)
{
this.Text = "X = " + x.ToString() + ", Y= " + y.ToString();
}
}
// Derive MessageWindow to respond to
// Windows messages and to notify the
// form when they are received.
public class MsgWindow : MessageWindow
{
// Assign integers to messages.
// Note that custom Window messages start at WM_USER = 0x400.
public const int WM_CUSTOMMSG = 0x0400;
// Create an instance of the form.
private MessageWindowForm msgform;
// Save a reference to the form so it can
// be notified when messages are received.
public MsgWindow(MessageWindowForm msgform)
{
this.msgform = msgform;
}
// Override the default WndProc behavior to examine messages.
protected override void WndProc(ref Message msg)
{
switch(msg.Msg)
{
// If message is of interest, invoke the method on the form that
// functions as a callback to perform actions in response to the message.
case WM_CUSTOMMSG:
this.msgform.RespondToMessage((int)msg.WParam, (int)msg.LParam);
break;
}
// Call the base WndProc method
// to process any messages not handled.
base.WndProc(ref msg);
}
}
}
Compilation du code
Cet exemple nécessite des références aux espaces de noms suivants :