Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Отслеживание событий входа и выхода пользователей в Windows Service на Delphi

Delphi , ОС и Железо , Windows

Вопрос, поднятый в данном запросе, заключается в необходимости отслеживания событий входа и выхода пользователей в Windows Service, написанном на языке Delphi. Задача состоит в том, чтобы в сервисе отображать иконку в системном трее, которая открывает окно с настройками или журналами, но делать это только в случае, если пользователь вошел в систему.

Описание проблемы

Для реализации требуемой функциональности необходимо использовать механизмы, позволяющие получать уведомления о событиях входа и выхода пользователей. В интернете можно найти информацию о System Event Notification Service, но она чаще всего относится к C# и .NET, в то время как для Delphi и Object Pascal таких данных значительно меньше.

Решение проблемы

Для решения поставленной задачи можно использовать API Windows, такие как WTSRegisterSessionNotification и WTSRegisterSessionNotificationEx. Эти функции предоставляют информацию о различных событиях, связанных с сессиями пользователей, включая:

  • WTS_SESSION_LOGON – событие входа в сессию.
  • WTS_SESSION_LOGOFF – событие выхода из сессии.
  • WTS_REMOTE_CONNECT – событие удаленного подключения.
  • WTS_REMOTE_DISCONNECT – событие удаленного отключения.
  • WTS_CONSOLE_CONNECT – событие подключения к консоли.
  • WTS_CONSOLE_DISCONNECT – событие отключения от консоли.

Используя эти события, можно определить идентификатор сессии пользователя и запустить процесс в этой конкретной сессии. Например, можно запустить процесс, который будет отображать иконку в системном трее. Для обмена данными между сервисом и процессом, отображающим иконку, можно использовать именованные каналы, разделяемую память и другие механизмы.

Важно отметить, что для получения уведомлений необходимо создать окно, которое будет их принимать. В случае сервиса потребуется создать скрытое окно с сообщением в цикле (об этом можно прочитать в других источниках, например, на Stack Overflow).

Пример кода на Object Pascal (Delphi)

uses
  Winapi.Windows,
  Winapi.Wts;

function RegisterSessionNotification(notificationWindow: HWND; flags: DWORD; reason: TDWORD): BOOL; stdcall;
var
  WTSUserSessionNotification: TDWORD = $100;
  WTSConnectSession_2: TDWORD = $2;
begin
  // Регистрация уведомлений о сессиях пользователя
  Result := RegisterSessionNotification(notificationWindow, WTSUserSessionNotification, WTSConnectSession_2);
end;

procedure NotificationCallback(hServerConnection, hEvent, data: DWORD; lastWin32Error, sessionId, reason: TDWORD; pWinstationInfo: PWTSSESSION_INFO; pData: Pointer);
begin
  // Обработка полученного уведомления
  // Например, проверка на событие входа в сессию и запуск процесса для отображения иконки
  if (reason = WTSConnectSession_2) and (WTSGetSessionInfo(hServerConnection, sessionId, pWinstationInfo) <> FALSE) then
    // Ваш код для обработки события
end;

var
  notificationWindow: THandle;
begin
  // Инициализация скрытого окна с сообщениями
  notificationWindow := CreateWindowEx(0, 'STATIC', '', WS_CHILD, -1, -1, 0, 0, 0, 0, 0, Handle(0), 0);
  RegisterSessionNotification(notificationWindow, WTSUserSessionNotification, WTSConnectSession_2, @NotificationCallback);
  // Цикл сообщений для обработки уведомлений
  while not Terminated do
  begin
    ServiceThread.Sleep(1000);
    ResultCode := MsgWaitForMultipleObjects(0, nil, FALSE, INFINITE, QS_ALLPOSTMESSAGE);
    if (ResultCode = WAIT_OBJECT_0 + WM_QUIT) then
      Break;
    if (ResultCode = WAIT_OBJECT_0 + WM_ENDSESSION) then
      Break;
    if ResultCode >= WAIT_OBJECT_0 then
    begin
      Message := GetMessage(nil, 0, 0, 0);
      TranslateMessage(Message);
      DispatchMessage(Message);
    end
    else
    begin
      // Обработка таймаута
    end;
  end;
end;

Обратите внимание, что для работы с сессиями пользователя важно понимать, что сессии основаны на технологии RDS (Remote Desktop Services), которая ранее была известна как Terminal Services.

Заключение

Использование API Windows для регистрации уведомлений о сессиях пользователей позволяет реализовать необходимый функционал в Windows Service, написанном на Delphi, без необходимости включения в него пользовательского интерфейса. Это решает задачу отображения иконки в системном трее, которая будет доступна только при активной сессии пользователя.

Создано по материалам из источника по ссылке.

Отслеживание событий входа и выхода пользователей в Windows Service для возможности отображения системного трея в их сессиях.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Windows ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-05-01 12:06:46/0.00370192527771/0