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

为何SendInput()在锁屏界面无法模拟回车键?

问题描述

尝试使用SendInput()模拟回车键,该方法在注销、重启、关机等场景均能正常工作,但在锁屏界面失效。相关代码如下:

INPUT inputs[2] = { 0 };
ZeroMemory(inputs, sizeof(inputs));
inputs[0].type = INPUT_KEYBOARD;
inputs[0].ki.wVk = VK_RETURN;

inputs[1].type = INPUT_KEYBOARD;
inputs[1].ki.wVk = VK_RETURN;
inputs[1].ki.dwFlags = KEYEVENTF_KEYUP;

SendInput(ARRAYSIZE(inputs), inputs, sizeof(INPUT));

想了解该方法在锁屏界面无法生效的原因,以及可行的解决方案。

失效原因
  • Windows锁屏界面属于Winlogon系统会话,与普通用户桌面会话完全隔离。SendInput()的输入模拟仅作用于当前进程所在的用户会话,无法跨会话向系统级的锁屏界面注入输入。
  • 系统安全机制限制:普通用户权限的进程无法访问或干扰Winlogon会话的输入处理,即使以管理员身份运行,默认也无法突破会话隔离屏障。
解决方案

方法1:直接向锁屏窗口发送键盘消息

通过FindWindowEx()定位锁屏窗口,再使用SendMessage()直接发送键盘按下/释放消息,绕过会话隔离限制:

#include <windows.h>

int main() {
    // 适配不同Windows版本的锁屏窗口类名
    HWND lockWnd = FindWindow(L"Credential Dialog Host", nullptr); // Win10/11 锁屏主窗口
    if (lockWnd == nullptr) {
        lockWnd = FindWindow(L"#32770", nullptr); // 通用对话框类,兼容旧版本系统
    }

    if (lockWnd != nullptr) {
        // 发送回车键按下+释放消息
        SendMessage(lockWnd, WM_KEYDOWN, VK_RETURN, 0);
        SendMessage(lockWnd, WM_KEYUP, VK_RETURN, 0);
    }
    return 0;
}

注意:

  • 程序必须以管理员身份运行,否则无法获取锁屏窗口的句柄。
  • 不同Windows版本的锁屏窗口类名可能存在差异,需根据目标系统调整查找逻辑。

方法2:系统级服务实现跨会话输入

如果需要长期稳定的跨会话输入能力,可以创建Windows系统服务:

  1. 将程序注册为系统服务,服务运行在SYSTEM权限下,属于系统会话。
  2. 在服务中调用SendInput()或SendMessage()向锁屏界面注入输入。
  • 该方式需要处理服务的会话切换逻辑,实现复杂度较高,但能彻底解决会话隔离问题。

方法3:硬件级输入模拟

使用如Interception这类底层输入库,直接与输入设备驱动交互,绕过系统会话隔离限制。这类库需要安装驱动,开发成本较高,但模拟效果最接近真实硬件输入。

内容的提问来源于stack exchange,提问作者sireesha pallela

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 03:52:14