我在Windows 10 Pro x64 ver 1703内部版本15063.726上,尝试编写程序重新启动程序服务。它通过计划任务每​​10分钟在具有管理员权限的情况下在我的用户下运行。

如果服务器不可用或出现故障:

  • (如果我的计算机已锁定),则重新启动程序将终止并重新启动服务器程序。
  • (如果我的计算机未锁定),重新启动程序将显示一个对话框,以确认重新启动。我可能正在服务器程序上进行工作,并且不希望重新启动破坏任何调试。

  • 唯一的麻烦是检测计算机是否被锁定。我尝试了几种方法:
  • OpenInputDesktop()

  • 仅在自计算机锁定以来用户开始输入密码时才返回NULL。除此之外,还会返回有效的句柄。大概在用户尝试登录并输入切换之前,不会取消选择输入桌面。
  • OpenInputDesktop()与GetThreadDesktop()

  • (当然传入GetCurrentThreadID())

    句柄仍然匹配,可能是由于相同的原因1失败。
  • 进程检查LockApp.exe/LockAppHost.exe

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

    锁定时
  • GetForegroundWindow()返回null

    mentioned as dubious时,我也尝试过此操作。假阴性,表示未锁定
  • 手动切换桌面并查看是否有效

  • 用代码示例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秒,并写出锁定/解锁状态。

    10-08 13:17
    查看更多