Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.08.15;
Скачать: CL | DM;

Вниз

Чё-то меня последнее время всё больше тянет...   Найти похожие ветки 

 
Knight ©   (2004-07-28 19:18) [0]

... в сторону API и асма. Подскажите, как правильно пишется приложение без форм и вообще окон? На что нужно обратить внимание?


 
Юрий Зотов ©   (2004-07-28 19:26) [1]

> как правильно пишется приложение без форм и вообще окон?

На Delhi - вот так:
begin
end.

И это УЖЕ нормально запускается и завершается. Но еще ничего не делает.

> На что нужно обратить внимание?

На код, который нужно вставить между begin и end.


 
Knight ©   (2004-07-28 19:29) [2]

Дядь Юр... не смешно


 
Юрий Зотов ©   (2004-07-28 19:33) [3]

Я не шутил. Все, что я написал - истинная правда, вот ей-богу.

А остальное...дык... каков вопрос...
Конкретики-то никакой нет. Что ж еще сказать можно?


 
Knight ©   (2004-07-28 19:38) [4]

Хочу в целях освоения данной области, сделать на работу небольшой Spy, который бы загружался при включении компа и выгружался при его выключении, сбрасывая в лог дату-время данных событий (есть тут небольшие подозрения на сторожей). Как обычно это не проблема, но хочется, чтоб это было что-то мелкое, занимающее минимум ресурсов...


 
Knight ©   (2004-07-28 19:40) [5]

В хранителях есть окно, вокруг которого всё крутиться, а тут окна ник чему.


 
nikkie ©   (2004-07-28 19:47) [6]

>сбрасывая в лог дату-время данных событий
не знаешь, как в файл писать? ;)


 
nikkie ©   (2004-07-28 19:49) [7]

>и выгружался при его выключении
это не проблема.
помнится кто-то хотел написать программу, которая продолжала бы работать.
вот, где гуру нужен.


 
Юрий Зотов ©   (2004-07-28 19:50) [8]

> Knight ©   (28.07.04 19:38) [4]

> Хочу в целях освоения данной области, сделать на работу
> небольшой Spy, который бы загружался при включении компа и
> выгружался при его выключении, сбрасывая в лог дату-время
> данных событий

Запуск - либо писать системный сервис (не прокатит под 9х), либо через реестр.

Остальное зависит от того, какие события нужно отлавливать. Если скажем, запуск программ, то каких - всех подряд или только оконных? Первое непросто (нужно перехватывать вызовы CreateProcess), а вот второе делается обычным хуком WH_SHELL.

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


 
DSKalugin ©   (2004-07-28 19:52) [9]

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


 
Мазут Береговой ©   (2004-07-28 19:54) [10]

Действительно, почему бы сервис не написать - для логов включения и выключения - 10 минут работы...


 
Knight ©   (2004-07-28 19:54) [11]

Основных вопросов два:
1) Как граммотно сделать, чтобы программа продолжала работать между включением и выключение компа?
2) Какие события нужно обрабатывать (хранитель, переключение в режим экономии и т.п.) и к чему их привязать ведь нет ни Application ни окон?


 
Knight ©   (2004-07-28 19:56) [12]


> [10] Мазут Береговой ©   (28.07.04 19:54)
> Действительно, почему бы сервис не написать - для логов
> включения и выключения - 10 минут работы...

Win98...


 
Knight ©   (2004-07-28 20:02) [13]


> [9] DSKalugin ©   (28.07.04 19:52)
> есть готовые клавиатурные шпионы и следилки типа когда какая
> программа стартовала...

Готовыми пусть пользователи пользуются... Да мне и не надо клавиатурные, не надо про программы... включение-выключение и всё... и главное самому, чтобы разобраться с набором вопросов, ответы на которые я уже нашёл, кроме двух указанных выше.


 
nikkie ©   (2004-07-28 20:19) [14]

для того, чтобы отлавливать момент выключения, надо ловить WM_ENDSESSION. а для этого нужно сделать окно.

проверить, что скринсейвер работает можно с помощью функции SystemParametersInfo:

SPI_GETSCREENSAVERRUNNING
Windows 98, Windows 2000: Determines whether a screen saver is currently running on the window station of the calling process. The pvParam parameter must point to a BOOL variable that receives TRUE if a screen saver is currently running, or FALSE otherwise. Note that only the interactive window station, "WinSta0", can have a screen saver running.

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


 
Knight ©   (2004-07-28 20:23) [15]


> [14] nikkie ©   (28.07.04 20:19)
> для того, чтобы отлавливать момент выключения, надо ловить
> WM_ENDSESSION. а для этого нужно сделать окно.

Всё-таки придётся делать пустое окно с размерами 0х0 и координатами 0х0...


 
nikkie ©   (2004-07-28 20:27) [16]

>пустое окно с размерами 0х0 и координатами 0х0...
вот манеры... помнится когда я писал на VB в стандарте была такая фишка - засунуть Edit за край формы и при показе popup menu переставлять фокус туда. уж не помню зачем, но видно надо было. и это из той же оперы.

создаешь окно и не показываешь его. НЕВИДИМОЕ оно.


 
Fay ©   (2004-07-28 20:30) [17]

А готовый EventLog не катит?


 
Knight ©   (2004-07-28 20:32) [18]


> [16] nikkie ©   (28.07.04 20:27)
> создаешь окно и не показываешь его. НЕВИДИМОЕ оно.

Я и имел в виду невидимое... а 0х0х0х0, просто, таких у виндов много в том углу висит, поэтому решил, что так принято :)


 
Knight ©   (2004-07-28 20:33) [19]


> [17] Fay ©   (28.07.04 20:30)
> А готовый EventLog не катит?

А на чём тогда тренироваться?


 
nikkie ©   (2004-07-28 20:33) [20]

>таких у виндов много в том углу висит
это у тебя винды, наверное, неправильное.
или у тебя уже пачка шпионов на компьютере.
написанных на VB. сторожами. :)))


 
Knight ©   (2004-07-28 20:43) [21]


> [20] nikkie ©   (28.07.04 20:33)

А ты какой-нибудь hiddenman загрузи и посмотри hidden окна... у многих у них 0х0х0х0... и многие виндовые, например, "Dde Server Windows"... обнаружил когда с SetWindowPos() экспериментировал :)


 
nikkie ©   (2004-07-28 20:44) [22]

а... вон ты про что. я думал, они у тебя невооруженным взглядом видны :))


 
Rouse_ ©   (2004-07-28 21:25) [23]

> Я и имел в виду невидимое... а 0х0х0х0, просто, таких у
> виндов много в том углу висит, поэтому решил, что так принято  :)

Сань, вот посмотрел сейчас - ну ничего там не висит. Хэндлы окон есть - стиль невидимый, но что-то ни одного не нашел чтобы в ноль пикселя сверху слева вместилось :)
Соответственно вопрос: с чего решил что так принято? ;)


 
Knight ©   (2004-07-28 21:53) [24]

>> [23] Rouse_ ©   (28.07.04 21:25)
> Сань, вот посмотрел сейчас - ну ничего там не висит.
Ну не знаю... у меня в WinSign таких навалом... по хандлу делал видимыми, размером 100x100 так у них даже WM_PAINT не обрабатывается... пустышки, одним словом, типа такой которую мне придётся делать, т.е. внутри всё крутиться, а окно так, лишь бы было :)

> Соответственно вопрос: с чего решил что так принято? ;)
Увидел поэтому и решил :)


 
Knight ©   (2004-07-28 21:54) [25]

>> [23] Rouse_ ©   (28.07.04 21:25)
Перечислять не буду... потому-как их не просто много, а ОЧЕНЬ много и почти все виндовые :)


 
Rouse_ ©   (2004-07-28 22:47) [26]

Ну так ты подумай - зачем невидимому изначально (de jure) окну размеры инициализировать, тем более если оно не будет использоваться как элемент интерфейса пользователя(de facto)? Вот поэтому по нулям - но это не принято... :)


 
Rouse_ ©   (2004-07-28 22:48) [27]

В смысле - но это не значит что так принято невидимые ставить по нулям ;)


 
Knight ©   (2004-07-29 00:32) [28]

А ты их так и так выставляешь при CreateWindow, т.к. они передаются туда среди других параметров нового окна... только, в отличие от необходимых, инициализируешь их нулевыми значениями...


 
Knight ©   (2004-07-29 00:34) [29]

Типа :
CreateWindow("ClassName","WindowName",Style,0,0,0,0,0,0,hInstance,nil);


 
Digitman ©   (2004-07-29 08:35) [30]


> Knight ©   (29.07.04 00:34) [29]


да что ж тебя на этих нулях-то заклинило ?)

не указывай просто стиль WS_VISIBLE - и передавай что угодно в кач-ве размеров и координат окна

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


 
Kerk ©   (2004-07-29 08:51) [31]


> Хочу в целях освоения данной области, сделать на работу
> небольшой Spy, который бы загружался при включении компа
> и выгружался при его выключении, сбрасывая в лог дату-время
> данных событий (есть тут небольшие подозрения на сторожей).
> Как обычно это не проблема, но хочется, чтоб это было что-то
> мелкое, занимающее минимум ресурсов...

Чем виндовые логи не устраивают?


 
Knight ©   (2004-07-29 11:40) [32]

>> Digitman ©   (29.07.04 08:35) [30]
> да что ж тебя на этих нулях-то заклинило ?)
Кого заклинило? Я просто отвечаю... :)

>> Kerk ©   (29.07.04 08:51) [31]
GOTO [19]


 
Kerk ©   (2004-07-29 11:42) [33]


> Knight ©   (29.07.04 11:40) [32]
> GOTO [19]

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


 
Nous Mellon ©   (2004-07-29 11:47) [34]


>
> Ты с этим осторожно. При последовательном порядке чтения,
> я так могу в бесконечный цикл войти...

break, break!! :)


 
Knight ©   (2004-07-29 11:48) [35]


> Kerk ©   (29.07.04 11:42) [33]
> Ты с этим осторожно. При последовательном порядке чтения,
> я так могу в бесконечный цикл войти...

А я нарошно... :)


 
Knight ©   (2004-07-29 14:37) [36]

Вот какая заготовка тут вышла (50к)... даже работает... вроде :)

program Spy;

uses
 SysUtils,
 Windows;

const LOGFILE_NAME="Log.dat";
     INIFILE_NAME="config.ini";

     WM_NCCREATE         = $0081;
     WM_DESTROY          = $0002;
     WM_QUERYENDSESSION  = $0011;

resourcestring
     SIniFileWriteError = "Unable to write to %s";

Type
 TSpyConfig=record
   AppPath:String;
 end;

Var
 SpyWindow:hWnd;
 SpyConfig:TSpyConfig;

{$R *.RES}

procedure WriteToIniFile(Section,Ident,Value:String);
var FileName:string;
begin
 FileName:=SpyConfig.AppPath+INIFILE_NAME;
 if not WritePrivateProfileString(PChar(Section), PChar(Ident),PChar(Value), PChar(FileName)) then
   raise Exception.CreateResFmt(@SIniFileWriteError, [FileName]);
end;

function ReadFromIniFile(Section,Ident:String):String;
var Buffer: array[0..2047] of Char;
begin
 SetString(Result, Buffer, GetPrivateProfileString(PChar(Section), PChar(Ident), "", Buffer, SizeOf(Buffer), PChar(SpyConfig.AppPath+INIFILE_NAME)));
end;

procedure WriteToLogFile(Str:String);
var F:Text;
begin
 AssignFile(F,SpyConfig.AppPath+LOGFILE_NAME);
 {$I-}
   if FileExists(SpyConfig.AppPath+LOGFILE_NAME) then Append(F)
   else Rewrite(F);
 {$I+}
 if ioResult=0 then begin
   if Str<>"" then begin
     Str:=DateTimeToStr(Now)+" - "+Str;
   end;
   WriteLn(F,Str);
   CloseFile(F);
 end;
end;

Function SpyWndProc(Window : hWnd; Msg,WParam,LParam : Integer): Integer; StdCall;
Begin
 Result := 0;
 Case Msg of
   WM_NCCREATE  : begin
     WriteToIniFile("Settings","State","Started");
     WriteToLogFile("Программа запущена");
     Result := 1;
   end;
   WM_QUERYENDSESSION: begin
     WriteToIniFile("Settings","State","Stoped");
     WriteToLogFile("Выход из Windows");
     WriteToLogFile("");
     Result:=1;
   end;
   WM_DESTROY   : begin
     WriteToIniFile("Settings","State","Stoped");
     WriteToLogFile("Программа закрыта");
     WriteToLogFile("");
     PostQuitMessage(0);
   end
   Else Result := DefWindowProc(Window,Msg,WParam,LParam);
 End;
End;

Function CreateSpyWindow: hWnd;
Var WC : TWndClass;
Begin
 WC.Style := cs_ParentDC;
 WC.lpfnWndProc := @SpyWndProc;
 WC.cbClsExtra := 0;
 WC.cbWndExtra := 0;
 WC.hIcon := 0;
 WC.hCursor := 0;
 WC.hbrBackground := 0;
 WC.lpszMenuName := nil;
 WC.lpszClassName := "SpyClass";
 WC.hInstance := hInstance;
 RegisterClass(WC);
 Result := CreateWindow("SpyClass","",WS_POPUP,0,0,0,0,0,0,hInstance,nil);
 SpyWindow := Result;
End;

Procedure RunSpy;
Var Msg:TMsg;
   S:String;
Begin
 SpyWindow:=0;
 S := ParamStr(0);
 if Length(S)>1 then begin
   SpyConfig.AppPath:=ExtractFilePath(S);
   if ReadFromIniFile("Settings","State")="Started" then begin
     SpyWindow:=FindWindowEx(0,0,"SpyClass","");
     if SpyWindow>0 then begin
       if MessageBox(0,"Выгрузить программу из памяти?","Close Spy",MB_YESNO or MB_ICONQUESTION or MB_SYSTEMMODAL)=IDYES then SendMessage(SpyWindow,wm_Destroy,0,0);
     end else begin
       WriteToLogFile("Некорректное завершение работы программы");
       WriteToLogFile("");
     end;
   end;
   if SpyWindow=0 then begin
     CreateSpyWindow;
     While GetMessage(Msg,0,0,0) do Begin
       TranslateMessage(Msg);
       DispatchMessage(Msg);
     End;
   end;
 end;
End;

begin
 RunSpy;
end.



Страницы: 1 вся ветка

Текущий архив: 2004.08.15;
Скачать: CL | DM;

Наверх




Память: 0.58 MB
Время: 0.023 c
3-1090315249
Kaginava
2004-07-20 13:20
2004.08.15
работа с MySQL


4-1089095680
bar
2004-07-06 10:34
2004.08.15
Ошибка хука при нажатии WIN+D


3-1090471464
malefik
2004-07-22 08:44
2004.08.15
Вопрос по параметрам.......TQuery


14-1091008304
Esu
2004-07-28 13:51
2004.08.15
Забавно и жизненно :)))


14-1090946189
Кириешки
2004-07-27 20:36
2004.08.15
Улучшение внешнего вида программы