Як зробити, щоб форму не можна було закрити
Потрібно, щоб форму не можна було закрити, причому не стандартними способами (хрестик, Алт - Ф4), а й через диспетчер завдань. Так само щоб її не можна було згорнути, відкрити щось поверх і т.д. З простим закриттям я розібрався (OnCloseQuery), а ось з диспетчером і згортанням не знаю як: (У двох словах - треба, щоб користувач не зміг нічого зробити, поки не натисне кнопку на формі).
Яка зла програма у тебе має вийти! Дай вгадаю: по натисканні на цю кнопку - format c: .
- Встановити режим RealTime і сильніше вантажити процесор, щоб життя медом не здавалося. - Відловлювати вікно диспетчера в циклі і закривати його при виявленні. - Відключити монітор, щоб бідний користувач не зміг знайти твою програму в диспетчері, навіть якщо і відкриє його. - Відключити мишу, щоб він не міг ткнути по рядку з програмою в диспетчері.
Ну не така вже й зла. Я просто хочу написати додаткове залогінення після входу в вінду з деякою додатковою інформацією. Перше, що спало на думку - зробити форму на весь екран, і поки користувач не введе потрібну інфу далі його не пускати. Так що 1 та 2 останні пункти відпадають. З рештою порозбираюся. Хоча десь читав, що з диспетчера завдань процес можна просто приховати. Як? І ще зробити її Always on Top можна :)
Always on Top - не ного толку буде.
А приховати зовсім програму, звичайно, неможливо. Її можна прибрати з першої сторінки деспетчера, приховавши (Visible: = False) головну форму програми. А далі - так назвати процес, щоб бідний користувач думав, що він - системний.
> GrBob (31.03.06 00:48) [2] > > Ну не така вже й зла. Япросто хочу написати додаткове > залогінення після входу в вінду з деякою додатковою інформацією. > Перше, що спало на думку - зробити форму на весь екран, > і поки користувач не введе потрібну інфу далі його > пускати. Так що 1 та 2 останні пункти відпадають. З рештою > порозбираюся. Хоча десь читав, що з диспетчера завдань > процес можна просто приховати. Як? І ще зробити її Always > on Top можна :)
Дурнею є. Ні приховати не можна, ні AlwaysOnTop - теж не можна. Легким способом можна лише "зв'язати деталі дротом в надії, що користувач не взяв із собою кусачок". :-)
Робив я цю фігню свого часу. При завантаженні просто створюєш новий робочий стіл і на ньому робиш вікно і все. Користувач нічого не зможе зробити поки не введе пароль або че тама ще. Загалом для виходу з цього режиму треба знищити створений раб стіл, а диспетчер завдань на ньому не з'явиться. Ось і вся замута.
> Її можна прибрати з першої сторінки деспетчера, приховавши (Visible: > =False) головну форму програми.Ну це не вихід :) Тоді її і користувач не побачить, не тільки диспетчер : )> Робив я цю фігню свого часу. При завантаженні просто створюєш > новий робочий стіл і на ньому робиш своє вікно та все. Користувач > нічого не зможе зробити доки не введе пароль або че тама > ще. Загалом для виходу із цього режиму треба знищити > створений раб стіл, а диспетчер завдань на ньому не з'явиться. > Ось і вся замута.А ось це вже цікаво, дякую. Ніхто не підкаже посилання на статті з цього питання чи навіть ідею, в якому напрямку дивитися? Вікна я створював, але щоб новий робочий стіл, хммм. навіть не думав що це можливо:)
> GrBob(31.03.06 00:48) [2]> Ну не така вже й зла. Я просто хочу написати додаткове > залогінення після входу в вінду з деякою додатковою інформацією. >злиття це "залогіванювання" в 2 рахунки, тобто. раз дава ;-) Для цих цілей передбачені спец. засоби. див. в MSDN інфу по Winlogon and GINA. GINA функціонує в контексті Winlogon процесів і, як такий, GINA DLL loaded дуже early in the boot process. GINA DLL повинні стежити за правилами, що integrity системи є maintained, особливо з тим, щоб interaction with the user.
Найбільш загальний використання GINA є комунікацій з external device such as smart-card reader. Це є важливим для налаштування запуску параметра для drive driver до системи (Winnt.h: SERVICE_SYSTEM_START) для забезпечення того, що driver is loaded by the time the GINA is invoked.
Пристрій для GINA DLL є забезпечений customizable user identification and authentication procedures. Більшість GINA визнається, що загрожує SAS, щоб monitoring до Winlogon, які отримувати і процеси CTL+ALT+DEL сприяють чутливості до sequences (SASs). Як custom GINA є відповідальною для налаштування їїдозволяє отримувати SAS Events (інші, аніж CTRL+ALT+DEL SAS Event), і повідомити Winlogon при SAS events occur. Winlogon буде визначати його стан, який визначає, скільки потребує процесів GINA"s SAS. і т.д.
> Ніхто не підкаже посилання на статті з цього питання або > хоч би ідею, в якому напрямку дивитися?У цьому напрямку: http://msdn.microsoft.com/library/en-us/dllproc/base/window_stations_and_desktops.asp
Так, GINA - це, звичайно, самийправильний метод. Ось тільки писати її - заняття не для слабонервних :)
Дякую всім, тепер у мене роботи на місяць вперед :)
> Дякую всім, тепер у мене роботи на місяць вперед :) . Десктоп створити? півгодини. чи вирішив GINA переписати?
Є дуже простий спосіб при виключенні програми, вона включає сама себе. Та тільки є дірка її можна відключити через процеси
А як цю "прогу для логіну" запускати збираєшся? У користувача завжди є можливість зайти в SafeMode або після стандартного віндовського логіна Shift утримувати. Після чого спокійно прибрати твою прогу з автозавантаження. Так що, ІМХО, обмежити доступ у вінду крім як через policy навряд чи можна!
> Asail (31.03.06 23:17) [14]
> Так що, ІМХО, обмежити доступ у вінду крім як через > policy навряд чи можна!
А це що? Детальніше, будь ласка.
> А це що? Детальніше, будь ласка.
А це вже не до програмування, а до системного адміністрування відноситься. У XP, наприклад, запусти через Start->Run gpedit.msc . Там можна відключити багато чого. Приміром, зайди в User Configuration->Administrative Templates->System->Ctrl+Alt+Del Options і виставте параметр "Remove Task Manager" в Enabled. Після чого даний користувач вже не зможе запустити диспетчер завдань загалом. Навіть, якщо в Safe Mode зайде. Зазвичай, правда, policy задають з сервера для всіх користувачів і комп'ютерів в мережі. Так що це все трохи не по темі.
До того ж, чим не влаштовує стандартний логін вінди з паролями?
> Якщо знаєш як, може і пів години, але для мене це все нове, доведеться розбиратися.п'ять хв тягне. причому тобі я ще 10 хв накинув, на недосвідченість ;), просто прочитав вчора теж вперше, що ось так можна створити для програми десктоп, зацікавило, вирішив спробувати (такто воно мені не потрібне, а раз не потрібно те й не торкаєшся цього) мене вийшов робітничий приклад за 15-20 хв. (Накинув 10 і написав півгодини ;о))
насправді, нічого складного. Приклад запуску програми на "своєму" десктопі
функція MyThread(Parameter: Pointer): Integer; stdcall; var hdeskNew, hdeskOld: THandle; StInfo: TStartupInfo; PrInfo: TProcessInformation; begin hdeskNew:= CreateDesktop("MyDesktop", nil, nil, DF_ALLOWOTHERACCOUNTHOOK, MAXIMUM_ALLOWED, nil);
if hdeskNew <> 0 then begin hdeskOld:= GetThreadDesktop(GetCurrentThreadId()); SetThreadDesktop(hdeskNew); SwitchDesktop(hdeskNew); MessageBox(0, "Hello from "MyDesktop""!", "", MB_OK);
ZeroMemory(@StInfo, SizeOf(StInfo)); StInfo.cb:= SizeOf(StInfo); StInfo.lpDesktop:= PChar("MyDesktop"); StInfo.wShowWindow:= SW_SHOW;
if (CreateProcess(nil, "notepad.exe", nil, nil, False, 0, nil, nil, StInfo, PrInfo)) then begin WaitForSingleObject(PrInfo.hProcess, INFINITE); CloseHandle(PrInfo.hProcess); CloseHandle(PrInfo.hThread); end; SwitchDesktop(hdeskOld); SetThreadDesktop(hdeskOld); CloseDesktop(hdeskNew); end; result:= 0; end;
procedure TfrmPing.Button2Click(Sender: TObject); var ThreadId: DWORD; begin CreateThread(nil, 0, @MyThread, nil, 0, ThreadId); end;
Шановний топік стартер, те, що ви хочете зробити легко реалізується звичайним клавіатурним хуком про який ви знайдете багато мереж як в інтернеті так і на цьому сайті, але хочу попередити що виклик Alt+Ctrl+Del ви не зможете відловити, це вже"зверху" дядько бив прикрив від таких як ви :-) Можете навіть не намагатися, я сам особисто 2 місяці намагався і нічого не вийшло, де не шукав і т.д. п.с. Хоча хто знає ;-)
sniknik> в принципі, пошукати, можна і приклад реалізації знайти (на > так що клавіші CTL+ALT+DEL відловлюються системою на дуже низькому рівні, ще до того, як будь-яка програма зможе перехопити і оброблятися, а вже потім передається вашій програмі :-)
p.s. шукати теж треба вміти p.p.s. досі мало інформації/прикладів? або ще кілька місяців пошукати. ;)
>А як цю "прогу для логіна" запускати збираєшся? >У користувача завжди є можливість зайти в SafeMode або після стандартного віндовского логіна Shift утримувати. >Після чого спокійненько прибрати твою прогу з автозавантаження. >Так що, ІМХО, обмежити доступ у вінду окрім як через policy навряд-то можна!
А якщо її в реєстрі прописати до автозавантаження?
> А якщо її в реєстрі прописати в автозавантаження? А яка різниця? У SafeMode можна і з реєстру видалити або використовувати msconfig. Так що не має значення.
А вимикатимеш кнопкою Reset?
Ще раз всім дякую. Ви мені підкинули стільки інформації до роздумів, просто жах. Хоча завдяки тов. sniknik думаю піде все ж таки не місяць, але пара днів точно, за що йому окрема подяка :)
2 Delphi5.01: З хуками я якось одного разу працював, так там хуки прописувати доведеться більше, ніж сама робоча частина програми. Хоча все ж таки можливо і звернуся до них за допомогою, т.к. поки не знаю, що там ще знадобиться :)
2 Asail: а) Стандартний логін має деякі недоліки для моєїЗавдання, а саме мені потрібна при залогінуванні користувача ще й інша інформація, крім тієї, що зайшов саме він, а не хтось інший. б) Все що стосується системного адміністрування можна віднести і до програмування. Думаю, що цей параметр можна змінити і програмними засобами, але поки це не має значення.
2GrBobякщо чесно це одна з частин програмування в якій я не розуміюся, так і не вистачило тоді часу все розібрати. А на рахунок того, що хуки досить кодо об'ємні, то я з вами згоден, я просто взяв робочий приклад і переробив під себе, хоча даний матеріал об'ємний і вимагає великої уваги при вживанні.
А найбанальнішим рішенням буде: procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin Action := caNone; end; Якщо ви вирішите проблуму з тас менеджером, то даний варіант супер. До речі є алгоритм при якому запущено 2 програми і кожна підтримує один одного, типу якщо першу закрили, то миттєво запускається друга і навпаки. Багато вірусів саме так і роблять, єдиним рішенням є вбити процеси програмно :-) Одночасно :-)