You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Windows最新系统下服务进程如何实现锁屏交互?

Windows最新系统下服务进程实现锁屏VNC交互的方案

核心前提:权限与会话隔离

  • 服务必须运行在Local System账户下,该账户拥有访问系统级资源及跨会话操作的权限。
  • 需处理Windows的会话0隔离机制:服务默认运行在会话0,用户锁屏时的桌面属于用户会话(通常是会话1及以上),需通过API获取目标会话的访问权限。

锁屏截图实现

方法1:DXGI桌面复制API(推荐,Win8+)

使用IDXGIOutputDuplication接口捕获桌面帧,该API可直接获取包括锁屏在内的系统画面,无需切换桌面:

  1. 枚举显示适配器,获取目标输出设备;
  2. 创建IDXGIOutputDuplication实例,调用AcquireNextFrame获取帧数据;
  3. 将捕获到的纹理数据转换为位图格式,供VNC传输使用。

方法2:GDI+结合桌面句柄切换

  • 调用WTSGetActiveConsoleSessionId获取当前活跃用户会话ID;
  • 用OpenInputDesktop打开该会话的输入桌面(锁屏状态下为Winlogon的桌面);
  • 调用SetThreadDesktop将当前服务线程切换到该桌面;
  • 使用BitBlt或Gdiplus::Bitmap::FromScreen完成截图;
  • 操作完成后调用CloseDesktop释放句柄。

鼠标移动与按键操作

核心思路:切换到锁屏桌面后发送输入事件

  1. 同截图步骤,获取锁屏桌面的句柄并切换线程桌面;
  2. 使用SendInputAPI发送鼠标/键盘输入事件(推荐,较新API):
    • 鼠标移动:构造MOUSEINPUT结构体,设置dx/dy为屏幕坐标(需转换为相对坐标或使用MOUSEEVENTF_ABSOLUTE标记);
    • 按键操作:构造KEYBDINPUT结构体,指定按键的虚拟键码。
  3. 若SendInput无效,可尝试旧APImouse_event/keybd_event,但需注意权限适配。

替代方案:会话内代理进程

  • 服务通过WTSQueryUserToken获取用户会话的令牌;
  • 使用CreateProcessAsUser在用户会话中启动一个代理进程;
  • 代理进程直接运行在用户会话空间,可无需额外权限调用截图和输入API,服务通过IPC(如命名管道)与代理进程通信。

关键注意事项

  • 避免在服务中直接长时间占用用户会话的桌面句柄,操作完成后立即释放;
  • Windows Defender或其他安全软件可能拦截服务的跨会话操作,需添加白名单;
  • 测试时需确保服务已配置为允许服务与桌面交互(在服务属性的“登录”选项卡中勾选),部分系统版本需结合SeInteractiveLogonRight权限。

内容的提问来源于stack exchange,提问作者Yordan Yanakiev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 05:15:38