Главная / FAQ по Builder'у / 36 Как можно сделать прогу...

36 Как можно сделать прогу, которую нельзя увидеть в списке задач при нажатии Ctrl+Alt+Del, которая не реагирует на нажатие клавиш Alt+F4, Ctrl+Break, и.т.д.?


// ======================== для WIN98/WINME ==========================
/*Я делаю так:
1 - главная форма /StayOnTop/
2 - Background форма
/Windowstate=wsMaximized/BorderStyle=bsNone/BorerIcons - все в
false/FormStyle=fsNormal/переменная CanDelete для управления закрытием в
OnCloseQuery

При активации включается режим скринсейвера и рабочий стол накрывается
формой без заголовка - это блокирует Alt-Tab, Ctrl-Alt-Del
Alt-F4 - блокируй в OnCloseQuery*/

// убрать программу из списка задач - регистрируем ее как процесс
void __fastcall TFMainForm::FormCreate(TObject *Sender)
{
    // Убрать процесс из панели задач Windows
    typedef int (__stdcall *RegisterServiceProcess) (int , int);
    HANDLE hkernel32;
    RegisterServiceProcess rgProcess;
    hkernel32 = GetModuleHandle("kernel32.dll");
    rgProcess = (RegisterServiceProcess)GetProcAddress(hkernel32,"RegisterServiceProcess");
    rgProcess(GetCurrentProcessId(), 1);
}
// проверка перед закрытием
void __fastcall TFMainForm::FormCloseQuery(TObject *Sender, bool &CanClose)
{
    // Проверка пароля перед выходом
    TFPass *pass = new TFPass(this);
    pass->PassText = "";
    if (pass->ShowModal() == mrOk)
        if (pass->PassText == "my password")
            CanClose = true;
        else
        {
            MessageDlg("password error", mtError, TMsgDlgButtons() << mbOK,0);
            CanClose = false;
        }
    else
        CanClose = false;
}

// для включения режима защиты:
void __fastcall TFMainForm::EnableAccess()
{
    // Удалить бэкгроунд форму
    if (Form6)
    {
        Form6->CanDelete = false;
        delete Form6;
        Form6 = NULL;
    }
    // выключить режим эмуляции скринсейвера
    SystemParametersInfo (SPI_SCREENSAVERRUNNING,0,&OLDSysPrm,0);
}
// для выключения режима защиты:
void __fastcall TFMainForm::DisableAccess()
{
    // режим скринсейвера
    SystemParametersInfo (SPI_SCREENSAVERRUNNING,1,&OLDSysPrm,0);

    // Background form
    if (!Form6)
    {
        Form6 = new TForm6(Application);
        Form6->CanDelete = false;
        Form6->Show();
    }
}
Сергей Дворянцев

Предыдущий вопрос   |  Список вопросов   |   Следующий вопрос

источник      На главную      by jenyok
Copyright © 2003 JTSOFT
Сайт управляется системой uCoz