需求:“按任意键、或移动鼠标”,以解除屏保状态。
---
“模拟按键A”提示:停止动作:执行动作出错:发送模拟按键失败了。可能是被安全软件(如360)拦截或被游戏软件屏蔽了,请尝试将Quicker加入360软件的信任名单中并禁用其驱动防护功能,或尝试重启Quicker。
“模拟按键B”提示:步骤(sys:sendKeys)执行失败,原因:发送按键出错。拒绝访问。
“鼠标输入”步骤可以正常执行,但无法解除屏保状态。
没有办法。
以下是GPT的回复:
在 Windows 被锁屏/屏保状态 下,你遇到的错误本质上不是 360、也不是权限问题,而是 Windows 安全机制导致的 —— 在 Winlogon / Secure Desktop(安全桌面)环境中,普通应用程序无法注入输入事件。
你现在希望实现的是:
“按任意键或移动鼠标,以解除屏保状态”
但 模拟按键/模拟鼠标 在以下场景将全部失效:
Windows 锁屏界面(Lock Screen)
Ctrl+Alt+Delete 安全桌面
UAC 提升提示界面(Secure Desktop)
屏幕保护程序处于受保护模式(Secured Screen Saver)
远程桌面锁屏状态
这是 Windows 的安全策略:禁止普通程序向 Winlogon 桌面注入输入事件。
技术原因:
SendInput、keybd_event、mouse_event 都只能在当前用户的互动桌面(Default Desktop)注入输入事件。
锁屏界面属于 "Winlogon" Desktop,不属于当前用户 Session。
注入输入被 Kernel Security 禁止,所以 API 返回 ERROR_ACCESS_DENIED。
ERROR_ACCESS_DENIED
这不是 Quicker 或 C# 的问题,是 Windows 无法允许普通程序这么做。
如果你的目的是“避免进入屏保”,而不是“解除屏保”,可以使用:
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);
效果:
屏幕不会关闭
不会进入屏保
不需要模拟键盘/鼠标
不需要管理员权限
👉 这是最推荐的解决办法 如果你只是想保持电脑亮着,不让屏保启动,这是标准做法。
在屏幕 未锁定前,可以定期做微小鼠标移动:
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 中,仍然 无法模拟输入 来唤醒。
唯一能解除屏保的方法是:
用户真实输入设备发出事件(键盘/鼠标/触摸)
显示驱动产生 DPMS 信号(关屏 -> 开屏)
蓝牙设备唤醒信号(键盘/鼠标)
软件模拟事件不会算作真实事件。
如果你真的需要在锁屏状态恢复电脑(例如远程唤醒后自动亮屏),唯一可行:
例如:
USB Rubber Ducky(模拟键盘)
Arduino Leonardo / Micro(支持 USB HID)
自制 USB HID 鼠标移动器
这类设备发送的信号属于 真实硬件输入,可以唤醒锁屏界面。
👉 软件绝对无法做到这一点。
我可以帮你选最佳方案:
是为了 远程保持电脑亮屏?
还是 自动录屏?
还是 给 Quicker 功能避免休眠?
还是 某些程序运行时不希望锁屏?
你可以说下具体用途,我能给你一个最精确的方案。