首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

用 VC++ 開發 WinPopup 增強版

     編輯:關於VC++

專案背景

Windows 內建 WinPopup 功能簡陋:訊息限 38 位元組、無歷史記錄、介面過時。作者開發 WinPopupEx,新增:自動保存(30天)、單訊息 400 位元組、可要求回執、廣播至工作群組、系統匣縮放/聲音提醒、自訂字型色彩、開機自動啟動、自動掃描網路鄰居選擇收件人。

核心技術:郵槽

採用 MailSlots(工作於 Session 層,獨立於傳輸協定)。每台電腦以電腦名建立郵槽:

  • \\.\MailSlot\WinPopup:接收訊息本文。
  • \\.\MailSlot\WPAnswer:接收回執,彌補郵槽不可靠特性。

發送流程:寫入目標電腦 \\Target\MailSlot\WinPopup,延遲後檢查本地 WPAnswer 是否有回執。接收端:工作執行緒輪詢 WinPopup 郵槽,收到訊息後寫入發送者的 WPAnswer 通知已收,再發送自訂訊息給主執行緒顯示。

關鍵 API

// 建立郵槽
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。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved