确定计算机是不是被锁定

Posted

技术标签:

【中文标题】确定计算机是不是被锁定【英文标题】:Determine if the computer is locked确定计算机是否被锁定 【发布时间】:2020-06-19 06:38:18 【问题描述】:

我有一个宏,可以在弹出会议通知时从 Outlook 向我发送文本。我想找出一种方法,使该宏仅在我不在计算机旁时才运行。我一直在寻找一种方法来从 Skype for Business 中提取我的状态,确定 PC 是否被锁定,并查看是否插入了智能卡。都没有太多的运气。寻找适用于 VBA 的简单解决方案。

【问题讨论】:

GetLastInputIdle 告诉您自上次键盘/鼠标操作以来的时间,如果您在不锁定的情况下 AFK 将起作用。 【参考方案1】:

也许这有帮助

Option Explicit

Private Declare Function SwitchDesktop Lib "User32" (ByVal hDesktop As Long) As Long
Private Declare Function OpenDesktop Lib "User32" Alias "OpenDesktopA" (ByVal lpszDesktop As String, ByVal dwFlags As Long, ByVal fInherit As Long, ByVal dwDesiredAccess As Long) As Long
Private Declare Function CloseDesktop Lib "User32" (ByVal hDesktop As Long) As Long

Private Const DESKTOP_SWITCHDESKTOP As Long = &H100    

Function desktopLocked() As String
Dim p_lngHwnd As Long
Dim p_lngRtn As Long
Dim p_lngErr As Long
Dim System As String

    p_lngHwnd = OpenDesktop(lpszDesktop:="Default", dwFlags:=0, fInherit:=False, dwDesiredAccess:=DESKTOP_SWITCHDESKTOP)

    If p_lngHwnd = 0 Then
        System = "Error"
    Else
        p_lngRtn = SwitchDesktop(hDesktop:=p_lngHwnd)
        p_lngErr = Err.LastDllError

        If p_lngRtn = 0 Then
            If p_lngErr = 0 Then
                System = "Locked"
            Else
                System = "Error"
            End If
        Else
            System = "Unlocked"
        End If

        p_lngHwnd = CloseDesktop(p_lngHwnd)
    End If
    desktopLocked = System
End Function

更新:如何使用上述功能的示例

Option Explicit
#If VBA7 Then
Declare PtrSafe Function LockWorkStation Lib "user32.dll" () As Long
#Else
Declare Function LockWorkStation Lib "user32.dll" () As Long
#End If

Dim iTimerSet As Double

Public Sub SaveAndClose()
    If desktopLocked = "Locked" Then
        ThisWorkbook.Close True
    Else
        iTimerSet = Now + TimeValue("00:00:03")
        Application.OnTime iTimerSet, "SaveAndClose"
    End If

End Sub

Sub LockPC()
    SaveAndClose
    LockWorkStation
End Sub

只需运行LockPC 并等待 3 秒钟,然后解锁工作站。文件已在此期间关闭。

【讨论】:

除了创建会议并锁定我的电脑并等待通知之外,我不确定如何调试它。当我这样做时,它总是在 Windows 10 上返回解锁。 该函数在系统被锁定时返回“Locked”。 如何调试是什么意思?你只需要一个if 条件来检查系统是否被锁定,如果是你运行你的宏。在您的帖子中,您已经运行了一个宏,对吧? 我更新了帖子并添加了一个如何使用该功能的示例。 我的意思是这是一个缓慢的调试过程,因为我必须在 1 分钟内创建一个带有提醒的会议,然后锁定我的电脑,看看它是否会向我发送消息。出于某种原因,即使计算机被锁定,上面的代码也总是返回解锁状态。 我提供了一个测试速度更快的示例。【参考方案2】:

我使用了这里的代码Determine if application is running with Excel

Function IsProcessRunning(process As String)
    Dim objList As Object

    Set objList = GetObject("winmgmts:") _
        .ExecQuery("select * from win32_process where name='" & process & "'")

    If objList.Count > 0 Then
        IsProcessRunning = True
    Else
        IsProcessRunning = False
    End If

End Function

根据这里的答案In Python 3, how can I tell if Windows is locked?

我打过电话

IsProcessRunning("LogonUI.exe")

它似乎有效。

【讨论】:

以上是关于确定计算机是不是被锁定的主要内容,如果未能解决你的问题,请参考以下文章

C: 如何检查电脑是不是被锁定/睡眠?

锁定电脑后重登录,出现“引用账户当前已锁定,且可能无法登录”提示。是怎么回事?

共享文件夹 因引用账户被锁定 无法访问

win10由于失败的登录次数过多或重复关机

电脑上的时间被锁定了 修改不来怎么回事??

设置帐户锁定策略 若用户连续有3次无效登陆则该帐户自动锁定20分钟 怎么弄