Главная / FAQ по Builder'у / 18 Как сделать чтоб форма...

18 Как сделать чтоб форма не реагировала на нажатия: Alt+F4, Alt+Tab, Ctrl+Break, Ctrl+Alt+Del?


1-й способ

// ======================== для WIN98/WINME ==========================
Я делаю так:
1 - главная форма /StayOnTop/
2 - Background форма
/Windowstate=wsMaximized/BorderStyle=bsNone/BorderIcons - все в 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();
    }
}
Сергей Дворянцев 2:5020/400

2-й способ

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
  : TForm(Owner)
{
  //найдем панель задач
  HANDLE hTray = FindWindow("Shell_TrayWnd", NULL);
  int Dummy = 0;

  //вырубаем панель задач
  ShowWindow(hTray, SW_HIDE);
  //Отключаем ALT-TAB
  SystemParametersInfo(SPI_SETFASTTASKSWITCH, 1, &Dummy, 0);
  //Отключаем CTRL-ALT-DEL
  SystemParametersInfo(SPI_SCREENSAVERRUNNING, 1, &Dummy, 0);
}

//---------------------------------------------------------------------------
void __fastcall TForm1::FormCloseQuery(TObject *Sender, bool &CanClose)
{
  //Hас так просто не закроешь!
  CanClose = false;
}
PS1 В свойствах формы делаешь ее always on top
PS2 В процессе тестирования обнаружена фича - если на машине установлен WCat,
то все таки на 3 кнопки послать прогу можно :(. Хотя через
RegisterServiceProcess() можно сделать так, что ее в списке задач не будет :)
Sergey Kaluzhskiy 2:5055/89.27

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

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