vba - 确定计算机是否被锁定
问题描述
我有一个宏,当会议通知弹出时,它会从 Outlook 向我发送文本。我想找出一种方法,使该宏仅在我不在计算机旁时才运行。我一直在寻找一种方法来从 Skype for Business 中提取我的状态,确定 PC 是否被锁定,并查看是否插入了智能卡。都没有太多的运气。寻找适用于 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 秒钟。该文件已在此期间关闭。
推荐阅读
- python - 如何使用networkx在两个图之间执行树交叉?
- java - java JSON解析中的NullPointerException
- python - 为列表中的 n 个列表迭代循环和子程序
- reactjs - 使用“填充”属性向不同的侧面添加不同的填充值
- java - 使用跨平台语言开发android有什么缺点?
- arrays - 元素数组不会被接口填充
- python - 线程不放入队列
- vb.net - Visual Basic .Net 公共函数在执行前对单行过程进行解码
- mysql - 给出带有子查询和公式的结果?
- java - 如何将 JUnit 测试写入我的 Spring-MVC 控制器类?