gpt4 book ai didi

c# - 检查 Windows 当前是否被锁定

转载 作者:太空宇宙 更新时间:2023-11-03 12:20:51 26 4
gpt4 key购买 nike

我在 Windows 10 Pro x64 ver 1703 build 15063.726 上,尝试编写程序重启服务。它在我的用户下以管理员权限运行,每 10 分钟通过计划任务运行一次。

如果服务器不可用或阻塞:

  • 如果我的计算机被锁定,重启程序会终止并重新启动服务器程序。
  • 如果我的电脑没有被锁定,重启器会显示一个对话框来确认重启。我可能正在处理服务器程序,不希望重启破坏任何调试。

唯一复杂的是检测计算机是否被锁定。我尝试了几种方法:

  1. OpenInputDesktop()

仅当用户在计算机被锁定后开始输入密码时才返回 NULL。除此之外返回一个有效的句柄。据推测,在用户尝试登录并且他们的输入切换之前,输入桌面不会被取消选择。

  1. OpenInputDesktop() 与 GetThreadDesktop()

(当然是传入GetCurrentThreadID())

句柄仍然匹配,可能是由于相同的原因 1 失败。

  1. 对 LockApp.exe/LockAppHost.exe 进行进程检查

似乎也与用户输入密码有关...或者因为我的服务器重启应用程序是 32 位的,在读取 64 位进程 LockApp.exe 时遇到问题。

  1. GetForegroundWindow() 锁定时返回 null

同时 mentioned as dubious ,我也试过这个。假阴性,说没锁

  1. 手动切换桌面并查看它是否有效

用代码示例描述 here , 这个也是半身像并给出了假阴性。

还有办法吗?我真的不想有一个服务只是为了注册锁定/解锁不断运行。

或者这些方法中的一种应该已经起作用了,而我的 Windows 出现了故障?

干杯

最佳答案

我不确定如何在 C# 中执行此操作,但使用 PowerShell,我检查了 LockApp.exe 线程是否被挂起以查看桌面是否已解锁或锁定,如下所示:

$lockapp = Get-Process lockapp

for ($i = 0; $i -lt 60; $i++)
{
$process=[System.Diagnostics.Process]::GetProcessById($lockapp.Id)
$threads=$process.Threads
if ($threads[0].WaitReason -eq "Suspended") { "It's unlocked" } else { "It's locked" }
Sleep 1
}

此脚本循环 60 秒并写出锁定/解锁状态。

关于c# - 检查 Windows 当前是否被锁定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47393776/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com