是否可以将应用程序的主窗体设置为系统模态?我的应用程序将从远程公司PC上FTP文件。在此过程进行时,用户不应被允许与桌面交互。
Application.MainFormOnTaskbar := True;
Application.ShowMainForm := False;
...
FormChild.ShowModal;
是否可以将应用程序的主窗体设置为系统模态?我的应用程序将从远程公司PC上FTP文件。在此过程进行时,用户不应被允许与桌面交互。
Application.MainFormOnTaskbar := True;
Application.ShowMainForm := False;
...
FormChild.ShowModal;
将主窗体设为模态窗口是没有意义的。实际上,如果你有一个普通应用程序,其中包含一个(正常的)主窗体,然后显示一个模态窗体(例如对话框或TOpenDialog
),那么“模态性”意味着主窗体和其余您的应用程序在模态窗体关闭之前都会被“禁用”。 (但其他应用程序不受影响)。但是这对于主窗体来说是没有意义的,因为当主窗体被显示时,没有“剩余”的应用程序需要禁用。事实上,如果您不打开任何其他窗体,则正常的主窗体在某种程度上已经是模态窗口了。
我认为您希望创建一个系统模态窗体,即显示时会禁用整个桌面其余部分的窗体。但这并不容易实现,因为现代版本的Microsoft Windows操作系统遵循安全原则,通常情况下,单个应用程序不能够控制整个操作系统。
pskill IrritatingPseudoKioskApp
。实际上,我会在它开始尝试任何这些无聊操作之前杀死该应用程序! - David HeffernanCreateDesktop()
创建自己的桌面(并创建一个状态窗口在其上显示),然后使用OpenDesktop()
检索用户的桌面,在文件传输开始和结束时使用SwitchDesktop()
之间切换。当您的自定义桌面处于活动状态时,用户无法访问他/她的桌面(例如屏幕保护程序正是这样做的)。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;