На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! user posted image
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.

Соблюдайте общие правила форума

Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как "свернуть" программу в трей.
3. Как "скрыться" от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как запустить программу/файл? (и дождаться ее завершения)
5. Как перехватить API-функции, поставить hook? (перехват сообщений от мыши, клавиатуры - внедрение в удаленное адресное прстранство)
... (продолжение следует) ...

Внимание:
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки - бан.
Мат в разделе - бан на три месяца...

Полезные ссылки:
user posted image MSDN Library user posted image FAQ раздела user posted image Поиск по разделу user posted image Как правильно задавать вопросы


Выразить свое отношение к модераторам раздела можно здесь: user posted image Rouse_, user posted image Krid

Модераторы: Rouse_, Krid
  
> Событие блокировки компьютера , Как отследить?
    Как отследить событие блокировки компьютера?
      Надо писать Winlogon Notification Package (.dll), которая будет подгружаться при старте winlogon.exe и отслеживать события в системе - логон, логофф, блокировка/разблокировка десктопа, старт/стоп скринсейвера и т.д.

      ExpandedWrap disabled
        procedure WLN_Lock (pInfo: PWLX_NOTIFICATION_INFO); stdcall; forward;
        procedure WLN_Logoff (pInfo: PWLX_NOTIFICATION_INFO); stdcall; forward;
        procedure WLN_Logon (pInfo: PWLX_NOTIFICATION_INFO); stdcall; forward;
        procedure WLN_Shutdown (pInfo: PWLX_NOTIFICATION_INFO); stdcall; forward;
        procedure WLN_StartScreenSaver (pInfo: PWLX_NOTIFICATION_INFO); stdcall; forward;
        procedure WLN_StartShell (pInfo: PWLX_NOTIFICATION_INFO); stdcall; forward;
        procedure WLN_Startup (pInfo: PWLX_NOTIFICATION_INFO); stdcall; forward;
        procedure WLN_StopScreenSaver (pInfo: PWLX_NOTIFICATION_INFO); stdcall; forward;
        procedure WLN_Unlock (pInfo: PWLX_NOTIFICATION_INFO); stdcall; forward;

      можно реализовывать не все функции. детальнее - MSDN
      Сообщение отредактировано: LiquidStorm -
        А нельзя ли из работающей GUI-программы отловить например сообщение, как сообщение о завершении сеанса?
        (без dll)
          насколько я знаю, система на уведомляет user-level программы о таких событиях.
          Можно сделать свою .длл, которая будет следить за уведомлениями от winlogon.exe и уже она будет отсылать уведомление твоей GUIшной программе.
          Сообщение отредактировано: LiquidStorm -
            Не подкинете пример?
              В примере .длл после регистрации и перезагрузки шлет широковещательный месадж (HWND_BROADCAST) с WM_USER + 100 - блокировка, WM_USER + 101 - разблокировка десктопа. ВНИМАНИЕ: пример может не работать в части отсылки сообщения, так как в оригинале он писал информацию об изменении состояния десктопа в файл.
              Вместо отсылки сообщения можно менять в реестре какой-нибуть параметр, который будет считывать ваша GUIшная программа.

              install.bat
              ExpandedWrap disabled
                @echo off
                copy wl_ntfy.dll %WINDIR%\system32\wl_ntfy.dll
                echo y| cacls %WINDIR%\system32\wl_ntfy.dll /G Administrators:F /P System:F
                rundll32.exe wl_ntfy.dll,Install

              wl_ntfy.dpr
              ExpandedWrap disabled
                library wl_ntfy;
                 
                uses
                  Windows,
                  UWinWlx in 'UWinWlx.pas';
                 
                {$R *.RES}  
                 
                procedure EntryPointProc(Reason: Integer);
                begin
                    case reason of
                        DLL_PROCESS_ATTACH:
                             //Disable DLL_THREAD_ATTACH & DLL_THREAD_DETACH
                             //notification calls. This is a performance optimization
                             //for multi-threaded applications that do not need
                             //thread-level notifications of attachment or detachment.
                 
                             DisableThreadLibraryCalls (hInstance);
                 
                        DLL_PROCESS_DETACH: ;
                    end;
                end;
                 
                Exports
                 InstallNotify          name 'Install',
                 WLN_Lock,
                 WLN_Unlock;
                 
                begin
                  DllProc := @EntryPointProc;
                  EntryPointProc(DLL_PROCESS_ATTACH);
                end.

              UWinWlx.pas
              ExpandedWrap disabled
                unit UWinWlx;
                 
                interface
                uses Windows;
                 
                /////////////////////////////////////////////////////////////////////////
                //    WLX == WinLogon eXtension
                //
                //    This file contains definitions, data types, and routine prototypes
                //    necessary to produce a DLL for Winlogon.
                /////////////////////////////////////////////////////////////////////////
                 
                //
                // Non-GINA notification DLLs
                //
                type
                  PWSTR = Windows.LPWSTR;
                 
                  PFNMSGECALLBACK = function (bVerbose: BOOL; lpMessage: LPWSTR): DWORD; stdcall;
                  {$EXTERNALSYM PFNMSGECALLBACK}
                  TFnMsgeCallback = PFNMSGECALLBACK;
                 
                  PWLX_NOTIFICATION_INFO = ^WLX_NOTIFICATION_INFO;
                  {$EXTERNALSYM PWLX_NOTIFICATION_INFO}
                  _WLX_NOTIFICATION_INFO = record
                    Size: Windows.ULONG;
                    Flags: Windows.ULONG;
                    UserName: Windows.LPWSTR;
                    Domain: Windows.LPWSTR;
                    WindowStation: Windows.LPWSTR;
                    hToken: Windows.THANDLE;
                    hDesktop: Windows.HDESK;
                    pStatusCallback: PFNMSGECALLBACK;
                  end;
                  {$EXTERNALSYM _WLX_NOTIFICATION_INFO}
                  WLX_NOTIFICATION_INFO = _WLX_NOTIFICATION_INFO;
                  {$EXTERNALSYM WLX_NOTIFICATION_INFO}
                  TWlxNotificationInfo = WLX_NOTIFICATION_INFO;
                  PWlxNotificationInfo = PWLX_NOTIFICATION_INFO;
                 
                  // Event Handler Function Prototype
                  WLEvtHandler_Function = procedure(pInfo: PWLX_NOTIFICATION_INFO); stdcall;
                 
                //
                // notifications
                //
                 
                procedure WLN_Lock (pInfo: PWLX_NOTIFICATION_INFO); stdcall; forward;
                procedure WLN_Unlock (pInfo: PWLX_NOTIFICATION_INFO); stdcall; forward;
                 
                //
                // install procedure
                //
                 
                procedure InstallNotify; stdcall; forward;
                 
                implementation
                uses SysUtils, Registry;
                 
                const
                   RegRoot  = HKEY_LOCAL_MACHINE;
                   RegPath  = '\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\Notify';
                   RegName  = 'LQS_WLN';
                   defName  = 'wl_ntfy.dll';
                 
                procedure InstallNotify;
                var xReg: TRegistry;
                begin
                  //
                  xReg := TRegistry.Create;
                  try
                    xReg.RootKey := RegRoot;
                    xReg.Access  := KEY_ALL_ACCESS;
                    if xReg.OpenKey(RegPath,True) then
                      if xReg.OpenKey(RegName,True) then
                      begin
                        xReg.WriteInteger('Asynchronous',0);
                        xReg.WriteExpandString('DLLName',defName);
                        xReg.WriteInteger('Impersonate',0);
                        xReg.WriteString('Lock','WLN_Lock');
                        xReg.WriteString('Unlock','WLN_Unlock');
                        MessageBox(0, 'Installed: [OK]', '', MB_OK + MB_ICONINFORMATION + MB_TASKMODAL);
                      end;
                  finally
                    xReg.CloseKey;
                    xReg.Free;
                  end;
                end;
                 
                procedure WLN_Lock;
                begin
                  PostMessage(HWND_BROADCAST,WM_USER + 100,0,0);
                end;
                 
                procedure WLN_Unlock;
                begin
                  PostMessage(HWND_BROADCAST,WM_USER + 101,0,0);
                end;
                 
                initialization
                 
                finalization
                 
                end.
              Сообщение отредактировано: LiquidStorm -
              0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
              0 пользователей:


              Рейтинг@Mail.ru
              [ Script execution time: 0,0486 ]   [ 16 queries used ]   [ Generated: 23.06.25, 07:51 GMT ]