【问题标题】:How to prevent using anything except application in Delphi XE如何防止在 Delphi XE 中使用除应用程序以外的任何东西
【发布时间】:2015-10-16 04:25:52
【问题描述】:

我正在开发一个 VCL 表单应用程序

应用程序何时启动

我需要防止计算机的用户做任何事情

他无法通过 ALT+F4CTRL+ALT+DEL

关闭应用程序

他不能通过ALT+Tab

切换到另一个窗口

他不能点击Windows + D

进入桌面

这将用于Cyber​​ Cafe,它是一个Server/Client应用程序

因此,在服务器中的管理员授予对客户端的访问权限之前,他无法在计算机上执行任何操作 .. 只是我的表单的全屏

【问题讨论】:

  • 使用 OS Kiosk 模式
  • 好的,我去看看,谢谢
  • Google 自助服务终端模式 google.dk/…
  • Google 模式可以在我的 Delphi XE 应用程序中使用吗?
  • @SystemDZ:Jens 并没有告诉您在应用程序中使用 Google,而是告诉您使用 Google 搜索有关如何将 Windows 操作系统置于信息亭模式的信息。例如:How to Easily Put a Windows PC into Kiosk Mode With Assigned Access

标签: forms delphi desktop delphi-xe


【解决方案1】:

因为捕获 CTRL-ALT-DEL 组合的是 Windows 的登录系统(因此用户应用程序无法访问它),您需要更改系统的键盘扫描码映射以忽略这些键中的至少一个.

首先您必须确保在您的计算机上自动登录,否则您可以登录。这也可以在注册表中完成。

然后是编辑扫描码映射的棘手部分。在 MSDN 你会找到一篇关于如何做的文章:https://msdn.microsoft.com/en-us/library/windows/hardware/jj128267%28v=vs.85%29.aspx?f=255&MSPPError=-2147217396

我发现这个 reg 文件应该禁用 CTRL + ALT + DELETE 但我还没有测试过

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout]
"Scancode Map"=hex:00,00,00,00,00,00,00,00,03,00,00,00,00,00,38,00,00,00,38,e0,\
  00,00,00,00

请注意,这是非常危险的。使用 REG 文件和更改扫描码映射。我建议你在虚拟机中测试你的东西。

您还需要防止用户关闭计算机。这也在注册表中完成:

User Key: [HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\
Explorer]
System Key: [HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\
Explorer]
Value Name: NoClose
Data Type: REG_DWORD (DWORD Value)
Value Data: (0 = shutdown enabled, 1 = shutdown disabled)

因此,为了关闭计算机,您的程序必须调用 ShutdownwindowsEx

function ExitWindows(iFlags: Integer): Boolean;
var
  osVerInfo: TOSVersionInfo;

  function SetPrivilege(sPrivilegeName: string; bEnabled: Boolean): Boolean;
  var
    TPPrev, TP: TTokenPrivileges;
    Token: THandle;
    dwRetLen: DWord;
  begin
    Result := False;
    OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, Token);
    TP.PrivilegeCount := 1;
    if (LookupPrivilegeValue(nil, PChar(sPrivilegeName), TP.Privileges[0].LUID)) then
    begin
      if (bEnabled) then
        TP.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED
      else
        TP.Privileges[0].Attributes := 0;
      dwRetLen := 0;
      Result := AdjustTokenPrivileges(Token, False, TP, sizeof(TPPrev), TPPrev, dwRetLen);
    end;
    CloseHandle(Token);
  end;

begin
  Result := True;
  osVerInfo.dwOSVersionInfoSize := sizeof(TOSVersionInfo);
  if GetVersionEx(osVerInfo) then
    case osVerInfo.dwPlatformId of
      VER_PLATFORM_WIN32_WINDOWS:
        if not ExitWindowsEx(iFlags, 0) then
          Result := False; // handle errors...
      VER_PLATFORM_WIN32_NT:
        if SetPrivilege('SeShutdownPrivilege', True) then
        begin
          if not ExitWindowsEx(iFlags, 0) then
            Result := False; // handle errors...
          SetPrivilege('SeShutdownPrivilege', False)
        end
        else
          Result := False; // handle errors...
    else
      Result := False;
    end;
end;

【讨论】:

    猜你喜欢
    • 2017-08-22
    • 1970-01-01
    • 1970-01-01
    • 2022-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-22
    • 1970-01-01
    相关资源
    最近更新 更多