Skip to content

Latest commit

 

History

History
69 lines (47 loc) · 4.42 KB

File metadata and controls

69 lines (47 loc) · 4.42 KB

项目:EasyKVM (基于 DDC/CI 与 Input Leap 的纯软件 KVM)

角色:资深 Windows 桌面应用架构师 & C# 开发专家

1. 项目概述 (Project Overview)

你正在开发 "EasyKVM",这是一款零配置、纯软件层面的 KVM 切换器,专为“单显示器、双电脑”的桌面环境设计。该程序允许用户通过一个全局热键或 UI 按钮,无缝、同步地切换显示器的信号源以及键盘鼠标的控制权。

2. 技术栈与严格约束 (Tech Stack & Constraints)

  • 编程语言: C# 12
  • UI 框架: .NET 8.0 Windows Desktop (WPF)
  • 架构模式: MVVM (强烈建议使用 CommunityToolkit.Mvvm)
  • 打包方式: 单文件独立运行程序 (PublishSingleFile=true)
  • 外部依赖处理:
    • Input Leap 的核心程序 (input-leaps.exe, input-leapc.exe) 将作为“黑盒”使用,存放在项目的 /bin 目录下。绝对禁止尝试修改它们的源代码或二进制文件。
  • 系统限制: 仅限 Windows 10/11。必须要求管理员权限运行 (在 app.manifest 中设置 requireAdministrator)。

3. 核心模块与底层调用设计 (Core Modules)

模块 A: DDC/CI 显示器硬件控制 (切换器)

  • 必须使用 P/Invoke 技术调用 Windows 底层的 Dxva2.dllUser32.dll
  • 必须实现的核心 API:EnumDisplayMonitors, GetNumberOfPhysicalMonitorsFromHMONITOR, GetPhysicalMonitorsFromHMONITOR, SetVCPFeature, DestroyPhysicalMonitors
  • VCP 指令代码: 0x60 (用于选择输入源 Input Source Select)。
  • 容错处理: 如果显示器不支持 DDC/CI 协议,程序不能崩溃,必须优雅地捕获异常并记录日志。

模块 B: Input Leap 进程守护与管理 (包装器)

  • 使用 System.Diagnostics.Process 在后台静默启动和关闭 Input Leap 的核心程序 (WindowStyle = ProcessWindowStyle.Hidden)。
  • 需要根据当前身份,动态在内存或临时目录中生成 Server 端需要的 input-leap.conf 配置文件。
  • 进程清理: 确保当 EasyKVM 主程序退出或崩溃时,底层的 input-leaps.exeinput-leapc.exe 必须被彻底杀掉,不能残留后台进程。

模块 C: UDP 局域网自动发现与握手

  • 使用 System.Net.Sockets.UdpClient 实现局域网内的 UDP 广播与监听 (建议端口: 45678)。
  • 广播极简的 JSON 数据包,例如:{ "HostName": "PC-A", "IP": "192.168.1.10", "Role": "Server" }

模块 D: 全局热键拦截 (Global Hotkeys)

  • 通过 WPF 的 HwndSource 钩子,结合 User32.dll (RegisterHotKey, UnregisterHotKey) 实现系统级全局热键监听(如默认设定为 Ctrl+Alt+Q)。

4. 分阶段开发路线 (Phased Implementation Sprints)

【AI 执行指令】:当你被要求开始写代码时,必须严格按照以下 4 个阶段依次进行。绝对不要跳步。每完成一个阶段,必须停下来向用户询问“是否测试通过并进入下一阶段”。

  • 阶段 1 (DDC/CI 核心逻辑,无 UI)

    • 创建 DDC/CI 的 C# 包装类。
    • 写一个控制台打印级别的测试函数,尝试读取当前显示器的输入源 (0x60),并尝试发送切换指令。
  • 阶段 2 (进程管理与全局热键,无 UI)

    • 实现全局热键监听模块。
    • 实现 Input Leap 的进程启动类(包含动态生成 input-leap.conf 的代码)。
  • 阶段 3 (UDP 发现与网络状态机,无 UI)

    • 实现 UDP 广播和监听后台服务。
    • 建立核心状态机逻辑:确认谁是主控端 (Server),谁是被控端 (Client)。
  • 阶段 4 (WPF 现代 UI 整合)

    • 创建一个现代化、支持深色模式的 WPF 界面 (使用 Window Chrome 实现圆角和无边框效果)。
    • 提供两个核心按钮:“我的键鼠当前插在这台电脑” 和 “切换到另一台电脑”。
    • 将热键触发与 DDC/CI 切换、网络状态切换完美绑定。

5. 代码风格与防呆指南

  • 拒绝幻觉: 不要自己发明 C# 的硬件控制库,严格使用官方标准的 [DllImport] 方式调用 Win32 API。
  • 安全降级: 如果 DDC/CI 切换失败(比如显示器不兼容),不要阻断程序运行。在界面上弹出提示,但依然要执行网络的键鼠控制权切换。
  • 整洁架构: 硬件控制逻辑、网络逻辑和 UI 后台代码必须解耦,不要全部塞在 MainWindow.xaml.cs 里。
  • 关键注释: 所有的 P/Invoke 方法必须写明中文注释,解释该底层 API 的作用。