Vba 确定计算机是否已锁定

Vba 确定计算机是否已锁定,vba,outlook,skype-for-business,user32,winscard,Vba,Outlook,Skype For Business,User32,Winscard,我有一个宏,在弹出会议通知时从outlook向我发送文本。我想找出一种方法,使该宏仅在我不在计算机时运行。我一直在寻找一种方法,从Skype for Business中提取我的状态,确定电脑是否锁定,并查看是否插入了智能卡。都是运气不好。正在寻找在VBA中工作的简单解决方案 也许这有什么帮助 Option Explicit Private Declare Function SwitchDesktop Lib "User32" (ByVal hDesktop As Long) As Long P

我有一个宏,在弹出会议通知时从outlook向我发送文本。我想找出一种方法,使该宏仅在我不在计算机时运行。我一直在寻找一种方法,从Skype for Business中提取我的状态,确定电脑是否锁定,并查看是否插入了智能卡。都是运气不好。正在寻找在VBA中工作的简单解决方案

也许这有什么帮助

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秒钟,然后解锁工作站。在此期间,该文件已关闭。

我使用了此处的代码

根据这里的答案

我打电话

IsProcessRunning("LogonUI.exe")

这似乎很有效。

除了创建会议、锁定电脑并等待通知之外,我不知道如何调试它。当我这样做时,它总是在Windows 10上返回unlocked。当系统被锁定时,此函数将运行“Locked”。如何调试是什么意思?您只需要一个
if
条件来检查系统是否已锁定,以及运行宏时是否已锁定。通过你的帖子,你已经有一个宏在运行了,对吗?我更新了帖子,并添加了一个如何使用该功能的示例。我的意思是这是一个缓慢的调试过程,因为我必须在1分钟内创建一个带有提醒的会议,然后锁定我的电脑,看看它是否会向我发送消息。由于某种原因,即使计算机被锁定,上面的代码也总是返回unlocked。我提供了一个测试速度更快的示例。告诉您自上次键盘/鼠标操作以来的时间&如果您不锁定就去AFK,它将起作用。
IsProcessRunning("LogonUI.exe")