NonSoft

Windowsメッセージを送信/受信する
サンプル(C#.NET)


 サンプル(ソース/コード)
<このサンプルの概要>
外部アプリケーションから送信されたWindowsメッセージをC#.NETのウィンドウで受信するサンプルです。

外部アプリケーション(他EXE)に指令を送信する手段としてWindowsメッセージがあります。
WindowsメッセージとはWM_XXXX(例:WM_GETTEXTやWM_SETTEXT)で表現されているメッセージです。
Windowsメッセージは通常、OSとAPの間で送受信されますが、AP間でも送受信が可能です。

WindowsメッセージはSendMessageやPostMessageで送信出来ます。

そのWindowsメッセージをVB6のウィンドウ(フォームやコントロール)で受信するには、
サブクラス化という処理が必要です。

このサンプルでは、VB6のサブクラス化の処理をシンプルにまとめ、C#.NETに移植しました。
サンプルを簡単にするためWindowsメッセージ送信側と受信側を同じフォームに記述しています。

VB6やVB.NETのサンプルはこちらです。
Windowsメッセージを送信/受信するサンプル(VB6)
Windowsメッセージを送信/受信するサンプル(VB.NET)

★フォーム(Form1.cs)
public partial class Form1 : Form
{
    // 独自(カスタム)メッセージ送信側の処理=======================================================
    [DllImport("user32.dll", EntryPoint = "SendMessageA")]
    extern static int SendMessage(int hwnd, int msg, int wParam, int lParam);
    // ウィンドウにメッセージを送信するAPI
    private void Button1_Click(object sender, EventArgs e)
    {
        // 独自メッセージ送信
        SendMessage((int)this.Handle, 9999, 0, 0);
    }
    // ===========================================================================================

    // 独自(カスタム)メッセージ受信側の処理=======================================================
    private void Form1_Load(object sender, EventArgs e)
    {
        // 独自メッセージの処理を開始
        Class1.Start_MyWndProc((int)this.Handle);
    }
    private void Form1_FormClosed(object sender, FormClosedEventArgs e)
    {
        // 独自メッセージの処理を終了
        Class1.End_MyWndProc((int)this.Handle);
    }
    // ===========================================================================================
}

★クラス(Class1.cs)
class Class1
{
    // 独自(カスタム)メッセージ処理モジュール=====================================================
    // メッセージ処理関数用デリゲート
    private delegate int D_MyWndProc(int hwnd, int msg, int wParam, int lParam);

    // ウィンドウをサブクラス化するAPI
    private static int GWL_WNDPROC = -4;
    [System.Runtime.InteropServices.DllImport("user32.dll", EntryPoint = "GetWindowLongA")]
    extern static int GetWindowLong(int hwnd, int nIndex);
    [System.Runtime.InteropServices.DllImport("user32.dll", EntryPoint = "SetWindowLongA")]
    extern static int SetWindowLong(int hwnd, int nIndex, int dwNewLong);
    [System.Runtime.InteropServices.DllImport("user32.dll", EntryPoint = "SetWindowLongA")]
    extern static int SetWindowLong(int hwnd, int nIndex, D_MyWndProc dwNewLong);
    [System.Runtime.InteropServices.DllImport("user32.dll", EntryPoint = "CallWindowProcA")]
    extern static int CallWindowProc(int lpPrevWndFunc, int hwnd, int msg, int wParam, int lParam);

    // デフォルトのメッセージ処理関数
    private static int lngWnP;

    // 独自メッセージの処理を開始
    public static void Start_MyWndProc(int hwnd)
    {
        lngWnP = GetWindowLong(hwnd, GWL_WNDPROC);
        SetWindowLong(hwnd, GWL_WNDPROC, MyWndProc);
    }

    // 独自メッセージの処理を終了
    public static void End_MyWndProc(int hwnd)
    {
        SetWindowLong(hwnd, GWL_WNDPROC, lngWnP);
    }

    // ウィンドウに来たメッセージを振り分ける関数
    private static int MyWndProc(int hwnd, int msg, int wParam, int lParam)
    {
        switch (msg)
        {
            case 9999:
                System.Windows.Forms.MessageBox.Show("メッセージを受信しました");
                break;
            default:
                return CallWindowProc(lngWnP, hwnd, msg, wParam, lParam);
        }
        return 0;
    }
    // ===========================================================================================
}