|
|||||
<このサンプルの概要> 外部アプリケーションから送信された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; } // =========================================================================================== } |