今回は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);
}
}
}
コメント