
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.21] |
![]() |
|
![]() |
|
|
Как отследить событие блокировки компьютера?
|
Сообщ.
#2
,
|
|
|
Надо писать Winlogon Notification Package (.dll), которая будет подгружаться при старте winlogon.exe и отслеживать события в системе - логон, логофф, блокировка/разблокировка десктопа, старт/стоп скринсейвера и т.д.
![]() ![]() 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 |
Сообщ.
#3
,
|
|
|
А нельзя ли из работающей GUI-программы отловить например сообщение, как сообщение о завершении сеанса?
(без dll) |
Сообщ.
#4
,
|
|
|
насколько я знаю, система на уведомляет user-level программы о таких событиях.
Можно сделать свою .длл, которая будет следить за уведомлениями от winlogon.exe и уже она будет отсылать уведомление твоей GUIшной программе. |
Сообщ.
#5
,
|
|
|
Не подкинете пример?
|
Сообщ.
#6
,
|
|
|
В примере .длл после регистрации и перезагрузки шлет широковещательный месадж (HWND_BROADCAST) с WM_USER + 100 - блокировка, WM_USER + 101 - разблокировка десктопа. ВНИМАНИЕ: пример может не работать в части отсылки сообщения, так как в оригинале он писал информацию об изменении состояния десктопа в файл.
Вместо отсылки сообщения можно менять в реестре какой-нибуть параметр, который будет считывать ваша GUIшная программа. install.bat ![]() ![]() @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 ![]() ![]() 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 ![]() ![]() 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. |