【问题标题】:Developing a screensaver that doesn't lock the screen when used via RDP/Terminal Services开发通过 RDP/终端服务使用时不锁定屏幕的屏幕保护程序
【发布时间】:2020-03-20 16:30:02
【问题描述】:

我有一个我们在公司内部使用的简单屏幕保护程序,我正在尝试让屏幕保护程序检测到它正在远程桌面会话(或终端服务会话)中运行,并在这种情况下阻止屏幕保护程序同时启动并锁定工作站。

检测session is remote是否足够简单,因此很容易退出屏幕保护程序,但工作站仍然锁定。

我尝试了 0 和 1 的退出代码,希望这会有所作为,但事实并非如此。我还尝试使用 SendKeys 在(默认)5 秒宽限期到期之前尝试模拟对屏幕保护程序主窗体的按键,但这也不起作用。

这是我在主窗体的构造函数中使用的示例:

if (IsRemoteSession())
{
    SendKeys.Send(Environment.NewLine);
    Environment.Exit(0);
}

我已经测试满足上述条件。

任何人都可以提出一种可以实现这一目标的方法吗?

【问题讨论】:

  • 感谢@sellotape,我目前正在使用其中的一些标志,但我会在链接问题中尝试那些特定的。
  • 不幸的是@sellotape 以上不起作用,我认为这是因为我在屏幕保护程序已被触发后进行了 SetThreadExecutionState 调用。我怀疑我需要制作一个独立的可执行文件,当它检测到 RDP 时使用这个调用,然后在它变成本地会话时清除它。不过,我可能会首先考虑使用 Win32 API 来尝试模拟真正的击键,因为在屏幕保护程序启动后 5 秒内进行真正的击键确实有效。非常感谢您的建议

标签: c# rdp screensaver


【解决方案1】:

您可以使用 WIN32 API (user32.dll) 中的 GetLastInputInfo 来确定上次用户输入发生的时间。 在 10 分钟的空闲时间后(例如),您可以使用 SendInput 方法(也来自 user32.dll)发送 1 像素的鼠标移动。这被解释为物理移动并重置最后一个用户输入计数器。

我用它编写了一个应用程序,当人们在 Zoom 通话时停止锁定屏幕启动(它监视活动的 Zoom 通话过程)。

https://www.pinvoke.net/default.aspx/user32/GetLastInputInfo.html https://www.pinvoke.net/default.aspx/user32/SendInput.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-11
    • 2016-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多