[win32] Как сделать, чтобы приложение не закрывалось?

korol41

которая при попытке закрыть определённое приложение выдаёт pop-up "Вы не можете закрыть это окно"?

Bird_V

Вроде не очень сложно. Есть 2 метода
1) Поставить ловушку (hook) на WM_CLOSE, и смотреть, какое окно хотят закрыть;
2) Попробовать "подменить" WinMain(...).

korol41

А как эти методы реализовать?
Что (и много ли) нужно поботать, чтобы написать такую прогу "с нуля"?

tiva

c hookом не сложно. читай SDK

yolki

от таскменеджера всё равно не спасёт

tiva

можно написать свою прогу, которая таскменеджером не закроется. будет писать отказано в доступе

IvladV71

чё, и тасккилл не убьёт?

Dasar

> от таскменеджера всё равно не спасёт
Повесить в память несколько как можно разных копий, и перезапускать убитые.

evgen5555

У таскменеджера есть замечательная кнопка ДЕБУГ...

Dasar

Debug - от watch dog-а, конечно,не поможет.
Но вот от отказано в доступе помогает.

evgen5555

А что, процесс, который дебажится, считается убитым?

Dasar

Хитрость в том, что права нужны разные.
Для убития напрямую нужны одни права, а для debug-а - другие, причем если ты уже в отладке, то для завершения процесса никаких прав уже не надо.

korol41

Честно говоря, я вообще хз что такое SDK и где его читать
У меня есть Microsoft Visual C++ 6 (MFC, все дела) и книжка Г. Шилдт "MFC: основы программирования" 1997 года издания. Этого достаточно? И что-то про hook-и я не могу в сети найти ботву, можете ссылочку дать?

korol41

Это уже не важно, цель - не запретить закрывать приложение вообще, а от случайного нажатия Х.

okunek

урл

Dasar

Задисейбли, или, вообще убери кнопку закрытия окна.

korol41

Спасибо, посмотрю

korol41

А это как сделать?

evgen5555

FindWindow + EnableWindow
или ещо
SetWindowStyle

Dasar

Можно разными способами:
1. Через SetWindowRgn "отпилить" кнопку x - нафиг
2. Манипулируя стилями окна WS_xxx убрать всю верхнюю байда, включая заголок окна

Flack_bfsp

А от случайного Atl-F4 это спасает?

maggi14

Вообще, от случайного нажатия х спасает перегрузка OnClose

vijrel7878

перекрой wm_close

tiva

Кому интересно - разбирайтсь. Эта процедура делает свою прогу неубиваемой в таскмэне. Но если захотеть, то убить можно.
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;

Elina74

лучше все же использовать тег [коде]...

Flack_bfsp

Эта процедура делает свою прогу неубиваемой в таскмэне
Вопрос был, кажется, не таким.
Оставить комментарий
Имя или ник:
Комментарий: