Поскольку в других ответах упоминается, что вы хотите сделать, это трудно понять, так как цель модальной формы - отключить все формы ниже, поэтому в основном форму заявки можно считать самой модальной формой.
Хотя, если вы хотите сделать свое приложение единственным получателем фокуса на текущем рабочем столе Windows (возможно, не администраторском рабочем столе пользователя), вам необходимо:
- Скройте панель задач, сделав форму полноэкранной
- Блокируйте столько оконных клавиш, сколько вы можете себе позволить, учитывая доступность вашего приложения (Ctrl, Alt, F1-F12, Windows, Menu)
В новых версиях Windows вы можете делать все это как непривилегированный пользователь, кроме комбинации Ctrl + Alt + Del с использованием глобальных оконных перехватчиков.
uses
Windows;
var
hKeybaordHook: HHOOK = 0;
function KeyboardHook(nCode: Integer; wParam: WPARAM; lParam: LPARAM): HRESULT; stdcall;
type
PKBDLLHOOKSTRUCT = ^TKBDLLHOOKSTRUCT;
TKBDLLHOOKSTRUCT = packed record
vkCode: DWORD;
scanCode: DWORD;
flags: DWORD;
time: DWORD;
dwExtraInfo: DWORD;
end;
const
LLKHF_ALTDOWN = $20;
var
pkbhs: PKBDLLHOOKSTRUCT;
begin
pkbhs := PKBDLLHOOKSTRUCT(lParam);
if nCode = HC_ACTION then
begin
Result := 1;
// CTRL
if WordBool(GetAsyncKeyState(VK_CONTROL) and $8000) then Exit
// ALT
else if LongBool(pkbhs^.flags and LLKHF_ALTDOWN) then Exit
// WIN KEYS
else if (pkbhs^.vkCode = VK_LWIN) or (pkbhs^.vkCode = VK_RWIN) then Exit
// FUNCTION KEYS
else if bDisableFunctionKeys and (pkbhs^.vkCode >= VK_F1) and (pkbhs^.vkCode <= VK_F24) then Exit;
{
// Disabling specific combinations
// CTRL+ESC
else if (pkbhs^.vkCode = VK_ESCAPE) and WordBool(GetAsyncKeyState(VK_CONTROL) and $8000) then Exit
// ALT+TAB
else if (pkbhs^.vkCode = VK_TAB) and LongBool(pkbhs^.flags and LLKHF_ALTDOWN) then Exit
// ALT+ESC
else if (pkbhs^.vkCode = VK_ESCAPE) and LongBool(pkbhs^.flags and LLKHF_ALTDOWN) then Exit
}
end;
Result := CallNextHookEx(hKeybaordHook, nCode, wParam, lParam);
end;
procedure MainForm.FormShow(Sender: TObject);
const
WH_KEYBOARD_LL = 13;
begin
SetBounds(0, 0, Screen.Width, Screen.Height);
if hKeybaordHook = 0 then
hKeybaordHook := SetWindowsHookEx(WH_KEYBOARD_LL, @KeyboardHook, HInstance, 0);
end;
procedure MainForm.FormHide(Sender: TObject);
begin
if (hKeybaordHook <> 0) and UnhookWindowsHookEx(hKeybaordHook) then
hKeybaordHook := 0;
end;
Вы также можете установить значение ключа реестра «ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ \ Microsoft \ Windows NT \ CurrentVersion \ Опции выполнения файла образа \ taskmgr.exe» для некоторого фиктивного текста, чтобы отключить диспетчер задач (включая комбинацию Ctrl + Shift + Esc).