|
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
|
|
|