Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Отключить закрытие программы.


Автор: Oberon83 10.6.2005, 18:40
Каким образом можно сделать так, чтобы моя программа не закрывалась по сочетанию Alt+F4. Работаю в C++ Builder 6.
Следующий код не работает(хотя должен):
Код
 
//В обpаботчике FormKeyDown пишешь:
if (Shift.Contains(ssAlt)&&Key==VK_F4) Tag=1;

//В обpаботчике FormCloseQuery:
if(Tag)
{
CanClose=false;
Tag=0;
}

Никак не могу понять почему. Система - WinXP
Так же не работает отключение кнопок Свернуть и Минимизировать:
Код

      HMENU MenuHandle = GetSystemMenu(Handle, false);
if(MenuHandle){
  DeleteMenu(MenuHandle, SC_MAXIMIZE, MF_BYCOMMAND);
  DeleteMenu(MenuHandle, SC_MINIMIZE, MF_BYCOMMAND);
  }

Тоже почему не знаю...

Автор: JoyEx 22.6.2005, 22:54
Попробуйте сделать обработчик сообщения WM_CLOSE.

Автор: Любитель 22.6.2005, 23:49
Можно свой хот-кей кинуть.

Автор: En_t_end 23.6.2005, 05:48
Oberon83
Вопрос задан не корректно.
Отключить закрытие программы невозможно, потому что система всегда оставляет за собой право шутдаунить любой процесс. Юзать блокировку Alt-F4 - это по ламерски, извиняюсь за выражение.
Цитата
Можно свой хот-кей кинуть.

А прикинь, у него открыто ещё пять прилаг, и ему вдруг захотелось закрыть какую-то другую прогу, но нет из-за этого хот-кея сообщение будет посылаться именно этой проге и остальное не закроется, тем самым чел ощутит дисскомфорт.
JoyEx
Более реальный совет, но винды тоже не тупые, если ты сделаешь там что-то типа goto, то система все равно аварийно вырубит прилагу через определенный промежуток времени, прямо по середине какой-то работы, но то есть специальный таймаут.

Автор: JoyEx 23.6.2005, 07:05
En_t_end

Если корректно, быстро обрабатывать WM_CLOSE от ALT+F4, то ВинниПух ничего плохого не сделает. Можно это делать примерно так на VC:
Код

void CHelloDlg::OnClose()
{
    if((GetKeyState(VK_MENU) >> 8) && (GetKeyState(VK_F4) >> 8)) return;

    CDialog::OnClose();
}


Главное, чтобы поток получивший WM_CLOSE от accelerators незамедлительно обработал это сообщение.

Можно еще глобально сделать: взять исходник .sys фильтра клавиатуры \WINDDK\.......\src\input\kbfiltr из DDK, добавить в него пару строк (запретить комбинации клавиш) и установить потом его в Windows. Только не просите меня сделать это за Вас сегодня.


Автор: codelord 26.6.2005, 21:37
А по моему все очень просто, берешь в параметре формы, если есть onClose, ставишь строку

Код

ShellExecute(Handle,NULL,ParamStr(0).c_str(),NULL,NULL,SW_RESTORE); 



Автор: Nemesis 30.6.2005, 11:39
В таком случае программа просто перезапустит себя.
Можно просто получив сообщение WM_CLOSE не передавать его системе, а заменить его скажем на WM_PRINT (портим окно и заставляем послать новое сообщение).

Автор: oper54 30.6.2005, 13:16
Не долго мучаясь smile
ВОТ -
Код

void __fastcall TForm1::FormCloseQuery(TObject *Sender, bool &CanClose)
{
 CanClose = false;
 return;
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)