Видео-шпион gh05t (gh05t@yandex.ru) Хакер, номер #076, стр. 076-108-3 Кстати, если ты обратишь внимания на типы переменных, то заметишь, что я не стал писать сервис исключительно на WinAPI. Причин тому есть несколько. Во-первых, – это кошмарный формат JPEG, без которого не удалось бы по-человечески сжать скриншот. Реализовывать сжатие – это своего рода мазохизм, поэтому, если есть возможность, то надо этого избежать. Что я собственно и сделал. Во-вторых, – это нежелание реализовывать собственный smtp-движок, т. к. протокол SMTP сложный, можно наделать много ошибок, отловить которые будет очень непросто. Отправка почты у нас будет осуществляться также с помощью стандартного компонента TIdSMTP. Поэтому помимо модулей Graphics и JPEG, в uses мы должны добавить IdSMTP. Естественно, что использование компонентов Delphi в программе очень неприятным образом отразится на ее размере. Поэтому было бы логично заметить, что для распространения шпиона (которым, между прочим, я тебе строго на строго не рекомендую заниматься) куски, использующие возможности среды, надо переписать на чистом API. Ладно, вернемся к нашей инициализации. Нам надо вызвать конструкторы для всех переменных, объявленных выше кроме хэндла и аттача. Хэндл – это не класс, а просто дескриптор, у него вызывать и настраивать нечего. А аттач мы будем инициализировать позже, уже в процессе работы шпиона, так как в его конструкторе надо указать адрес прикрепляемого файла, а мы его узнаем лишь после сохранения снимка рабочего стола в файл. Примеры вызовов конструкторов bmScreen:=Graphics.TBitmap.Create; jpeg:=TJPEGImage.Create; mes:=TIdMessage.Create(nil); smtp:=TIdSMTP.Create(nil); Создав объекты, мы должны настроить их параметры. У битмапа выставить размеры экрана. Их можно получить с помощью функции GetSystemMetrics, скармливая ей сначала SM_CXSCREEN (для получения ширины экрана), а потом SM_CYSCREEN (для высоты). Будущему SMTP-соединению мы должны указать smtp-сервер, логин и пароль на нем, а также тип аутентификации (atLogin). В параметрах сообщения мы укажем, куда слать снимки рабочего стола и как оформлять письмо. Если есть желание, можно также выставить качество сжатия JPEG поменьше. Если не трогать стандартных размеров (1024х768) скрин занимает где-то 150-200кб. После инициализации всех возможных переменных, следует изменить значение текущего состояния сервиса, расположенного в переменной MyServiceStatus, на SERVICE_RUNNING и сообщить об этом системе: MyServiceStatus.dwCurrentState:= SERVICE_RUNNING; SetServiceStatus (MyServiceStatusHandle, MyServiceStatus); Камера! Мотор! Основной код сервиса – мы будем выполнять в цикле в ServiceMain-функции, после инициализации всех переменных. Я не придумал ничего более оригинального, чем сделать цикл бесконечным (вообще-то, так делать нельзя, лучше какую-нибудь переменную-флаг ввести, а не true писать – прим. Горл): while true do. |