Как определить вход пользователя в систему - 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
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д