IP Messengerの受信メッセージをC#でポップアップ通知する方法

このポストにはアフィリエイトコンテンツが含まれています。

はじめに

リモートデスクトップ越しにホストPCを操作していると、別ホストで動作しているIP Messengerのメッセージ通知に気づけないことがありました。そこで、IP Messengerの「メッセージをHTTP POSTで転送する機能」を活用し、別ホストで受信したメッセージを自ホストに転送する仕組みを作りました。

本記事では、この転送機能とC#での受信アプリケーションの実装例をご紹介します。


背景と目的

  • 背景
    • 別ホスト(ホストA)でIP Messengerを常時起動している
    • リモートデスクトップ経由で操作しているため、ホストA側にIP Messengerの新着メッセージが届いても気づきづらい
  • 目的
    • ホストAに届いたIP Messengerメッセージを自動でホストBに転送
    • ホストBではポップアップで気付けるようにする

実現方法の概要

  1. IP Messengerの設定(送信側)
    IP Messengerは、受信したメッセージをHTTP POSTで外部に転送する機能が備わっています。これを有効化し、転送先(ホストB)のURLを設定します。例えば、以下のような形式です。 http://[ホストBのIPアドレス]:8080/
  2. C#アプリケーションの作成(受信側)
    • HttpListener を使ってポート番号8080を常時Listenし、POSTで送られてきたデータを受信
    • 受信データ(JSON)をデシリアライズして中身を取り出し、WindowsフォームのMessageBoxで表示
  3. 注意事項
    • WindowsでHttpListenerを使う場合、ポートを解放して受信するには管理者権限が必要です。
    • ポート番号を8080以外に変えたい場合や、特定の権限でポートを解放したくない場合は、netshコマンドでURL ACLの設定変更を行う方法もあります。
    • セキュリティ的には、社内LANなど限られたネットワーク内での利用が望ましいです。

サンプルソースコード

以下が、実際に試して動作したC#のサンプルコードです。Newtonsoft.Jsonを利用してJSONのパースを行い、簡単にポップアップ(MessageBox)を表示しています。

using System;
using System.IO;
using System.Net;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using Newtonsoft.Json;

// JSONデータ用のクラス
public class MessageData
{
    public string channel { get; set; }
    public string username { get; set; }
    public string text { get; set; }
}

public class Receiver
{
    // HTTPリスナーで受信する非同期メソッド
    public static async Task StartListener(string prefix)
    {
        HttpListener listener = new HttpListener();
        listener.Prefixes.Add(prefix);
        listener.Start();
        Console.WriteLine("Listening on " + prefix);

        while (true)
        {
            HttpListenerContext context = await listener.GetContextAsync();
            if (context.Request.HttpMethod == "POST")
            {
                using (Stream body = context.Request.InputStream)
                using (StreamReader reader = new StreamReader(body))
                {
                    string json = await reader.ReadToEndAsync();
                    try
                    {
                        // Newtonsoft.Json で JSON をデシリアライズ
                        MessageData data = JsonConvert.DeserializeObject<MessageData>(json);
                        Console.WriteLine("Received message from: " + data.username);
                        Console.WriteLine("Message: " + data.text);

                        // ポップアップ通知を表示
                        ShowPopup(data);
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine("Error parsing JSON: " + ex.Message);
                    }
                }

                // レスポンスを返す
                context.Response.StatusCode = 200;
                byte[] responseBytes = System.Text.Encoding.UTF8.GetBytes("OK");
                context.Response.ContentLength64 = responseBytes.Length;
                await context.Response.OutputStream.WriteAsync(responseBytes, 0, responseBytes.Length);
                context.Response.Close();
            }
        }
    }

    // MessageBox.Show を STA スレッドで実行するためのヘルパー
    private static void ShowPopup(MessageData data)
    {
        Thread t = new Thread(() =>
        {
            MessageBox.Show($"User: {data.username}\nMessage: {data.text}",
                            "New IPMessenger Message",
                            MessageBoxButtons.OK,
                            MessageBoxIcon.Information);
        });
        t.SetApartmentState(ApartmentState.STA);
        t.Start();
    }

    [STAThread]
    public static void Main(string[] args)
    {
        // 接続するURLのプレフィックスを指定
        // 実際にはホストBのIPアドレスに書き換えてください
        string prefix = "http://(IPアドレス):8080/";
        Task.Run(() => StartListener(prefix)).Wait();
    }
}

ポイント解説

  • HttpListener
    • listener.Start()でポート待ち受けを開始します。
    • GetContextAsync()を待機してリクエストが来ると処理を継続します。
    • リクエストの内容をStreamReaderで読み込むことでPOSTデータを取得できます。
  • MessageBox表示
    • MessageBox.ShowはSTA(Single-Threaded Apartment)スレッド上で実行する必要があるので、Thread t = new Thread(() => {...})で実行しています。

実行方法

  1. プロジェクトの準備
    Visual Studioもしくは.NET環境でコンソールアプリケーションを作成し、上記ソースコードを貼り付ける
    • Newtonsoft.Jsonを使うために、NuGetNewtonsoft.Jsonをインストール
  2. ビルド・実行
    • 管理者権限で実行(または、管理者権限のコマンドプロンプトなどから起動)
    • 例: dotnet run (プロジェクトフォルダ内)
    • Listening on http://(IPアドレス):8080/ と表示されたら待ち受けが開始
  3. IP Messenger側の設定
    • 転送先URLをhttp://(IPアドレス):8080/に設定
    • JSON形式でメッセージがPOSTされるように設定を保存
  4. 動作確認
    • IP Messengerでメッセージを送信(ホストA → ホストB)
    • 受信したらホストB側コンソールにReceived message from: ユーザー名と表示され、メッセージがMessageBoxでポップアップ表示される

セキュリティ面の注意

  • HttpListenerを使用しているポートが外部に公開されていると、意図しないPOSTを受け取る可能性があります。
  • 社内ネットワークなど、安全が確保された環境で利用することを推奨します。
  • 公開範囲を絞ったり、ファイアウォールやACL設定なども検討してください。

おわりに

本記事では、IP MessengerのHTTP POST転送機能を活用し、C#の簡単なリスナーアプリでメッセージを受信・ポップアップする方法を紹介しました。リモートデスクトップ中でも見逃さずにメッセージを確認できるメリットがあります。

実装におけるポイントは「ポート待受には管理者権限が必要な場合がある」点と、「STAスレッドでのMessageBox表示」です。環境や権限設定に合わせてカスタマイズしながら、快適なメッセージ管理にお役立てください。

このポストにはアフィリエイトコンテンツが含まれています。

コメントする

CAPTCHA