четверг, 20 декабря 2012 г.

Некоторые проблемы с антивирусом Kaspersky Workstation 6.0.4.1424

В данном посте мне бы хотелось рассказать о проблемах и их решениях связанных с антивирусом Kaspersky Workstation 6.0.4.1424 возникших в результате использования данного антивируса на нескольких компьютерах под управлением операционной системы Windows XP SP3.

  1. Первая проблема проявила себя когда на компьютере пропал интернет, т.е. все страницы в Internet Explorer (версии 7,8) разных версий, в других браузерах (Firefox, Opera), под разными учетными записями, не грузили и не отображали интернет ресурсы, хотя все внешние и внутренние ресурсы пинговались, как по ip-адресу, так и по имени. Сброс настроек IE давал положительный результат, т.е. интернет страницы грузились, но после перезапуска браузера вновь отказывались грузится. Проблема решилась отключением антивируса, а в дальнейшем его переустановкой. Если вы столкнулись с подобной проблемой, первым делом попробуйте отключить антивирус.

  2. Вторая проблема проявила себя когда компьютер полностью загрузившись, т.е. когда вход на рабочий стол под учетной записью пользователя выполнен. Пользователь начинал работать с системой, открывать окна, копировать файлы и т.д. Через несколько минут система выдавала синий экран смерти (BSOD) с кодом ошибки STOP: 0x0000008E в системном файле kl1.sys. Первым делом была найдена информация об ошибке 0x8E, по этой ошибке говорилось о возможной неисправности модулей оперативной памяти, о проблеме с жестким диском, о вирусах. Поковырявшись с памятью, проверив жесткий диск на плохие сектора и ошибок файловой системы от синего экрана так и не избавился. Потом нашел такой же (с одинаковой материнской платой, с одинаковым жестким диском) нормально работающий компьютер, вытащил с него жесткий диск и подключил к нему жесткий диск компьютера с синим экраном. Операционная система загрузилась, но через некоторое время был получен синий экран с тем же кодом ошибки 0x8E в системном файле kl1.sys. Из этого было решено, что проблема не связана с железом компьютера и жесткие диски был возвращены на свои родные места. Далее почитав про системный файл kl1.sys, оказалось файл относится к антивирусу Касперского. Следующим шагом была попытка удалить антивирус с компьютера, но синий экран появлялся в одно и тоже время когда нажималась кнопка удаления антивируса (антивирус удалялся стандартными средствами Windows XP через «Установку и удаления программ» в Панели управления). Далее было решено удалить системный файл kl1.sys, предварительно было найдено место расположения данного файла (C:\Windows\System32\drivers). Компьютер был загружен с LiveDVD и этот файл был благополучно перемещен с жесткого диска. После этих манипуляций операционная система была благополучно загружена, даже антивирус загрузился. Удаление файла kl1.sys дало возможность без синего экрана смерти удалить антивирус с компьютера пользователя. Больше синий экран не появлялся. Тут и сказочки конец. Скажу только одно, возможно, этот файл был установлен вместе с обновлениями к антивирусу, и эти обновления предназначались другой версии антивируса Касперского (7 или 8 версии), но это только предположения. Спишем всё на магию.

понедельник, 24 сентября 2012 г.

Прикручиваем SDL к NetBeans в Ubuntu 10.04



Для начала нужно установить библиотеку SDL. Открываем терминал и вводим следующую команду:

sudo apt-get install libsdl1.2-dev

В Ubuntu 10.04 установочный пакет называется libsdl1.2-dev. Данный пакет потянет за собой несколько других пакетов для разработки, у меня к ним относятся:

libaa1-dev
libasound2-dev
libaudio-dev
libaudiofile-dev
libavahi-client-dev
libavahi-common-dev
libcaca-dev
libdbus-1-dev
libesd0-dev
libncurses5-dev
libpulse-dev
libsdl1.2-dev
libslang2-dev

Кроме вышеуказанного пакета, необходимо установить еще один пакет, который называется libsdl1.2debian-all 

Надеюсь вы знаете как установить IDE NetBeans на Ubuntu, или если IDE уже установлена, то первым делом необходимо установить плагин C++ для NetBeans. Сразу скажу, что из репозитория Ubuntu 10.04 устанавливается IDE NetBeans 6.8. Выбираем меню Tools > Plugins. Далее вкладка Available Plugins ищем C\C++ плагин и ставим галку напротив и ниже давим кнопку Install. После этого откроется мастер установки выбранного плагина. Нажимаем Next, принимаем лицензионное соглашение и нажимаем кнопку Install.

Ну вот, с установкой покончено. Далее необходимо создать новый C\C++ проект. Нажимаем меню File > New Project. В окне создания нового проекта выбираем категорию C\C++ и в списке напротив C\C++ Application. Далее нажимаем кнопку Next. На следующем шаге от нас потребуют указать название проекта и его размещение. В поле Project Name пишем например SDL_p1. Размещение оставим как есть или укажите другое на свое усмотрение. Галки создания главного исходного файла проекта и установки как главного проекта должны быть выбраны. Главный файл будет называться main.cpp. На скриншоте ниже все это можно увидеть. 


По окончанию всех настроек нажимаем кнопку Finish.

Далее покажу скриншот нашего проекта открытого в IDE NetBeans.


Переходим к настройке проекта. Чтобы открыть свойства проекта выберите меню File > Project Properties... Для того чтобы проект построился успешно необходимо в свойствах проекта выбрать ветку Build > Linker , найти поле Additional Options и добавить в это поле следующую опцию -lSDL. 


Проект настроили, теперь необходимо добавить код в main.cpp который будем компилировать. Я не буду писать код с нуля, а возьму код, с небольшими изменениями, с моего поста «Прикручиваем SDL к Visual Studio 2008». Ниже представлен весь код:

/*
* File: main.cpp
* Author: notidealrunner
*
* Created on September 19, 2012, 9:38 PM
*/

#include <stdlib.h>
#include <SDL/SDL.h>

/*
*
*/
int main(int argc, char** argv) {

printf("Initializing SDL.\n");

if((SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO)==-1)) {
printf("Could not initialize SDL: %s.\n", SDL_GetError());
exit(-1);
}

printf("SDL initialized.\n");

printf("Quiting SDL.\n");

SDL_Quit();

printf("Quiting....\n");

return (EXIT_SUCCESS);
}

На этом все.

вторник, 18 сентября 2012 г.

Дополнение к посту "Прикручиваем SDL к Visual Studio 2008"

  1. Скачать библиотеку разработки, последняя версия это 1.2.15. Распаковать архив например: C:\Libs\SDL-1.2.15. В распакованном архиве, в папке C:\Libs\SDL-1.2.15\lib, лежат библиотеки, в папке C:\Libs\SDL-1.2.15\include лежат заголовочные файлы. В частности посмотрите есть ли в папке include файл SDL.h, а в папке lib\x86 файл SDL.lib и SDLmain.lib.

  2. Следующим шагом необходимо запустить и настроить Visual Studio 2008. Создаем новый пустой проект (Empty project). Необходимо добавить в проект новый исходный файл main.cpp. 
     
  3. Далее нам нужно показать нашему проекту где искать SDL заголовочные файлы и библиотеки. Идем в меню Project > Properties.

  4. В настройках ищем ветку Configuration Properties > C\C++ > General. В поле Additional Include Directories пишем путь до заголовочных файлов SDL (C:\Libs\SDL-1.2.15\include).


    В настройках ищем ветку Configuration Properties > Linker > General. В поле Additional Library Directories пишем путь до библиотеки SDL (C:\Libs\SDL-1.2.15\lib\x86).


    Последним необходимо в ветку Configuration Properties > Linker > Input. В поле Additional Dependencies добавим названия файлов SDL.lib и SDLmain.lib

  1. Далее нужно добавить исходный код из моего поста Прикручиваем SDL к Visual Studio 2008

  2. Если запущенное приложение выдает следующие сообщение: 


    то необходимо скопировать SDL.dll в папку с исполняемым файлом проекта. У меня это: c:\Projects\sdl\sdl_project1\Debug\

понедельник, 20 августа 2012 г.

Подключаем сканер Mustek 1248UB к компьютеру с Windows 7 32 bit


Первым делом необходимо скачать сам драйвер.
Здесь прямая ссылка на драйвер.

Распакуем его в любое удобное для себя место с помощью программы WinRAR или 7ZIP. У вас должен появится установочный файл Setup.exe. Запускаем этот файл. Ждем окончания установки. Перезагружаем компьютер. После перезагрузки нужно подключить USB кабель к компьютеру. На этом этапе, как написано во всех постах, которые мне пришлось найти в интернете, сканер должен подхватится семеркой и должно наступить счастье. Но я, почему-то, не вошел в число этих счастливчиков. Данный сканер автоматически не подхватил драйвера, которые я установил. Пробуем вручную указать папку куда установщик разместил файлы (C:\Program Files\Mustek 1248UB\Drivers\), но нет, устройство не подхватывается. Если посмотреть на процесс установки, то можно заметить, что установщик записывает что-то в C:\Windows\Temp\. Как мне удалось узнать это две папки WinXP и WinXP 64bit. Пробуем указать, в ручную, папку WinXP в свойствах драйвера устройства. На этот раз сканер подхватился и опознан семеркой.

Установка драйвера вручную:

1. Если кратко, то открываете Диспетчер устройств,
в Windows 7 по поиску в меню пуск, в Windows 8.1/10 нажмите сочетания клавиш Win + X и выбираете "Диспетчер устройств".

2. Находите в списке устройство Сканер Mustek 1248UB с восклицательным знаком или "Неизвестное устройство", жмете по нему правой кнопкой мыши и выбираете "Обновить драйвер..."

3. Нажимаете кнопку "Выполнить поиск драйверов на этом компьютере"

4. Нажимаете кнопку "Выбрать драйвер из списка уже установленных"

5. Указываете расположение файлов с расширением .inf в папку с драйверами сканера Mustek 1248 UB C:/Windows/Temp/WinXP64 для Windows 7/8.1/10 32 bit и C:/Windows/Temp/WinXP для Windows 7/8.1/10 64 bit.

6. Нажимаем кнопку ОК и устанавливаем драйвер вручную.

четверг, 12 июля 2012 г.

Как подружить Canon LBP-1120 и Office 2010?


Данная проблема проявляет себя на операционной системе Windows Xp Sp3 и у обладателей принтеров Canon LBP-1120, LBP-800 (Может и с другими моделями Canon). Скажем у вас дошли руки обновить Office 2003 или Office 2007 на новый Office 2010 (офис) и после обновления вы попытались распечатать, из офиса, на вышеуказанный принтер, документ и получили сообщение о закрытие документа с восстановлением имеющейся информации. Так же печать из Adobe Reader может сопровождаться сообщением о закрытие PDF-файла. Первым же решением может прейти переустановка драйверов принтера на новые драйвера с сайта производителя. Но нет, не помогает. Не буду вас мучить, и скажу, что разработчики Canon о нас подумали, и выпустили файл-заплатку, которая устраняет данную проблемку. Кто страдает данным недугом, на сайт Canon по этой ссылке:
Качаем, ставим, радуемся жизни.
Все идеи взяты с нижеуказанных сайтов.

Проблема с принтером HP DeskJet 1280

Как-то столкнулся с проблемой в принтере HP DeskJet 1280, которая заключалась в том, что принтер отказывался печатать, выдавая пустую страницу из любого приложения, с которого была необходимость вывести документ на печать. Так вот, данная проблема не решалась даже переустановкой на свежую версию драйверов. Все это наблюдалось под управлением Windows XP на разных персональных компьютерах, на которых тестировался принтер. В Интернете наткнулся на ветку форума, в которой обсуждалась данная проблема. Причина по которой принтер ведет себя так, является загрязнившийся датчик определения краев бумаги, он находится на движущейся подложке, где устанавливаются картриджи, справой стороны. Что можно попробовать сделать в этом случае:

- Почистить (протереть) загрязненный датчик.

- Установить драйвера от принтера HP DeskJet 1220. Принтеры схожи между собой, в принтер HP DeskJet 1220 нет датчика определения краев бумаги.

Данные решения взяты http://ddriver.ru/kms_forumd+topic+forum-15+ids-2246.html

Удаление Office 2007 не через панель управления


В том случае если переустановка накатом или удаление через панель управления не работает. Можно воспользоваться двумя способами:

- Использовать специальную утилиту FixIt для конкретно установленного у Вас офисного пакета, поддерживаются пакеты 2003, 2007, 2010. Скачать их можно по следующему ссылке:


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

Установка Ogre3D в Ubuntu 10.04.

В этом посте мне бы хотелось рассказать как установить Ogre3D в Ubuntu. Ставить будем из исходных кодов. На момент написания поста на сайте Ogre, для скачивания, доступна версия 1.7.4. Скачать можно по этой ссылке http://www.ogre3d.org/download/source. Скаченный архив необходимо распаковать в любое удобное место, например ./src/ogre_src_v1-7-4/.
Для сборки исходников необходимо использовать Cmake. Установить его можно следующей командой в терминале:

sudo apt-get install cmake-gui

Узнать версию только что установленной системы cmake можно командой в терминале:
$ cmake - - version
Теперь нам необходимо установить все зависимые библиотеки для сборки Ogre.

sudo apt-get install libfreetype6-dev libboost-date-time-dev \
libboost-thread-dev nvidia-cg-toolkit libfreeimage-dev \
zlib1g-dev libzzip-dev libois-dev libcppunit-dev doxygen \
libxt-dev libxaw7-dev libxxf86vm-dev libxrandr-dev libglu-dev

Так, все готово для сборки. Запустите cmake-gui, с помощью данной программы мы укажем настройки конфигурации для сборки Ogre.


В поле 'Where is the source code' укажите путь к исходникам Ogre3d, у меня этот путь ./src/ogre_src_v1-7-4/. В поле 'Where to build the binaries' укажите путь куда будет собиратся Ogre, у меня этот путь ./src/ogre_bin/. Далее нажимаем Configure.
В диалоге выбора генератора установите 'Unix Makefiles' и нажмите Finish. Выберите нужные вам опции сборки, нажмите Configure потом Generate.
Далее переходим, в терминале, в каталог ogre_bin и выполняем команду make. Запустится процесс сборки. После этого, в этом же каталоге, выполняем make doc.


Окончательно установить Ogre, выполните команду sudo make install. Установка произойдет в каталог /usr/local/.

После этого идем по следующему пути /usr/local/bin/ и запускаем SampleBrowser. Мы увидим следующие окно.


На этом все.

Установка Ogre3D в Windows Vista.

В данном уроке мне бы хотелось описать компиляцию примеров поставляемых вместе с Ogre3D SDK, создание простого приложения с использованием данного движка. Также опишу решение проблем возникших в процессе сборки примеров.
Для начала необходимо скачать Ogre3D SDK под одну из сред компиляции представленные на официальном сайте проекта на ваш выбор. Идём на сайт Ogre3D в раздел Download http://www.ogre3d.org/download/sdk. Т.к. на компьютере установлена MS Visual Studio 2008 (среда) мне необходимо скачать для этой версии среды разработки соответствующую версию Ogre SDK 1.7.2 для Visual C++ .Net 2008 (далее просто Ogre).
Скаченный самораспаковывающийся архив установим в любое для вас удобное место на жестком диске, но желательно с коротким путём и названием каталога латинскими буквами. Я распаковал архив по следующему пути C:\Libs\OgreSDK_vc9_v1-7-2\.
Также для успешной компиляции примеров поставляемых вместе с OgreSDK необходимо скачать и установить СМаке. У меня используется версия CMake 2.8.4 и установлен по пути: C:\Program Files\CMake 2.8\.
Теперь взглянем на содержимое каталога с Ogre:

Все примеры лежат в каталоге Samples, а файл который объединяет все примеры в одном решение называется OGRE.sln. Вот этот файл и необходимо открыть в MS Visual Studio 2008.
После этого в обозревателе решений нашей среды будет отображено одно решение (OGRE) объединяющее в себе 34 проекта, т.е. сами примеры и браузер примеров (программа просмотра примеров).

Следующим нашим шагом будет сборка всех примеров. Для этого щелкаем правой кнопкой на решение с именем OGRE и выбираем Build Solution.
Если в процессе сборки появилось сообщение об ошибке линковщика (Project : error PRJ0019: A tool returned an error code from "Performing Pre-Link Event...") при сборке проекта SampleBrowser, то необходимо щелкнуть правой кнопкой на проекте SampleBrowser выбрать Properties (Свойства). В открывшемся окне выбираем Configuration Properties -> Build Events -> Pre-Link Event. Посмотрите правильно ли указано значение пути к CMake в свойстве Command Line. У меня прописано следующие:
"C:\Program Files\CMake 2.8\bin\cmake.exe" -E make_directory ../../lib/Debug
if errorlevel 1 goto VCReportError
Когда сборка всех примеров выполнено успешно перейдем в каталог bin\debug и найдем файл с именем SampleBrowser_d.exe. После запуска данного файла на дисплее вы увидите приложение OGRE Sample Browser позволяющие выбрать один из примеров и запустить его демонстрацию.
Если SampleBrowser_d.exe не запускается и выдается сообщение о том, что не найдена библиотека d3dx9_42.dll, то вам необходимо выполнить обновление DirectX SDK, последние обновления которого можно скачать в центре загрузок от microsoft.

В следующем посте мы попробуем создать простое приложение в Ogre.

Workout v.1.0.0



Workout – это программа выключит ваш компьютер в назначенное время и сообщит об этом за указанные минуты. Операционная система: Windows XP.

Скачать программу

Функция GetSystemMetrics

Я не люблю много времени тратить на поиски информации о какой либо функции. Это конечно же может задеть вас как человека в этом плане ответственного, делающего все до победного конца.
По этому я буду разбирать данную функцию методом тыка, т.е. попробовал применить, посмотрел результат.
Первым делом поискать описание данной функции в help файле Delphi 7. Открываем строку поиска, вводим GetSystemMetrics и ожидаем в предвкушение результата. Ну что, есть что нибудь? У меня есть, возможно у вас тоже что-то найдется. Видим что все написано на английском, если у вас на русском, то вы первый обладатель справки по Delphi 7 на русском языке. Попробуем понять и прочесть то, что до нас хотели довести по этой функции составители документации. Ни чего не понятно? Загоним это в Google Translator.

Стало чуть проще. Данная функция получает метрики и конфигурационные настройки системы. Слово метрики не совсем понятно, возможно имеют в виду размеры. Переведем следующую строчку.
Получает ширину и высоту элементов экрана Windows. Все возвращает в пикселях. Так, может на примерах попонятней будет.
int GetSystemMetrics(
  int nIndex // Указываются параметр того, что мы хотим получить
);


syntax highlighted by Code2HTML, v. 0.9.1
Что мы можем из этого заключить? Функция в качестве аргумента передается параметр того что мы хотим получить (Например размеры экрана по x или у, количество кнопок у мыши и т.д.) результатом функция возвратит нам эти значения. Если функция завершится с ошибкой, она вернет ноль.
Так, ну что продолжим изучение на примере.
Предполагается что вы знакомы со средой Delphi 7 и легко сможете разобраться куда писать соответствущий код для достижения нужного нам результата. Попробую расписать подробно, но могу забыть что-нибудь.
Создадим новый VCL проект File -> New -> VCL Forms Applicatio - Delphi for Win32
Сохраним проект под любым удобным для вас именем File -> Save Project As.. И имя тебе будет ex_p1, модуль формы назовем ex_p1_unit.
С именем определились, теперь необходимо решить что выводить на нашу форму. Для на нашего примера вполне достаточно вывести размеры экрана и количество кнопок мыши. Остальные параметры вы можете вывести самостоятельно.
Для это нам потребуется четыре Label, и одна кнопка закрытия окна. Четыре Label мы расположим на одной панели с включенным свойством Align := alClient, кнопку мы расположим на второй панели с включенным Align := alBottom. Это кнопка типа TBitBtn c установленным свойством Kind := bkClose. У нашей формы Form1 меняем одно свойство BorderStyle := bsDialog.
У вас должно получиться что-то в этом духе:

Переходим к реализации кода.
Начнем с обработчика событий OnCreate. В этом обработчике, в основном, и будут производится все страшные манипуляции с функцией GetSystemMetrics.
Заведем три переменных для хранения результата возвращаемого функцией GetSystemMetrics:
  • для количества кнопок мыши (MouseButtonCount)
  • для количества пикселей экрана по x (XScreenResolution)
  • для количества пикселей экрана по y (YScreenResolution)
Параметры которые мы должный передать в GetSystemMetrics следующие:
  • для количества кнопок мыши (SM_CMOUSEBUTTONS)
  • для количества пикселей экрана по x (SM_CXSCREEN)
  • для количества пикселей экрана по y (SM_CYSCREEN)

procedure TForm1.FormCreate(Sender: Tobject);
var
  MouseButtonCount: Integer;
  XScreenResolution: Integer;
  YScreenResolution: Integer;
begin
  MouseButtonCount := GetSystemMetrics( SM_CMOUSEBUTTONS);
  XScreenResolution := GetSystemMetrics(SM_CXSCREEN);
  YScreenResolution := GetSystemMetrics(SM_CYSCREEN);
  Label4.Caption := IntToStr(MouseButtonCount);
  Label2.Caption := IntToStr(XScreenResolution) + ' X ' + IntToStr(YScreenResolution);
end;


syntax highlighted by Code2HTML, v. 0.9.1

На этом примере можно посмотреть и другие параметры.

Смена курсора в Ubuntu 10.04.2

Не знаю как в KDE, но как-то была необходимость сменить вид курсора в Gnome 2. По-определению, в gnome, вид курсора меняется в пункте меню System(Система)->Preferences(Настройки)->Appearance(Внешний вид). Далее в выбранной теме нажимаем кнопку Customize(Настроить), выбираем вкладку Pointer(Указатель), выбираем понравившийся курсор и применяем все изменения. По идеи курсор должен сменится сразу, но этого не произошло, у меня в частности. Даже после перезапуска иксов и перезагрузки компьютера ничего не изменилось, курсор какой был изначально, такой и остался. Не знаю в чем причина, но, по-гуглив не много, мне встретилось альтернативное решение, которое помогло сменить вид курсора. В терминале пишем следующую команду:

sudo update-alternatives --config x-cursor-theme

Результатом выполнения команды будет список всех указателей. Из этого списка вводим номер указателя, который мы хотим использовать по-умолчанию. Вот и все. Если курсор после этого не изменился, попробуйте перезапустить иксы.

Данное решение было взято с этой ветки форума, также на нем можно поискать ответы на часто задаваемые вопросы по ОС Ubuntu.

Shutdown them all v.1.0.2


Shutdown them all v.1.0.2 — это программа, которая загружается вместе с Windows, располагаясь в системном трее, она позволяет иметь быстрый доступ к функциям выключения и перезагрузки вашего компьютера. Протестировано в Windows XP. В данной версии исправлена функциональная недоработка.

Проблема с кодировкой в Adobe Reader, распечатка иероглифами

Самым грубым вариантом решение данной проблемы, мне видится только в переустановки операционной системы Windows XP. Если вас не устраивает такой исход, можно попробовать придумать несколько костылей. В данном посте я представлю три из них, один из которых был проверен собственноручно.
  • Можно попробовать альтернативную программу чтения PDF формата, например Foxit Reader
Если принципиально не хотите отказываться от любимого Adobe Reader, то
  •  В данной программе поищите в диалоге печати, кнопку «Дополнительно», поставте галочку «Печатать как изображение» или что-то в этом роде, от версии к версии свои названия. Этот вариант опробован и он помог решить проблему с иероглифами.
Еще один вариант решение проблемы, это

Все идеи взяты с форума avsim.su

Простая заставка Color Changer на Delphi для Windows XP

Весь пример представленной заставки основан на фрагментах кода позаимствованных из сборника статей Dephi World 6. Наша заставка не будет иметь ни какого окна конфигурации и красивого графического эффекта, она просто будет менять заливку формы каждую секунду. Какие определенные требования должна иметь программа, по моиму мнению, чтобы её можно назвать заставкой?
  • В один и тот же момент должна быть запущина только одна копия
  • По реакции на движение мыши или нажатия клавиши прерывать свою работу
Начнем с того что, нам необходимо создать проект, идем в File > New > VCL Forms ApplicationDelphi. Сохраним проект под именем ScreenProject, а имя модуля Screen. Далее нам необходимо изменить свойства формы.

BorderIcons []
  biSystemMenu False
  biMinimize False
  biMaximize False
BorderStyle bsNone
Color clBlack
FormStyle fsStayOnTop
Name ScrnFrm
Visible False

Расположите на форме таймер и выстановите следующие значения свойств.

Enabled = False
OnTimer = tmrTickTimer
Left = 199
Top = 122

Напишим код, который будет выполнятся по наступлению события OnTimer.


procedure TScrnFrm.tmrTickTimer(Sender: TObject);
var
  ClrCh: TColor;
  R, G, B: Byte;
begin
  R := Random($FF);
  G := Random($FF);
  B := Random($FF);

  ClrCh := RGBToColor(R, G, B);
  ScrnFrm.Color := ClrCh;
end;


syntax highlighted by Code2HTML, v. 0.9.1

Данная процедура случайным образом получает значение красного, зеленого, синего от 0 – FF. Эти значения в совокупности и образуют цвет, которым закрашивается форма.
Деактивацией работы хранителя экрана будет отвечать следующая процедура, которая завершит работу программы по нажатию любой клавиши или по перемещению курсора мыши.


procedure TScrnFrm.DeactivateScrnSaver(var Msg: TMsg; var Handled: Boolean);
var
  done: boolean;
begin
  if Msg.message = WM_MOUSEMOVE then
   done := (Abs(LOWORD(Msg.lParam)-crs.X) > 5) or
   (Abs(HIWORD(Msg.lParam)-crs.Y) > 5)
  else
   done := (Msg.message = WM_KEYDOWN) or (Msg.message = WM_ACTIVATE) or
   (Msg.message = WM_ACTIVATEAPP) or (Msg.message = WM_NCACTIVATE);
  if done then
   Close;
end;


syntax highlighted by Code2HTML, v. 0.9.1

Данная процедура закрывает форму, если происходит перемещение курсора более чем на 5 пикселей по X или более чем на 5 пикселей по Y.
Так же создадим четыре события OnCreate, OnActivate, OnShow, OnHide для формы.


procedure TScrnFrm.FormCreate(Sender: TObject);
var
  hMutex: THandle;
begin
  hMutex := CreateMutex(0, true, 'ScrnFrm');
  if GetLastError = ERROR_ALREADY_EXISTS then
  begin
   CloseHandle(hMutex);
   Application.Terminate;
  end;
end;


syntax highlighted by Code2HTML, v. 0.9.1

При создание формы создается мьютекс и осуществляется проверка запущенна ли форма повторно, если запущенна, то приложение завершается.


procedure TScrnFrm.FormActivate(Sender: TObject);
begin
  WindowState := wsMaximized;
end;


syntax highlighted by Code2HTML, v. 0.9.1

При активации форма разварачивается на весь экран.


procedure TScrnFrm.FormHide(Sender: TObject);
begin
  Application.OnMessage := nil;
  tmrTick.Enabled := false;
  ShowCursor(true);
end;


syntax highlighted by Code2HTML, v. 0.9.1

Если форма исчезает, то прием сообщение прекращается, таймер отключается, отображается курсор.


procedure TScrnFrm.FormShow(Sender: TObject);
begin
  GetCursorPos(crs);
  tmrTick.Interval := 1000;
  tmrTick.Enabled := true;
  Application.OnMessage := DeactivateScrnSaver;
  ShowCursor(false);
end;


syntax highlighted by Code2HTML, v. 0.9.1

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

Ну, вот и все, нам осталось только собрать проект, переименовать бинарный файл в файл с расширением *.scr, скапировать файл в системную папку Windows XP.


Приложение А. Код проекта хранителя экрана Color Changer


{ Модуль Screen.pas }

unit Screen;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls;

type
  TScrnFrm = class(TForm)
  tmrTick: TTimer;
  procedure FormCreate(Sender: TObject);
  procedure tmrTickTimer(Sender: TObject);
  procedure FormActivate(Sender: TObject);
  procedure FormHide(Sender: TObject);
  procedure FormShow(Sender: TObject);
  private
  { Private declarations }

  procedure DeactivateScrnSaver(var Msg: TMsg; var Handled: boolean);
  function RGBToColor(R, G, B: Byte): TColor;
  public
  { Public declarations }

end;

var
  ScrnFrm: TScrnFrm;
  crs: TPoint;

implementation

{$R *.dfm}
procedure TScrnFrm.DeactivateScrnSaver(var Msg: TMsg; var Handled: Boolean);
var
  done: boolean;
begin
  if Msg.message = WM_MOUSEMOVE then
   done := (Abs(LOWORD(Msg.lParam)-crs.X) > 5) or
   (Abs(HIWORD(Msg.lParam)-crs.Y) > 5)
  else
   done := (Msg.message = WM_KEYDOWN) or (Msg.message = WM_ACTIVATE) or
   (Msg.message = WM_ACTIVATEAPP) or (Msg.message = WM_NCACTIVATE);
  if done then
   Close;
end;

procedure TScrnFrm.FormActivate(Sender: TObject);
begin
  WindowState := wsMaximized;
end;

procedure TScrnFrm.FormCreate(Sender: TObject);
var
  hMutex: THandle;
begin
  hMutex := CreateMutex(0, true, 'ScrnFrm');
  if GetLastError = ERROR_ALREADY_EXISTS then
  begin
   CloseHandle(hMutex);
   Application.Terminate;
  end;
end;

procedure TScrnFrm.FormHide(Sender: TObject);
begin
  Application.OnMessage := nil;
  tmrTick.Enabled := false;
  ShowCursor(true);
end;

procedure TScrnFrm.FormShow(Sender: TObject);
begin
  GetCursorPos(crs);
  tmrTick.Interval := 1000;
  tmrTick.Enabled := true;
  Application.OnMessage := DeactivateScrnSaver;
  ShowCursor(false);
end;

function TScrnFrm.RGBToColor(R, G, B: Byte): TColor;
begin
  Result := B shl 16 or G shl 8 or R;
end;

procedure TScrnFrm.tmrTickTimer(Sender: TObject);
var
  ClrCh: TColor;
  R, G, B: Byte;
begin
  R := Random($FF);
  G := Random($FF);
  B := Random($FF);

  ClrCh := RGBToColor(R, G, B);
  ScrnFrm.Color := ClrCh;
end;

end.


{Модуль проекта  ScreenProject.dpr }

program ScreenProject;

uses
Forms, SysUtils,
Screen in 'Screen.pas' {ScrnFrm};

{$R *.res}
{$D SCRNSAVE Color Changer Screen Saver}

begin
  Application.Initialize;
  if (ParamCount > 0) and (UpperCase(ParamStr(1)) = '/S') then
  begin
   Application.CreateForm(TScrnFrm, ScrnFrm);
  end
  else
  begin
   Application.CreateForm(TScrnFrm, ScrnFrm);
  end;
  Application.Run;
end.


syntax highlighted by Code2HTML, v. 0.9.1