gpt4 book ai didi

windows - 可以使用 Delphi 在 W7 中禁用任务切换键盘快捷键吗?

转载 作者:可可西里 更新时间:2023-11-01 12:42:47 24 4
gpt4 key购买 nike

多年来,我的应用程序一直采用一种模式,客户可以“禁用对操作系统的访问”。显然,此功能有悖常理(至少就 Windows 而言),但在某些安装中,我的应用程序是唯一应该对机器运算符(operator)可见的程序,在这种情况下,此功能很有用。

我使用的技术是从几个“层”构建的:

  1. 隐藏任务栏和按钮。
  2. 禁用任务切换。
  3. 禁用我的主窗体系统图标。

要禁用我使用的任务栏:

// Get a handle to the taskbar and its button..
Taskbar := FindWindow('Shell_TrayWnd', Nil);
StartButton := FindWindow('Button', Nil);

// Hide the taskbar and button
if Taskbar <> 0 then
ShowWindow( Taskbar, SW_HIDE );
if StartButton <> 0 then
ShowWindow( StartButton, SW_HIDE );

// Set the work area to the whole screen
R := Rect( 0,0,Screen.Width,Screen.Height );
SystemParametersInfo(
SPI_SETWORKAREA,
0,
@R,
0 );

这很好用,在 W7 上看起来仍然不错。几年前研究如何禁用任务切换发现了唯一“假装”你的应用程序是屏幕保护程序的技术(除了可怕的事情,比如将你的应用程序重命名为“explorer.exe”并启动它等):

procedure EnableTaskSwitching( AState : boolean );
// Enables / disables task switching
begin
SystemParametersInfo(
SPI_SCREENSAVERRUNNING,
Cardinal( not AState),
nil,
0 );
end;

毫不奇怪,这似乎在 W7 中没有效果(我认为它在 XP 等中有效)。有谁知道另一种更好的启用/禁用 Alt-Tab(和其他特殊 Windows 键)的方法?

最佳答案

如果找到解决方案:

function LowLevelKeyboardProc(nCode: integer; wParam: WPARAM; lParam: LPARAM):
LRESULT; stdcall;
type
PKBDLLHOOKSTRUCT = ^TKBDLLHOOKSTRUCT;
TKBDLLHOOKSTRUCT = record
vkCode: cardinal;
scanCode: cardinal;
flags: cardinal;
time: cardinal;
dwExtraInfo: Cardinal;
end;

PKeyboardLowLevelHookStruct = ^TKeyboardLowLevelHookStruct;
TKeyboardLowLevelHookStruct = TKBDLLHOOKSTRUCT;
const
LLKHF_ALTDOWN = $20;
var
hs: PKeyboardLowLevelHookStruct;
ctrlDown: boolean;
begin

if nCode = HC_ACTION then
begin

hs := PKeyboardLowLevelHookStruct(lParam);
ctrlDown := GetAsyncKeyState(VK_CONTROL) and $8000 <> 0;
if (hs^.vkCode = VK_ESCAPE) and ctrlDown then
Exit(1);
if (hs^.vkCode = VK_TAB) and ((hs^.flags and LLKHF_ALTDOWN) <> 0) then
Exit(1);
if (hs^.vkCode = VK_ESCAPE) and ((hs^.flags and LLKHF_ALTDOWN) <> 0) then
Exit(1);
if (hs^.vkCode = VK_LWIN) or (hs^.vkCode = VK_RWIN) then
Exit(1);

end;

result := CallNextHookEx(0, nCode, wParam, lParam);

end;

procedure TForm1.FormShow(Sender: TObject);
begin
SetWindowsHookEx(WH_KEYBOARD_LL, @LowLevelKeyboardProc, 0, 0);
end;

这会禁用(如您所见!)

  • Ctrl+Esc(显示开始菜单)
  • Alt+Tab(任务切换)
  • Alt+Esc(任务切换)
  • Win(显示开始菜单)
  • Win+Tab(3D任务切换)
  • Win+D、Win+M、Win+Space、Win+Arrows、Win+P、Win+U、Win+E、Win+F、Win+Digit ...
  • 几乎任何组合,包括 Windows 键(但不是全部,例如 Win+L)

关于windows - 可以使用 Delphi 在 W7 中禁用任务切换键盘快捷键吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5850514/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com