当电脑处于“屏幕保护”状态下时,模拟按键失效

异常报告 · 47 次浏览
林青雀 创建于 3天1小时前

需求:“按任意键、或移动鼠标”,以解除屏保状态。

---

“模拟按键A”提示:停止动作:执行动作出错:发送模拟按键失败了。可能是被安全软件(如360)拦截或被游戏软件屏蔽了,请尝试将Quicker加入360软件的信任名单中并禁用其驱动防护功能,或尝试重启Quicker。

“模拟按键B”提示:步骤(sys:sendKeys)执行失败,原因:发送按键出错。拒绝访问。

---

“鼠标输入”步骤可以正常执行,但无法解除屏保状态。


回复内容
CL 3天1小时前
#1

没有办法。

以下是GPT的回复:


Windows 被锁屏/屏保状态 下,你遇到的错误本质上不是 360、也不是权限问题,而是 Windows 安全机制导致的 —— 在 Winlogon / Secure Desktop(安全桌面)环境中,普通应用程序无法注入输入事件

你现在希望实现的是:

“按任意键或移动鼠标,以解除屏保状态”

模拟按键/模拟鼠标 在以下场景将全部失效:

  • Windows 锁屏界面(Lock Screen)

  • Ctrl+Alt+Delete 安全桌面

  • UAC 提升提示界面(Secure Desktop)

  • 屏幕保护程序处于受保护模式(Secured Screen Saver)

  • 远程桌面锁屏状态

这是 Windows 的安全策略:禁止普通程序向 Winlogon 桌面注入输入事件


❗为什么会“拒绝访问”?

技术原因:

  1. SendInput、keybd_event、mouse_event 都只能在当前用户的互动桌面(Default Desktop)注入输入事件。

  2. 锁屏界面属于 "Winlogon" Desktop,不属于当前用户 Session。

  3. 注入输入被 Kernel Security 禁止,所以 API 返回 ERROR_ACCESS_DENIED

这不是 Quicker 或 C# 的问题,是 Windows 无法允许普通程序这么做


✔ 可行的解决方案(安全、可实现)

方案 1:模拟“系统活动”而不是输入 —— 避免进入屏保

如果你的目的是“避免进入屏保”,而不是“解除屏保”,可以使用:

👉 使用 SetThreadExecutionState 防止系统休眠/屏幕变黑

[DllImport("kernel32.dll")]
static extern uint SetThreadExecutionState(uint esFlags);

const uint ES_CONTINUOUS = 0x80000000;
const uint ES_DISPLAY_REQUIRED = 0x00000002;
const uint ES_SYSTEM_REQUIRED = 0x00000001;

SetThreadExecutionState(ES_CONTINUOUS | ES_DISPLAY_REQUIRED);

效果:

  • 屏幕不会关闭

  • 不会进入屏保

  • 不需要模拟键盘/鼠标

  • 不需要管理员权限

👉 这是最推荐的解决办法
如果你只是想保持电脑亮着,不让屏保启动,这是标准做法。


方案 2:模拟“摇动鼠标位置”避免屏保(屏幕未锁定前)

在屏幕 未锁定前,可以定期做微小鼠标移动:

Cursor.Position = new Point(Cursor.Position.X + 1, Cursor.Position.Y);
Cursor.Position = new Point(Cursor.Position.X - 1, Cursor.Position.Y);

但注意:

  • 锁屏后依然失效

  • 屏幕保护程序中如果是“安全模式(protected)”也会失效


❌ 无法实现的方案:解除锁屏/解除屏保

如果屏幕已经锁定(Win+L 或屏保需要密码),你无法通过:

  • SendInput

  • keybd_event

  • mouse_event

  • 低级键盘钩子

  • Win32 API

  • Windows 服务

  • Kernel 模式驱动(除非你写内核级作弊驱动,违法、不安全)

来模拟键盘或鼠标。

👉 Windows 是特意禁止的,用来防止远程木马上锁屏界面注入密码


✔ 如果只是屏保(不需要密码)?

即使不需要密码,Windows 的屏保也运行在 Secure Desktop 中,仍然 无法模拟输入 来唤醒。

唯一能解除屏保的方法是:

  1. 用户真实输入设备发出事件(键盘/鼠标/触摸)

  2. 显示驱动产生 DPMS 信号(关屏 -> 开屏)

  3. 蓝牙设备唤醒信号(键盘/鼠标)

软件模拟事件不会算作真实事件


✔ 终极解法:用硬件设备模拟输入(HID)

如果你真的需要在锁屏状态恢复电脑(例如远程唤醒后自动亮屏),唯一可行:

使用 USB HID 设备模拟真实键盘/鼠标

例如:

  • USB Rubber Ducky(模拟键盘)

  • Arduino Leonardo / Micro(支持 USB HID)

  • 自制 USB HID 鼠标移动器

这类设备发送的信号属于 真实硬件输入,可以唤醒锁屏界面。

👉 软件绝对无法做到这一点。


✅ 总结建议

你的需求 可实现方式
避免进入屏保 ✔ SetThreadExecutionState(最佳)
屏幕未锁时轻微活动以防锁定 ✔ 模拟鼠标小位移
已锁屏后自动按键/鼠标 ❌ 不可能(系统安全保护)
必须在锁屏解除 ✔ 用 USB HID 设备模拟按键

如果你告诉我你的最终场景

我可以帮你选最佳方案:

  • 是为了 远程保持电脑亮屏?

  • 还是 自动录屏?

  • 还是 给 Quicker 功能避免休眠?

  • 还是 某些程序运行时不希望锁屏?

你可以说下具体用途,我能给你一个最精确的方案。

回复主贴