Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Программа логирования запуска ScreenSaver. [D7]


oleon ©   (2006-03-30 18:46:00) 

Написал программу в XP работает в Windows 2003 server нет.

Пожалуйста, может кто знает в чем проблема, но WM_SYSCOMMAND не ловится.

Программа из одной формочки состоит.
Код :
unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls;

type
 TForm1 = class(TForm)
   Memo1: TMemo;
   procedure FormCreate(Sender: TObject);
   procedure FormDestroy(Sender: TObject);
 private
   { Private declarations }
   FLogStream: TStream;
   procedure WMSysCommand(var Msg : TWMSysCommand); message WM_SYSCOMMAND;
   procedure WriteLog(S: String; NewLine: Boolean = True);
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

uses
 RTLConsts;

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
const FILENAME = 'log.log';
var
 FileHandle: THandle;
begin
 //FLogStream:= TFileStream.Create(FILENAME, fmCreate);

// TFileStream не используется, чтобы потом можно было открыть файл в режиме, когда другие могут читать (например, чтобы следить в FAR'е)
 FileHandle:= CreateFile(PChar(FILENAME), GENERIC_WRITE, FILE_SHARE_READ, nil, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
 if FileHandle = INVALID_HANDLE_VALUE then begin
   raise EFOpenError.CreateResFmt(@SFOpenErrorEx, [FILENAME, SysErrorMessage(GetLastError)]);
 end;
 FLogStream:= THandleStream.Create(FileHandle);

 WriteLog('======== start ==========');
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
 FLogStream.Free;
end;

procedure TForm1.WMSysCommand(var Msg: TWMSysCommand);
begin
 WriteLog(IntToStr(Msg.CmdType));
 if (Msg.CmdType = SC_SCREENSAVE) then
   WriteLog('Так это ж скринсейвер');
 inherited;
// http://www.delphicorner.f9.co.uk/articles/wapi11.htm
end;

procedure TForm1.WriteLog(S: String; NewLine: Boolean = True);
var
 ss: String;
begin
 ss:= TimeToStr(Now) + ': ' + S;
 if NewLine then
   ss:= ss + sLineBreak;
 FLogStream.Seek(0, soEnd); //??
 FLogStream.WriteBuffer(PChar(SS)^, Length(SS))
end;

end.


Eraser   (2006-03-31 00:56:00) [1]


> oleon   (31.03.06 00:53) [3]

ввиде т.н. ловушки (hook) в отдельной DLL. В инете полно примеров реализации ловушек.
В твоём случае надо использовать тип ловушки WH_GETMESSAGE, как и указано в информации по ссылке.


oleon   (2006-03-31 00:53:00) [2]

Спасибо. Это я прочитал. Но понять не могу как мне это все в проекте написать нужно))


Eraser   (2006-03-30 21:00:00) [3]


> oleon   (30.03.06 18:46)

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

http://support.microsoft.com/default.aspx?scid=kb;en-us;238882


oleon   (2006-03-30 20:54:00) [4]

После тестов выяснилось, что по крайней мере на XP она работает. только когда формочка активна. А как написать такую программу( потом передлать ее в сервис) чтобы она логировала это все. В дальнейшем планирую писать эту инфу в базу данных. А сейчас, хотя бы в файл. Спасибо.


Наверх

Титульная страница Поиск, карта сайта Написать письмо