简体中文 | English
基于 TauriCPP 框架和 ipmsg-master 协议实现的局域网即时通讯应用,兼容飞秋和IPMsg v3.0 协议(UDP 2425 端口)。
前往 Releases 下载最新的单文件绿色版(无需安装,下载即用):
IPMsgPro-x.y.z-win64.zip— Windows x64 便携版(含 SHA256 校验)
- 用户自动发现 — UDP 广播自动发现局域网用户,支持多网段配置;子网定向广播 + 已知用户单播兜底,重启后联系人列表持久保留
- 文字消息 — 实时收发文字消息,送达回执
- 图片发送 — 发送图片前预览确认,接收后缩略图展示
- 文件传输 — 发送/接收文件确认流程,传输进度实时显示
- 消息右键菜单 — 文字消息复制、图片保存到本地、文件打开所在目录
- 类微信界面 — 三栏布局:左侧会话列表、中间用户列表、右侧聊天面板;自绘标题栏,无原生窗口边框
- 数据持久化 — SQLite 存储消息历史与联系人,配置信息本地保存,重启后聊天记录完整可达
- 新消息提示音 — 收到新文字消息或文件接收请求时播放提示音,可在「设置」中开关(提示音已作为资源嵌入 exe,运行时自动提取播放)
- 表情支持 — 聊天输入框可插入 emoji 表情,基于雪碧图(
emoji.png)+ 定位数据(emoji_positon.less)实现
| 层 | 技术 |
|---|---|
| 前端 | React + TypeScript + Tailwind CSS + Vite |
| 后端 | C++17 + Win32 + WebView2 |
| 框架 | TauriCPP (轻量 Tauri 替代,单 exe 无安装) |
| 协议 | IPMsg v3.0 (UDP 2425) + TCP 文件传输 |
| 数据库 | SQLite3 |
IPMsgPro/
├── src/ # C++ 后端
│ ├── main.cpp # 应用入口
│ ├── ipmsg/ # IPMsg 协议实现(移植自 ipmsg-master)
│ ├── bridge/ # 前后端桥接命令处理
│ ├── database/ # SQLite 消息存储
│ └── file/ # TCP 文件传输管理
├── frontend/ # React 前端
│ └── src/
│ ├── components/ # UI 组件
│ ├── stores/ # Zustand 状态管理
│ ├── services/ # 后端桥接服务
│ ├── assets/ # 静态资源(emoji 雪碧图 emoji.png 与定位样式 emoji_positon.less)
│ ├── emojiData.ts # 由 assets/emoji_positon.less 生成的表情数据(scripts/gen_emoji_ts.cjs)
│ └── types/ # TypeScript 类型定义
├── TauriCPP/ # TauriCPP 框架(子模块)
├── resources/ # 应用图标、通知提示音(embedded)等资源
└── CMakeLists.txt # CMake 构建配置
- Visual Studio 2022(含 C++ 桌面开发工作负载)
- CMake 3.15+
- Python 3(用于资源打包)
- Node.js 18+
# 一键构建(自动安装前端依赖、构建前端、编译 C++)
.\build.ps1 -Arch x64 # 编译 x64 → build_x64/Release/IPMsgPro.exe
.\build.ps1 -Arch x86 # 编译 x86 → build_x86/Release/IPMsgPro_X86.exe
# 其他选项
.\build.ps1 -Arch x64 -Config Debug # Debug 模式
.\build.ps1 -Arch x86 -Clean # 清理重编
.\build.ps1 -Arch x64 -Run # 编译完自动运行
.\build.ps1 -Arch x64 -SkipFrontend # 跳过前端构建(前端未改动时)# 1. 安装前端依赖并构建
cd frontend
npm install
npm run build
# 2. 编译 C++(x64 / x86 二选一或都编译)
cd ..
cmake -B build_x64 -G "Visual Studio 17 2022" -A x64
cmake --build build_x64 --config Release
cmake -B build_x86 -G "Visual Studio 17 2022" -A Win32
cmake --build build_x86 --config Release
# 输出:
# build_x64/Release/IPMsgPro.exe
# build_x86/Release/IPMsgPro_X86.exe兼容 IPMsg v3.0 协议,可与原版 IPMsg 及飞秋(FeiQ)互通:
- UDP 2425 端口消息收发
- TCP 文件传输(端口 2425)
IPMSG_SENDMSG/IPMSG_RECVMSG/IPMSG_FILEATTACHOPT等标准命令- 文件接收确认流程(
IPMSG_GETFILEDATA/IPMSG_RELEASEFILES) - 飞秋协议兼容:GBK/UTF-8 编码自动转换、无
\0分隔符的 GETFILEDATA 解析、扩展版本号格式 - 文件传输进度实时显示,发送完成后进度保持在 100% 并显示「发送成功」,支持打开接收文件所在文件夹
- 修复:发送文件时聊天窗口出现两条记录
- 历史记录合并改为按 id 去重、实时消息优先(带进度的副本胜出),传输完成/失败状态回写数据库
- 接收方确认接收后消息 id 与后端对齐,同一请求重传不再重复弹窗
- 修复:重启后联系人丢失、聊天记录无法到达
- 联系人持久化到数据库,重启后以离线状态显示,点击即可查看历史记录
- 新增子网定向广播(192.168.x.255),并向已知用户单播上线请求,广播被路由器/防火墙过滤的网络也能互相发现
- 联系人退出改为置灰,不再从列表消失
- 聊天记录改为加载最新 50 条(原先加载最旧的 50 条)
- 新增:消息右键菜单
- 文字消息 → 复制;图片消息 → 保存图片到本地(系统保存对话框);文件消息 → 打开文件所在目录
- 移除 WebView2 默认的浏览器右键菜单
- 新增:自绘标题栏
- 去掉原生窗口标题与图标,界面更简洁;顶部条支持拖动、双击最大化、贴边分屏,右上角最小化/最大化/关闭按钮(关闭仍遵循「最小化行为」托盘设置)
- 修复:消息列表智能滚动
- 向上翻阅历史时,右键菜单或传输进度刷新不再把列表拽回底部
- 截图编辑器重构
- 将文字工具替换为铅笔涂写工具,支持自由绘制
- 工具栏按钮改为 SVG 图标样式(矩形、箭头、铅笔、马赛克),视觉更直观
- 工具栏移至图片底部,操作更便捷
- 取消/确定按钮改为红色 X / 绿色 √ 图标按钮
- 截图文件命名改为
Beixin_YYYYMMDDHHmmss_screenshot.png格式
- 修复截图后窗口不在最前
SetAlwaysOnTop增加SWP_SHOWWINDOW标志和SetForegroundWindow调用,确保截图结束后窗口回到前台
- 截图发送改为标准文件传输
- 发送截图(及普通图片)不再使用飞秋内联富文本(引用消息 + 分片)协议,改为走标准
IPMSG_FILEATTACHOPT文件通道;对方以「接收 / 确认」流程接收并保存,与常规文件发送行为一致 - 移除了「原样回显给飞秋」诊断按钮及相关的内联截图回显逻辑
- 发送截图(及普通图片)不再使用飞秋内联富文本(引用消息 + 分片)协议,改为走标准
- 拖拽文件走真实磁盘路径发送(不再走 save_temp)
- 在主窗口注册原生
IDropTarget,拦截系统级文件拖放(读取CF_HDROP中的真实文件路径),直接走file.send真实路径发送;不再经由前端 HTML5 拖放拿不到路径而退化为 base64 +file.save_temp落盘的方案 - 把拖放目标同时登记到主窗口及所有 WebView2 子窗口(含深层浏览器子窗口),并每 2 秒兜底重新登记,解决 WebView2 抢走拖放目标导致「拖上去一闪而过、松手无反应」的问题
- 在主窗口注册原生
- 启动日志增强
- 程序启动时在
ipmsg_gui_debug.log输出:应用版本号、当前系统版本号(Windows 产品名/版本/内部版本号/ReleaseId)、默认语言与地区(如zh-CN)、本机所有 IPv4 地址,便于排障
- 程序启动时在
- 修复飞秋列表中中文昵称/群组名乱码
- 本地用户信息(昵称、群组等)以 UTF-8 存储,广播报文在未携带
IPMSG_UTF8OPT时统一编码为 GBK 发送,飞秋(FeiQ)可正确显示中文名 - 文本消息与文件消息正文统一在
MakeMsg内完成 UTF-8 → GBK 编码,避免重复转换 - 修复“打开文件夹”跳到桌面:接收文件后打开所在文件夹时,UTF-8 路径未正确转为 UTF-16 导致中文路径失效,改用
MultiByteToWideChar(CP_UTF8)正确转换 - 文件传输崩溃防护与追踪日志:文件收/发均运行于 detached 线程,未捕获异常会触发
std::terminate直接崩溃且无日志。现已在HandleClientConnection/SendFileThread/RecvFileThread入口及前端事件回调bridge_->Emit(含 WebView2 回调)处包裹 try/catch 并记录异常;并在WinMain安装SetUnhandledExceptionFilter+std::set_terminate,将 SEH 异常/未捕获 C++ 异常写入ipmsg_gui_debug.log,便于定位中文文件名等场景的崩溃根因
- 本地用户信息(昵称、群组等)以 UTF-8 存储,广播报文在未携带
- 日志入口统一:将分散的
WriteTransferLog(FILE_XFER)、WriteDebugLog(BRIDGE)、MsgLog(MSGMNG)包装函数以及各模块中裸写的std::cout/std::cerr全部收口到唯一的ipmsg::LogMessage(tag, level, msg)入口,日志统一按[时间][模块][级别] 消息格式输出到ipmsg_gui_debug.log,便于统一追踪与排查。
- 文件传输进度显示优化
- 发送/接收过程中只更新对应气泡的进度条,不再整体刷新整个对话列表(解决对话记录不断闪烁的问题)
- 发送完成后进度条保持在 100%,不再回落到 0%
- 兼容飞秋分片/续传(GETFILEDATA)请求,避免续传重新从 0% 上报导致进度归零
- 统一日志系统
- 将原先分散的
ipmsgpro.log、msgmng.log与ipmsg_gui_debug.log合并为单一文件ipmsg_gui_debug.log std::cout/std::cerr的输出也重定向进该文件- 文件在每次启动应用时清空重建,日志按
[时间] [模块] [级别] 消息格式输出(IPMSGPRO/MSGMNG/FILE_XFER/BRIDGE标签区分来源) - 日志目录:
%LOCALAPPDATA%\.ipmsgpro\ipmsg_gui_debug.log(默认端口;自定义端口为.ipmsgpro_<端口>)
- 将原先分散的
如果这个项目对你有帮助,欢迎请作者喝杯咖啡 ☕
本项目采用 MIT 许可证,仅供个人非商业用途免费使用。
- 本仓库为 Emsoro/IPMsgPro 的二次开发版本,包含多项修复与功能增强,详见更新日志
- 个人使用:遵循 MIT 许可证,可自由使用、修改、分发。
- 商业使用:如需用于商业用途,须事先获得作者授权。
如需商业授权,请联系:support@emsoro.cn
MIT License © 2026 masonwu21(个人)
