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

如何通过SendInput模拟实现在锁屏界面的用户登录操作?

如何通过SendInput模拟实现在锁屏界面的用户登录操作?

我太懂你的需求了——你写的远程监控程序在桌面环境下用SendInput模拟登录完全没问题,但一锁屏(Win+L)就彻底失效,想实现重启后远程触发登录,确实有点棘手。

首先得搞清楚为啥SendInput在锁屏时没用:Windows的锁屏界面属于Winlogon会话,这是一个独立的、受系统保护的交互式会话,普通用户进程(哪怕是你的远程程序)默认只能访问自己的用户会话,根本碰不到Winlogon的输入队列。你的SendInput调用其实在后台跑了,但输入都发到了当前用户的会话里,而锁屏时这个会话是被挂起的,自然看不到效果。

那怎么解决这个问题?给你几个可行的方向:

1. 让程序切换到Winlogon会话再发送输入

这是最贴合你现有代码的方案,但需要处理权限和会话切换的问题:

  • 首先,你的程序必须以管理员权限运行,而且需要获取访问Winlogon桌面的权限。
  • 你可以通过OpenDesktop打开Winlogon桌面,用SwitchDesktop切换过去,再执行SendInput,完成后切回原桌面。

给你加一段代码片段到你的sendPassword函数里(适配你的Qt环境):

// 先切换到Winlogon桌面
HDESK hWinlogonDesktop = OpenDesktop(L"Winlogon", 0, FALSE, DESKTOP_SWITCHDESKTOP | DESKTOP_CREATEWINDOW | DESKTOP_WRITEOBJECTS);
if (hWinlogonDesktop) {
    // 切换到Winlogon桌面
    if (SwitchDesktop(hWinlogonDesktop)) {
        // 这里放你原来的SendInput代码逻辑
        // ...(就是你写的初始化inputs、调用SendInput的部分)
        // 切回原桌面
        SwitchDesktop(GetThreadDesktop(GetCurrentThreadId()));
    }
    CloseDesktop(hWinlogonDesktop);
}

不过要注意:

  • 某些Windows 10/11版本可能要求程序拥有SYSTEM权限才能切换到Winlogon会话,这时候你可能需要用任务计划程序把程序设置为“以最高权限运行”,并且选择“不管用户是否登录都运行”。
  • 直接明文存密码在password.txt里风险极高!建议用Windows的DPAPI(数据保护API)加密密码存储,避免泄露。

2. 用自动登录替代模拟输入

如果不需要手动触发登录,只是想重启后自动登录,可以修改Windows注册表实现自动登录:

  • 打开注册表编辑器(regedit),定位到HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon
  • 设置以下键值:
    • AutoAdminLogon = 1(字符串值)
    • DefaultUserName = 你的用户名(字符串值)
    • DefaultPassword = 你的密码(字符串值)
  • 这个方案更简单,但缺点是密码明文存在注册表,安全性差,只适合你完全信任的环境。

3. 改用专业远程工具

如果你的核心需求是远程访问重启后的电脑,其实没必要自己造轮子——像TeamViewer、AnyDesk这类工具本身就支持锁屏状态下的远程登录,它们已经解决了会话权限的问题,而且安全性和稳定性都比自己写的程序好。

总结一下:如果一定要坚持用SendInput,就得搞定会话切换和权限问题;如果追求简单可靠,自动登录或者专业远程工具是更省心的选择。

备注:内容来源于stack exchange,提问作者kaan kaya

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.22 14:09:54