![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Программа логирования запуска 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 она работает. только когда формочка активна. А как написать такую программу( потом передлать ее в сервис) чтобы она логировала это все. В дальнейшем планирую писать эту инфу в базу данных. А сейчас, хотя бы в файл. Спасибо.