方法 : MessageWindow クラスを使用する
更新 : 2007 年 11 月
.NET Compact Framework では、Windows ベースのメッセージを生成したり受信したりするための、MessageWindow クラスおよび Message クラスが用意されています。MessageWindow クラスでは、フォームを識別するハンドルを使用してネイティブ コードでウィンドウを作成し、ネイティブの Windows 関数へのプラットフォーム呼び出しのうち必要な呼び出しを実行します。MessageWindow クラスは .NET Compact Framework でのみ使用できます。
メッセージ ウィンドウへの Window ハンドル Hwnd を使用して、Windows メッセージをメッセージ ウィンドウに送信します。マネージ コードで Create を使用するか、アプリケーションでネイティブ コントロールを使用して、メッセージを生成できます。ユーザーが生成したメッセージだけを受信できます。MessageWindow を使用してオペレーティング システムのメッセージを監視することはできません。
メッセージ ウィンドウでは、特定のメッセージを検出したときに、WndProc メソッドを使用して、フォームを通知します。これを利用して、Windows ベースのメッセージに応答するコードを作成できます。
メモ : |
---|
MessageWindow の代わりに、.NET Compact Framework には、関数ポインタとしてデリゲートをマーシャリングし、ネイティブ コードからマネージ関数を直接呼び出すことのできる機能が用意されています。詳細については、「.NET Compact Framework の相互運用性」を参照してください。 |
使用例
ネイティブのコンポーネントを使用しない MessageWindow 機能の例を次に示します。マウス ポインタがカスタム コントロール内または Panel コントロール内の Rectangle にあるときに、現在のポインタの x 座標および y 座標を含む Windows メッセージをフォームに送信します。カスタム コントロールは、フォーム上のボックスとして表示されます。どちらのコントロールも、OnMouseMove メソッドを使用してメッセージを送信します。これらのメッセージには、x 座標および y 座標が含まれています。現在の x 座標と y 座標に付けられたラベル、およびメッセージを送信したコントロールを更新することで、フォームは、ユーザー定義の WM_BOXUPDATE および WM_PNLUPDATE メッセージに応答します。
マウスがボックスおよびパネルの外にあるときは、フォームの OnMouseMove メソッドによって、フォームのコンテキストで x 座標と y 座標に付けられたラベルが更新されます。
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);
}
}
}
コードのコンパイル方法
この例は、次の名前空間への参照を必要とします。