Windows 信使服務 從 Windows 2000 起內建且默認啟動,無需額外安裝客戶端,僅需雙方開啟服務即可發送文本消息,極適合簡單局域網通知場景。但僅支持純文本,無法傳輸文件/二進制數據,且依賴 NetBIOS over TCP/IP,現代網絡環境 (防火牆、跨網段、IPv6) 可能受限。本文演示 C# P/Invoke 調用 `NetMessageBufferSend` 實現發送功能。
using System.Runtime.InteropServices;
public static class MessengerInterop
{
///
/// 發送信使消息
///
/// 服務器名,NULL 表示本地
/// 接收者別名 (計算機名/用戶名/IP)
/// 發送者名,NULL 表示匿名
/// 消息內容指針
/// 消息字節長度
/// 0 成功,非 0 為系統錯誤碼
[DllImport("netapi32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
public static extern int NetMessageBufferSend(
string serverName,
string msgName,
string fromName,
byte[] buf,
int bufLen);
}
private void btnSend_Click(object sender, EventArgs e)
{
string target = txtTarget.Text.Trim();
string message = txtMessage.Text;
if (string.IsNullOrEmpty(target) || string.IsNullOrEmpty(message))
{
MessageBox.Show("目標和消息不能為空");
return;
}
try
{
// Unicode 編碼:每字符 2 字節,結尾雙 null 終止符 (+2)
byte[] buffer = Encoding.Unicode.GetBytes(message);
int byteLen = buffer.Length + 2; // API 要求包含結束符長度
int result = MessengerInterop.NetMessageBufferSend(
null, // 本地發送
target, // 接收者
null, // 匿名發送
buffer,
byteLen);
if (result == 0)
MessageBox.Show("發送成功!");
else
MessageBox.Show($"發送失敗,錯誤碼: {result} (參考 WinError.h)");
}
catch (Exception ex)
{
MessageBox.Show($"異常: {ex.Message}");
}
}
| 參數 | 說明 | 典型值 |
|---|---|---|
| serverName | 發送方服務器,NULL 為本機 | `null` |
| msgName | 接收者別名:計算機名、用戶名、IP 地址、域名 | `"PC-NAME"` / `"192.168.1.100"` |
| fromName | 發送者顯示名,NULL 為匿名 | `null` / `"Admin"` |
| buf | 消息內容字節數組 (Unicode) | `Encoding.Unicode.GetBytes(msg)` |
| bufLen | 字節長度,必須包含結束符 (Unicode 為 +2 字節) | `buffer.Length + 2` |
| 方案 | 優點 | 缺點 | 適用場景 |
|---|---|---|---|
| 信使服務 | 零部署、系統內建、API 簡單 | 僅文本、NetBIOS 依賴、跨網段困難、安全性低、已棄用 (Win10 1709+ 移除) | 極簡舊環境維護 |
| Socket/TcpListener | 全雙工、二進制、跨平台、可控 | 需雙方部署客戶端/服務端 | 即時通訊、文件傳輸 |
| SignalR / WebSocket | Web 標準、穿透防火牆、自動重連、擴展性強 | 需服務端、較重 | Web/移動端即時推送 |
| 命名管道 | 本機/局域網高性能、安全、支持模擬 | 僅 Windows、需服務端 | 進程間通信、服務通信 |
| MSMQ / RabbitMQ | 可靠隊列、持久化、解耦 | 基礎設施重 | 異步任務、微服務 |
C# 通過 P/Invoke `netapi32.dll!NetMessageBufferSend` 可輕松調用 Windows 信使服務發送局域網文本消息。關鍵在於:Unicode 編碼 + 長度含結束符 + 目標別名準確 + 服務啟動 + 網絡/防火牆通暢。鑒於信使服務在現代 Windows 版本中已移除且安全性存疑,新項目強烈建議採用 Socket/SignalR/命名管道等現代通信技術。本技術僅適用於維護極老舊系統 (Win2000/XP/2003 環境) 的臨時方案。