[win32] Как сделать, чтобы приложение не закрывалось?
1) Поставить ловушку (hook) на WM_CLOSE, и смотреть, какое окно хотят закрыть;
2) Попробовать "подменить" WinMain(...).
Что (и много ли) нужно поботать, чтобы написать такую прогу "с нуля"?
c hookом не сложно. читай SDK
от таскменеджера всё равно не спасёт
можно написать свою прогу, которая таскменеджером не закроется. будет писать отказано в доступе
чё, и тасккилл не убьёт?
Повесить в память несколько как можно разных копий, и перезапускать убитые.
У таскменеджера есть замечательная кнопка ДЕБУГ...
Но вот от отказано в доступе помогает.
А что, процесс, который дебажится, считается убитым?
Для убития напрямую нужны одни права, а для debug-а - другие, причем если ты уже в отладке, то для завершения процесса никаких прав уже не надо.
У меня есть Microsoft Visual C++ 6 (MFC, все дела) и книжка Г. Шилдт "MFC: основы программирования" 1997 года издания. Этого достаточно? И что-то про hook-и я не могу в сети найти ботву, можете ссылочку дать?
Это уже не важно, цель - не запретить закрывать приложение вообще, а от случайного нажатия Х.
Задисейбли, или, вообще убери кнопку закрытия окна.
Спасибо, посмотрю
А это как сделать?
или ещо
SetWindowStyle
1. Через SetWindowRgn "отпилить" кнопку x - нафиг
2. Манипулируя стилями окна WS_xxx убрать всю верхнюю байда, включая заголок окна
А от случайного Atl-F4 это спасает?
Вообще, от случайного нажатия х спасает перегрузка OnClose
перекрой wm_close
Delphi:
procedure AdjustPrivileges;
var
ii: Byte;
Dummy: Integer;
LPUID: TLargeInteger;
OldBuf, NewBuf: Array[0..2047] Of Byte;
OldPriv: TTokenPrivileges absolute OldBuf;
NewPriv: TTokenPrivileges absolute NewBuf;
ProcToken: DWORD;
OSInfo: TOSVersionInfo;
SD: PSecurityDescriptor;
MyACL: PACL;
label
PrivExists;
const
cbACL = 1024;
SecurityInfo: DWORD = DACL_SECURITY_INFORMATION;
begin
FillChar(OSInfo, SizeOf(OSInfo 0);
OSInfo.dwOSVersionInfoSize:= SizeOf(OSInfo);
GetVersionEx(OSInfo);
If OSInfo.dwPlatformId >= VER_PLATFORM_WIN32_NT Then begin
OpenProcessToken(GetCurrentProcess,
TOKEN_ALL_ACCESS, ProcToken);
GetTokenInformation(ProcToken, TokenPrivileges,
@NewPriv, 2048, Dummy);
LookupPrivilegeValue('', 'SeShutdownPrivilege', LPUID);
For ii:= 0 To Pred(NewPriv.PrivilegeCount) Do
If (NewPriv.Privileges[ii].LUID.QuadPart = LPUID.QuadPart)
Then begin
NewPriv.Privileges[ii].Attributes:= SE_PRIVILEGE_ENABLED;
GoTo PrivExists;
End;
Inc(NewPriv.PrivilegeCount);
NewPriv.Privileges[Pred(NewPriv.PrivilegeCount)].LUID:= LPUID;
NewPriv.Privileges[Pred(NewPriv.PrivilegeCount)].Attributes:=
SE_PRIVILEGE_ENABLED;
PrivExists:
AdjustTokenPrivileges(ProcToken, False, NewPriv,
2048, OldPriv, Dummy);
GetMem(SD, SECURITY_DESCRIPTOR_MIN_LENGTH);
try
InitializeSecurityDescriptor(SD, 1);
GetMem(MyACL, cbACL);
try
InitializeACL(MyACL^, cbACL, 2);
SetSecurityDescriptorDACL(SD, TRUE, MyACL, FALSE);
SetUserObjectSecurity(GetCurrentProcess,
SecurityInfo, SD);
finally
FreeMem(MyACL, cbACL);
end;
finally
FreeMem(SD);
end;
end;
end;
лучше все же использовать тег [коде]...
Эта процедура делает свою прогу неубиваемой в таскмэнеВопрос был, кажется, не таким.
Оставить комментарий
korol41
которая при попытке закрыть определённое приложение выдаёт pop-up "Вы не можете закрыть это окно"?