Форум: "Потрепаться";
Текущий архив: 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.036 c