Amazonでお得な買い物

【C#超入門】ウィンドウメッセージの送受信をしてみる

C# ウィンドウメッセージ

今回はC#でウィンドウメッセージの送受信をするサンプルコードを紹介します。

目次
スポンサーリンク

ウィンドウメッセージとは?

ウィンドウメッセージは、Windowsアプリケーションでウィンドウ間通信を実現する仕組みです。

ウィンドウの作成、操作、状態変化時に発生し、マウスやキーボード入力、描画更新などの情報を含みます。

ウィンドウプロシージャを通じて処理され、ユーザーの操作や外部イベントに対する応答を実現します。

ウィンドウメッセージを送受信するサンプルコード(コンソールアプリ)

それでは、C#でウィンドウメッセージを送受信するサンプルコードを紹介していきます。

送信側と受信側に分けて解説するので、ぜひ最後までご覧になってくださいね。

送信側のコード

サンプルコード(送信側)

using System;
using System.Runtime.InteropServices;

namespace ConsoleMessageSenderApp
{
    class Program
    {
        const int WM_CUSTOM_MESSAGE = 0x8000; // カスタムメッセージのID

        [DllImport("user32.dll")]
        public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

        [DllImport("user32.dll")]
        public static extern int SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam);

        static void Main(string[] args)
        {
            IntPtr receiverHandle = FindWindow(null, "ConsoleMessageReceiverApp"); // 受信側のウィンドウを探す
            if (receiverHandle != IntPtr.Zero)
            {
                SendMessage(receiverHandle, WM_CUSTOM_MESSAGE, IntPtr.Zero, IntPtr.Zero);
            }
        }
    }
}

受信側のコード

サンプルコード(受信側)

using System;
using System.Runtime.InteropServices;

namespace ConsoleMessageReceiverApp
{
    class Program
    {
        const int WM_CUSTOM_MESSAGE = 0x8000; // カスタムメッセージのID

        [DllImport("user32.dll")]
        public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

        [DllImport("user32.dll")]
        public static extern int SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam);

        static void Main(string[] args)
        {
            Console.WriteLine("待機中...");
            while (true)
            {
                IntPtr consoleWindow = FindWindow(null, "ConsoleMessageReceiverApp"); // 自身のウィンドウを探す
                if (consoleWindow != IntPtr.Zero)
                {
                    break;
                }
            }
            Console.WriteLine("メッセージを受け取りました!");
        }
    }
}

実行結果

待機中...
メッセージを受け取りました!

ウィンドウメッセージを送受信するサンプルコード(フォームアプリ)

先ほどのサンプルコードをWindowsフォームアプリに変換してみます。

フォームアプリではウィンドウプロシージャ(WinProc)で処理することが可能なので以下のようなコードになります。

送信側のコード

サンプルコード(送信側)

using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace MessageSenderApp
{
    public partial class MainForm : Form
    {
        const int WM_CUSTOM_MESSAGE = 0x8000; // カスタムメッセージのID

        [DllImport("user32.dll")]
        public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

        [DllImport("user32.dll")]
        public static extern int SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam);

        public MainForm()
        {
            InitializeComponent();
        }

        private void SendMessageButton_Click(object sender, EventArgs e)
        {
            IntPtr receiverHandle = FindWindow(null, "受信側ウィンドウ"); // 受信側のウィンドウを探す
            if (receiverHandle != IntPtr.Zero)
            {
                SendMessage(receiverHandle, WM_CUSTOM_MESSAGE, IntPtr.Zero, IntPtr.Zero);
            }
        }
    }
}

受信側のコード

サンプルコード(受信側)

using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace MessageReceiverApp
{
    public partial class ReceiverForm : Form
    {
        const int WM_CUSTOM_MESSAGE = 0x8000; // カスタムメッセージのID

        [DllImport("user32.dll")]
        public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

        [DllImport("user32.dll")]
        public static extern int SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam);

        public ReceiverForm()
        {
            InitializeComponent();
        }

        protected override void WndProc(ref Message m)
        {
            if (m.Msg == WM_CUSTOM_MESSAGE)
            {
                MessageBox.Show("メッセージを受け取りました!");
            }
            base.WndProc(ref m);
        }
    }
}
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

都内の精密機器を作っている会社に勤務している14年目のエンジニアです。趣味は美味しいものを食べることとゴルフ。プログラムについて今まで学んだことをわかりやすく発信するサイトを目指しています。

コメント

コメントする

目次