Определить, заблокирован ли компьютер

У меня есть макрос, который отправляет мне текст из Outlook, когда появляется уведомление о встрече. Я хотел бы найти способ заставить этот макрос запускаться только в том случае, если я не на своем компьютере. Я искал способ получить свой статус из Skype для бизнеса, определить, заблокирован ли ПК, и посмотреть, вставлена ​​ли смарт-карта. Все без особого везения. Ищете простое решение, которое работает в VBA.


person DaGentooBoy    schedule 06.03.2020    source источник
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
comment
Я не знаю, как это отладить, кроме как создать собрание, заблокировать компьютер и дождаться уведомления. Когда я это делаю, он всегда возвращается разблокированным в Windows 10. - person DaGentooBoy; 06.03.2020
comment
Эта функция повторно запускает Locked, когда система заблокирована. Что вы имеете в виду под как отлаживать? Вам просто нужно условие if, чтобы проверить, заблокирована ли система, и если вы запускаете свой макрос. Судя по вашему сообщению, у вас уже запущен макрос, верно? - person Storax; 06.03.2020
comment
Я обновил пост и добавил пример использования функции. - person Storax; 06.03.2020
comment
Я просто имел в виду, что это медленный процесс отладки, потому что я должен создать собрание с напоминанием за 1 минуту, а затем заблокировать свой компьютер и посмотреть, отправит ли он мне сообщение. По какой-то причине приведенный выше код всегда возвращался разблокированным, даже если компьютер был заблокирован. - person DaGentooBoy; 08.03.2020
comment
Я привел пример, где тестирование проходит намного быстрее. - person Storax; 08.03.2020