Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2004.08.15;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.56 MB
Время: 0.045 c
8-1085733655
ma5ter
2004-05-28 12:40
2004.08.15
Нужна идея а лучше ссылка где есть описание


14-1089786735
Vlad Oshin
2004-07-14 10:32
2004.08.15
Вот кто реально снимался в Властелине колец :)


3-1090416537
Term
2004-07-21 17:28
2004.08.15
Какой функцией в запросе можно выделить год из даты


1-1091276543
mikey
2004-07-31 16:22
2004.08.15
Добрый день. Есть список


14-1090823281
Ломброзо
2004-07-26 10:28
2004.08.15
ЧТо-то я ничего не понял. Толкователи есть?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский