ウィンドウ メッセージ (Windows messages)

Message 構造体

プロパティ  
IntPtr HWnd Gets or sets the window handle of the message.
IntPtr LParam Specifies the LParam field of the message.
int Msg Gets or sets the ID number for the message.
IntPtr Result Specifies the value that is returned to Windows in response to handling the message.
IntPtr WParam Gets or sets the WParam field of the message.
プロパティ - Message 構造体 (System.Windows.Forms) | Microsoft Learn

LParamやWParamなどの型がIntPtrとなっていますが、実際のビット数はプラットフォーム依存のため、扱いには注意が必要です。

Msg プロパティ

IMessageFilter インターフェイス

このインターフェイスをコントロールやフォームに実装することで、それらに送られるメッセージを捕捉できます。

PreFilterMessage()

[SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]
bool PreFilterMessage(
    ref Message m
)
IMessageFilter.PreFilterMessage メソッド (Message) (System.Windows.Forms) | MSDN

Controlクラス

Controlクラスの、メッセージを処理できるメソッド
  戻り値の型 メソッド
public PreProcessControlState PreProcessControlMessage(ref Message msg)
public virtual bool PreProcessMessage(ref Message msg)
protected virtual void DefWndProc(ref Message m)
protected virtual void OnNotifyMessage(Message m)
protected virtual bool ProcessCmdKey(ref Message msg, Keys keyData)
protected virtual bool ProcessKeyEventArgs(ref Message m)
protected virtual bool ProcessKeyPreview(ref Message m)
protected virtual void WndProc(ref Message m)
protected internal virtual bool ProcessKeyMessage(ref Message m)
protected static bool ReflectMessage(IntPtr hWnd, ref Message m)
メソッド - Control クラス (System.Windows.Forms) | MSDN

WndProc()

Windowsメッセージを処理できます。

[SecurityPermissionAttribute(SecurityAction.InheritanceDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]
[SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]
protected virtual void WndProc(
    ref Message m
)
Control.WndProc(Message) メソッド (System.Windows.Forms) | Microsoft Learn

これを継承したコントロールでオーバーライドするときには、ハンドルされなかったメッセージを処理するために基本クラスのメソッドを呼び出します。さもなくば実行時に「ウィンドウのハンドルを作成中にエラーが発生しました。」としてSystem.ComponentModel.Win32Exception例外が発生します。Notes to Inheritors - Control.WndProc(Message) Method (System.Windows.Forms) | Microsoft Learn

private const int WM_CREATE = 0x0001;

protected override void WndProc(ref Message m)
{
    switch (m.Msg)
    {
        case WM_CREATE:
            break;
    }
    base.WndProc(ref m);
}

PreProcessMessage()

メッセージ ループ内のキーボードや入力メッセージを、ディスパッチ (dispatch) される前に処理できます。

[SecurityPermissionAttribute(SecurityAction.InheritanceDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]
[SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]
public virtual bool PreProcessMessage(
    ref Message msg
)
Control.PreProcessMessage(Message) メソッド (System.Windows.Forms) | Microsoft Learn

msgで処理するメッセージが渡されます、このとき有効な値は下表の4つです。

メッセージ  
WM_KEYDOWN WM_KEYDOWN message (Windows) | MSDN
WM_SYSKEYDOWN  
WM_CHAR  
WM_SYSCHAR  

コントロールでメッセージを処理したならば、trueを返します。

メッセージの送信

C++のSendMessage()などを、[DllImport("user32")]を用いて呼びます。

たとえばUnsafeNativeMethodsクラスのSendMessage()では、次のように宣言されています。

[DllImport(ExternDll.User32, CharSet=System.Runtime.InteropServices.CharSet.Auto)]
[ResourceExposure(ResourceScope.None)]
public static extern IntPtr SendMessage(HandleRef hWnd, int msg, IntPtr wParam, IntPtr lParam);
Microsoft Learnから検索