Как определить вход пользователя в систему - Login/Logout Event - VB

Узнай цену своей работы

Формулировка задачи:

(фактически для всех виндов) У меня задача: программа должна запускаться вместе в виндами и мониторить девайс. Во время входа пользователя (login) надо запустить дополнительную прогу для доступа к устройству. При выходе (logout) эта прога закрывается, но основной процесс должен продолжать работу. Вполне вероятен вход другого пользователя, тогда операция повторится. Я думаю, что основной процесс надо зарегестрировать как сервис. Однако остается вопрос: как отловить Logon/Logoff Event. (или если проверять через таймер, как определить пользователя) Да, по поводу запуска в качестве сервиса - посоверуйте, как посадить процесс на бесконечный цикл, так как после выполнения определённых функций sub main закончится а вместе с ним и процесс. (я не планирую добавлять окна в основной процесс). Если установить таймер (все равно надо мониторить устройство), будет ли процесс оставаться в памяти?

Решение задачи: «Как определить вход пользователя в систему - Login/Logout Event»

textual
Листинг программы
Public Const INFINITE = -1&      '  Infinite timeout
Private Const WAIT_TIMEOUT = 258&
 
Public Type OSVERSIONINFO
    dwOSVersionInfoSize As Long
    dwMajorVersion As Long
    dwMinorVersion As Long
    dwBuildNumber As Long
    dwPlatformId As Long
    szCSDVersion(1 To 128) As Byte
End Type
 
Public Const VER_PLATFORM_WIN32_NT = 2&
Private Const STATUS_TIMEOUT = &H102&
Private Const QS_KEY = &H1&
Private Const QS_MOUSEMOVE = &H2&
Private Const QS_MOUSEBUTTON = &H4&
Private Const QS_POSTMESSAGE = &H8&
Private Const QS_TIMER = &H10&
Private Const QS_PAINT = &H20&
Private Const QS_SENDMESSAGE = &H40&
Private Const QS_HOTKEY = &H80&
Private Const QS_ALLINPUT = (QS_SENDMESSAGE Or QS_PAINT _
        Or QS_TIMER Or QS_POSTMESSAGE Or QS_MOUSEBUTTON _
        Or QS_MOUSEMOVE Or QS_HOTKEY Or QS_KEY)
Private Declare Function MsgWaitForMultipleObjects Lib 'user32' _
        (ByVal nCount As Long, pHandles As Long, _
        ByVal fWaitAll As Long, ByVal dwMilliseconds _
        As Long, ByVal dwWakeMask As Long) As Long
Private Declare Function GetTickCount Lib 'kernel32' () As Long
Private Declare Function GetVersionEx Lib 'kernel32' Alias 'GetVersionExA' (lpVersionInformation As OSVERSIONINFO) As Long
Public Declare Function MessageBox Lib 'user32' Alias 'MessageBoxA' (ByVal hWnd As Long, ByVal lpText As String, ByVal lpCaption As String, ByVal wType As Long) As Long
 
Public hStopEvent As Long, hStartEvent As Long, hStopPendingEvent As Long
Public IsNT As Boolean, IsNTService As Boolean
Public ServiceNamePtr As Long
Public ServiceName As String
 
Private Sub ServiceMain(ServiceName As String)
Dim hnd As Long
Dim h(0 To 1) As Long
Dim Interval As Long
 
    ' Only one instance
    If App.PrevInstance Then Exit Sub
    ' Check OS type
    IsNT = CheckIsNT()
    ' Creating events
    hStopEvent = CreateEventW(0&, 1&, 0&, 0&)
    hStopPendingEvent = CreateEventW(0&, 1&, 0&, 0&)
    hStartEvent = CreateEventW(0&, 1&, 0&, 0&)
    ServiceNamePtr = StrPtr(ServiceName)
    If IsNT Then
        ' Trying to start service
        hnd = StartAsService
        h(0) = hnd
        h(1) = hStartEvent
        ' Waiting for one of two events: sucsessful service start (1) or
        ' terminaton of service thread (0)
        IsNTService = MsgWaitObj(INFINITE, h(0), 2&) = 1&
        If Not IsNTService Then
            CloseHandle hnd
            MessageBox 0&, 'This program must be started as a service.', App.Title, vbInformation Or vbOKOnly Or vbMsgBoxSetForeground
        End If
    Else
        MessageBox 0&, 'This program is only for Windows NT/2000/XP/2003.', App.Title, vbInformation Or vbOKOnly Or vbMsgBoxSetForeground
    End If
    
    If IsNTService Then
        ' ******************
        ' Here you may initialize and start service's objects
        ' These objects must be event-driven and must return control
        ' immediately after starting.
        ' ******************
        If Service_Initialize(ServiceName) = 0 Then
          SetServiceState SERVICE_RUNNING
          Do
              ' ******************
              ' It is main service loop. Here you may place statements
              ' which perform useful functionality of this service.
              ' ******************
              ' Loop repeats every second. You may change this interval

Оцени полезность:

8   голосов , оценка 4.25 из 5
Похожие ответы