Windows 內建 WinPopup 功能簡陋:訊息限 38 位元組、無歷史記錄、介面過時。作者開發 WinPopupEx,新增:自動保存(30天)、單訊息 400 位元組、可要求回執、廣播至工作群組、系統匣縮放/聲音提醒、自訂字型色彩、開機自動啟動、自動掃描網路鄰居選擇收件人。
採用 MailSlots(工作於 Session 層,獨立於傳輸協定)。每台電腦以電腦名建立郵槽:
\\.\MailSlot\WinPopup:接收訊息本文。\\.\MailSlot\WPAnswer:接收回執,彌補郵槽不可靠特性。發送流程:寫入目標電腦 \\Target\MailSlot\WinPopup,延遲後檢查本地 WPAnswer 是否有回執。接收端:工作執行緒輪詢 WinPopup 郵槽,收到訊息後寫入發送者的 WPAnswer 通知已收,再發送自訂訊息給主執行緒顯示。
// 建立郵槽
HANDLE CreateMailslot(LPCTSTR lpName, DWORD nMaxMessageSize, DWORD lReadTimeout, LPSECURITY_ATTRIBUTES lpSecurityAttributes);
// 檢查訊息
BOOL GetMailslotInfo(HANDLE hMailslot, LPDWORD lpMaxMessageSize, LPDWORD lpNextSize, LPDWORD lpMessageCount, LPDWORD lpReadTimeout);
// lpNextSize != MAILSLOT_NO_MESSAGE 表示有訊息
// 讀取/寫入視同檔案操作
BOOL ReadFile(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped);
HANDLE CreateFile(LPCTSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile);
BOOL WriteFile(HANDLE hFile, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite, LPDWORD lpNumberOfBytesWritten, LPOVERLAPPED lpOverlapped);
BOOL CloseHandle(HANDLE hObject);
// 訊息本文
struct MsgPacket {
UINT m_uMID; // 唯一 ID,過濾重複訊息(多協定導致重複)
char m_cNeedAnswer; // 是否需回執
char m_cEntireNet; // 是否廣播
LPCTSTR m_lpcsTo; // 顯示收件人
LPCTSTR m_lpcsMessage; // 訊息內文
};
// 回執封包
struct AckPacket {
UINT m_uMID; // 對應訊息 ID
LPCTSTR m_lpcsTo; // 回執接收者
};
多協定環境下同一訊息會重複送達,以隨機 MID 去重。
ListCtrl 顯示發送者/收件者/時間/摘要;下半部 RichEditCtrl 顯示完整內容,字型色彩可自訂。WinPopupEx.History,啟動時讀入。HKCU\Software\Microsoft\Windows\CurrentVersion\Run。WM_QUERYENDSESSION 記錄關機旗標,WM_ENDSESSION 確認真正關機,WM_CLOSE 時依旗標決定是否寫入 Run 鍵值。Celeron 333、64MB、Windows 98、Visual C++ 6.0。