【问题标题】:Block Keyboard input completely完全阻止键盘输入
【发布时间】:2012-02-01 10:18:02
【问题描述】:

有没有办法完全阻止键盘输入?这也应该阻止像 WIN+E 这样的组合键。

我找到了这段代码,有没有办法将其更改为仅阻止键盘输入(鼠标需要工作)

    procedure TForm1.Button1Click(Sender: TObject) ;

   function FuncAvail(dllName, funcName: string; var p: pointer): boolean;
   var
     lib: THandle;
   begin
     result := false;
     p := nil;
     if LoadLibrary(PChar(dllName)) = 0 then exit;
     lib := GetModuleHandle(PChar(dllName)) ;
     if lib <> 0 then
     begin
      p := GetProcAddress(lib, PChar(funcName)) ;
      if p <> nil then Result := true;
     end;
   end;

   var
     BlockInput : function(Block: BOOL): BOOL; stdcall;

   begin
    if FuncAvail('USER32.DLL', 'BlockInput', @BlockInput) then
    begin
     ShowMessage('Your Mouse and Keyboard will be blocked for 5 seconds!') ;
     BlockInput(true) ;
     Sleep(5000) ;
     BlockInput(false) ;
    end;
   end;

 end.

此代码是否也适用于 WIN 键等?

谢谢!

【问题讨论】:

  • BlockInput 阻止所有用户输入,你不能让它只阻止键盘。你为什么要这样做?也许我们可以想出一个替代方案。
  • 嗨,我需要这个用于某种 Kiosk-App,与屏幕的交互只能通过鼠标完成。我不希望有任何方法来规避这种情况,例如按 WIN+E 并打开资源管理器。
  • 当然,一个全局键盘钩子可以解决这个问题。无论如何,Windows都没有信息亭模式。或者更好的是,只需将您的应用作为 shell 运行即可。
  • 为什么不能把键盘拿走?

标签: windows delphi winapi kiosk-mode


【解决方案1】:

你想太多了。

设置可以通过鼠标而不是键盘控制的信息亭的适当方法是不连接键盘。(这也使得不道德的信息亭用户不可能偷你的键盘。)

这也意味着,如果您需要执行管理任务,您可以连接一个键盘(或远程输入),一切都会正常工作。

【讨论】:

  • 当然要拿走物理键盘,但也要确保用户无权运行Windows的屏幕键盘(osk.exe)。
  • 您可以挂钩 WndProc 并使其取消所有调整大小的消息。它们使您无法调整窗口大小或最小化窗口,或更改其 z 顺序。然后,您可以包含一个管理员功能,该功能会在给定密码的情况下禁用该功能。
【解决方案2】:

如果由于某种原因移除键盘不是一个可行的选项,那么在软件中有一种不受支持的方法:从中移除 UpperFilters 值

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4D36E96B-E325-11CE-BFC1-08002BE10318}

这会禁用来自所有普通键盘设备的输入,但远程桌面虚拟键盘仍然可以工作,因此您可能需要先确保远程桌面已配置并正常工作。

供您参考,如果您想反转该过程,UpperFilters 通常是一个包含单个字符串“kbdclass”(不带引号)的 REG_MULTI_SZ。

【讨论】:

  • 注意,需要重启机器才能生效。
  • +1,哇,从来没有听说过这个技巧。但是,我更喜欢物理方式,可能是控制键盘 (USB) 电源的键锁开关。
  • @TLama:这取决于上下文。我同意删除或以其他方式物理禁用键盘可能是 OP 的最佳解决方案,但在某些情况下它是不合适的。例如,就我而言,我需要间歇性地(并且经常)锁定数百台计算机的输入,因此确实需要在软件中完成!
猜你喜欢
  • 2014-08-23
  • 2012-02-04
  • 1970-01-01
  • 2016-03-15
  • 1970-01-01
  • 2018-04-19
  • 1970-01-01
  • 2018-11-10
  • 1970-01-01
相关资源
最近更新 更多