Создаём в Builder'е новое приложение (File -> New Application). Начинаем с проектирования формы. Вот что у меня получилось:
Как видно из рисунка, степень зависания выбирается с помощью компонента класса TRadioGroup. На всякий случай, я добавил четвёртый вариант, если кто-то не захочет вешать свою систему. Для заполнения элементов списка обратитесь к его свойству Items. Чтобы выделить четвёртый пункт в списке, свойство ItemIndex устанавливаем в 3 (т. к. индексация начинается с нуля).
Осталось самое главное - написать обработчик нажатия на кнопку. Кликаем на ней два раза и пишем:
HANDLE hProcess; switch(RadioGroup1->ItemIndex) { case 0://Лёгкое зависание hProcess=OpenProcess(PROCESS_SET_INFORMATION,FALSE,GetCurrentProcessId()); if(hProcess==NULL) { L1->Caption="Error."; return; } if(SetPriorityClass(hProcess,HIGH_PRIORITY_CLASS)) while(true)UpdateWindow(GetDesktopWindow()); else L1->Caption="Error."; break; case 1://Среднее зависание hProcess=OpenProcess(PROCESS_SET_INFORMATION,FALSE,GetCurrentProcessId()); if(hProcess==NULL) { L1->Caption="Error."; return; } if(SetPriorityClass(hProcess,REALTIME_PRIORITY_CLASS)) while(true)--Tag; else L1->Caption="Error."; break; case 2://Крутое, так крутое! SystemParametersInfo(SPI_SETSCREENSAVERRUNNING,TRUE,NULL,0); asm { LABEL: cli jmp LABEL } //Никаких зависаний default:Close(); } |
В случае "крутого зависания" мы создаём для операционной системы иллюзию выполнения заставки,
чтобы отключить Ctrl+Alt+Del (вообще, это можно без проблем опустить). После этого помещаем в код ассемблерную вставку,
в которой постоянно выполняется инструкция отключения всех аппаратных прерываний, хотя её достаточно
выполнить однократно. После этого компьютер перестаёт реагировать на прерывания от всех устройств,
и остаётся только сделать холодный рестарт.
Если вы собираетесь тестировать работу программы - будьте осторожны: я не отвечаю за потерю данных при неудачном
завершении работы.