У меня есть макрос, который отправляет мне текст из Outlook, когда появляется уведомление о встрече. Я хотел бы найти способ заставить этот макрос запускаться только в том случае, если я не на своем компьютере. Я искал способ получить свой статус из Skype для бизнеса, определить, заблокирован ли ПК, и посмотреть, вставлена ли смарт-карта. Все без особого везения. Ищете простое решение, которое работает в VBA.
Определить, заблокирован ли компьютер
comment
GetLastInputIdle показывает время, прошедшее с момента последнего действия клавиатуры/мыши. & будет работать, если вы перейдете в режим AFK без блокировки.
- person Alex K.   schedule 06.03.2020
Ответы (2)
Я использовал код отсюда Определить, работает ли приложение с 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
Основываясь на ответе здесь В Python 3, как могу ли я узнать, заблокирована ли Windows?
Я позвонил
IsProcessRunning("LogonUI.exe")
и это, кажется, работает.
person
DaGentooBoy
schedule
06.03.2020
Может быть, это чем-то поможет
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 секунды, прежде чем разблокировать рабочую станцию. Тем временем файл был закрыт.
person
Storax
schedule
06.03.2020
Я не знаю, как это отладить, кроме как создать собрание, заблокировать компьютер и дождаться уведомления. Когда я это делаю, он всегда возвращается разблокированным в Windows 10.
- person DaGentooBoy; 06.03.2020
Эта функция повторно запускает Locked, когда система заблокирована. Что вы имеете в виду под как отлаживать? Вам просто нужно условие
if
, чтобы проверить, заблокирована ли система, и если вы запускаете свой макрос. Судя по вашему сообщению, у вас уже запущен макрос, верно?
- person Storax; 06.03.2020
Я обновил пост и добавил пример использования функции.
- person Storax; 06.03.2020
Я просто имел в виду, что это медленный процесс отладки, потому что я должен создать собрание с напоминанием за 1 минуту, а затем заблокировать свой компьютер и посмотреть, отправит ли он мне сообщение. По какой-то причине приведенный выше код всегда возвращался разблокированным, даже если компьютер был заблокирован.
- person DaGentooBoy; 08.03.2020
Я привел пример, где тестирование проходит намного быстрее.
- person Storax; 08.03.2020