你正在开发 "EasyKVM",这是一款零配置、纯软件层面的 KVM 切换器,专为“单显示器、双电脑”的桌面环境设计。该程序允许用户通过一个全局热键或 UI 按钮,无缝、同步地切换显示器的信号源以及键盘鼠标的控制权。
- 编程语言: C# 12
- UI 框架: .NET 8.0 Windows Desktop (WPF)
- 架构模式: MVVM (强烈建议使用 CommunityToolkit.Mvvm)
- 打包方式: 单文件独立运行程序 (PublishSingleFile=true)
- 外部依赖处理:
- Input Leap 的核心程序 (
input-leaps.exe,input-leapc.exe) 将作为“黑盒”使用,存放在项目的/bin目录下。绝对禁止尝试修改它们的源代码或二进制文件。
- Input Leap 的核心程序 (
- 系统限制: 仅限 Windows 10/11。必须要求管理员权限运行 (在 app.manifest 中设置
requireAdministrator)。
- 必须使用
P/Invoke技术调用 Windows 底层的Dxva2.dll和User32.dll。 - 必须实现的核心 API:
EnumDisplayMonitors,GetNumberOfPhysicalMonitorsFromHMONITOR,GetPhysicalMonitorsFromHMONITOR,SetVCPFeature,DestroyPhysicalMonitors。 - VCP 指令代码:
0x60(用于选择输入源 Input Source Select)。 - 容错处理: 如果显示器不支持 DDC/CI 协议,程序不能崩溃,必须优雅地捕获异常并记录日志。
- 使用
System.Diagnostics.Process在后台静默启动和关闭 Input Leap 的核心程序 (WindowStyle = ProcessWindowStyle.Hidden)。 - 需要根据当前身份,动态在内存或临时目录中生成 Server 端需要的
input-leap.conf配置文件。 - 进程清理: 确保当 EasyKVM 主程序退出或崩溃时,底层的
input-leaps.exe和input-leapc.exe必须被彻底杀掉,不能残留后台进程。
- 使用
System.Net.Sockets.UdpClient实现局域网内的 UDP 广播与监听 (建议端口: 45678)。 - 广播极简的 JSON 数据包,例如:
{ "HostName": "PC-A", "IP": "192.168.1.10", "Role": "Server" }。
- 通过 WPF 的
HwndSource钩子,结合User32.dll(RegisterHotKey,UnregisterHotKey) 实现系统级全局热键监听(如默认设定为 Ctrl+Alt+Q)。
【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 切换、网络状态切换完美绑定。
- 拒绝幻觉: 不要自己发明 C# 的硬件控制库,严格使用官方标准的
[DllImport]方式调用 Win32 API。 - 安全降级: 如果 DDC/CI 切换失败(比如显示器不兼容),不要阻断程序运行。在界面上弹出提示,但依然要执行网络的键鼠控制权切换。
- 整洁架构: 硬件控制逻辑、网络逻辑和 UI 后台代码必须解耦,不要全部塞在
MainWindow.xaml.cs里。 - 关键注释: 所有的
P/Invoke方法必须写明中文注释,解释该底层 API 的作用。