DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: szliyu112358
今日帖子: 54
在线用户: 17
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 janker (janker) ★☆☆☆☆ -
盒子活跃会员
2021/4/21 15:38:29
标题:
有高手会屏蔽CTL+ALT+DELETE 吗? 浏览:2247
加入我的收藏
楼主: 其它键的屏蔽都实现了,这个CTL+ALT+DELETE 搞不定。
网上也找了一些代码,试了,在win7,win10(32,64)下都不理想。
对操作系统底层也没研究,好多代码也看不懂,无从更改。。。
----------------------------------------------
-
作者:
男 bahamut8348 (leonna) ★☆☆☆☆ -
普通会员
2021/4/21 16:18:22
1楼: win7以前用钩子就行,7以后不可能了,7以后是直接系统调用的,根本不过键盘钩子,你是钩不住的。
解决办法有两个:
1:写一个键盘过滤驱动,或者干脆写一个新的键盘驱动,那样你想咋样就咋样了。
2:挂起进程winlogon.exe,winlogon在win系统中是负责管理系统登录的进程,组合键最终会落到这个进程里来响应,你直接把这个进程挂起也可以起到屏蔽的效果。
----------------------------------------------
--
作者:
男 janker (janker) ★☆☆☆☆ -
盒子活跃会员
2021/4/21 16:45:13
2楼: @bahamut8348 (leonna):

找的网上代码也是和winlogon相关的,好复杂。32位的win7时灵时不灵的,64位根本没效果,win10也是没效果。
这个CTL+ALT+DELETE好头疼,拿起多年前买的“window 95 操作系统”书,还是C语言的,不知道有没有用,哈哈.....
还有delphi的书叫什么"window操作系统下的delphi编程",也是window底层编程的,但是好像是98、XP时代的,里面的代码对现在的win7、10也不行了,只是参考。
----------------------------------------------
-
作者:
男 janker (janker) ★☆☆☆☆ -
盒子活跃会员
2021/4/21 17:01:25
3楼: https://www.cnblogs.com/binsys/articles/3160624.html
这篇文章说到了相关内容,但是他说的技术都不会啊......
----------------------------------------------
-
作者:
男 pcplayer (pcplayer) ★☆☆☆☆ -
普通会员
2021/4/21 17:13:39
4楼: 这个简单,把键盘上的 CTRL 键扣掉就好
----------------------------------------------
-
作者:
男 vkow (vkow) ★☆☆☆☆ -
普通会员
2021/4/21 17:42:57
5楼: 应该不好办。
连VMware的软件都无法实现。虚拟机上按这三个键,直接被外部操作系统捕获。他是靠菜单点击实现向虚拟机发送这三个键的。
原因可想而知。
----------------------------------------------
-
作者:
男 janker (janker) ★☆☆☆☆ -
盒子活跃会员
2021/4/21 18:10:07
6楼: 是一个客户的工控机上要这功能的。
工控行业的电脑是有这个禁用功能的,但是我们也没有联系方式,不然直接请人实现。
累。。。。
----------------------------------------------
-
作者:
男 roadrunner (roadrunner) ★☆☆☆☆ -
盒子活跃会员
2021/4/21 18:12:19
6楼: https://docs.microsoft.com/en-us/samples/microsoft/windows-driver-samples/keyboard-input-wdf-filter-driver-kbfiltr/

这里有一个微软官方的用visual studio开发键盘驱动的demo, 用这个demo开发出来的键盘驱动, 就可以自定义组合键拦截
----------------------------------------------
-
作者:
男 janker (janker) ★☆☆☆☆ -
盒子活跃会员
2021/4/21 20:20:52
7楼: @roadrunner (roadrunner): 谢谢,下载下来看看,估计也看不懂。
驱动开发的一点慨念也没...
----------------------------------------------
-
作者:
男 dlfsystem (dlfsystem) ★☆☆☆☆ -
盒子活跃会员
2021/4/22 10:28:31
8楼: 了解下windows消息机制的api也许可以解决。
----------------------------------------------
-
作者:
男 dbyoung (dbyoung) ★☆☆☆☆ -
普通会员
2021/4/22 12:03:37
9楼: 源代码,执行文件这里都有:
https://github.com/SweetIceLolly/Disable_Ctrl_Alt_Del

原理就是暂停 winlogon 进程

procedure TForm1.btn1Click(Sender: TObject);
var
  dummy      : Boolean;
  WinLogonPID: Cardinal;
  hProcess   : Cardinal;
begin
  WinLogonPID := 9508;
  dummy       := False;
  RtlAdjustPrivilege(20, True, False, dummy);
  hProcess := OpenProcess(PROCESS_ALL_ACCESS, False, WinLogonPID);
  NtSuspendProcess(hProcess);
  CloseHandle(hProcess);
end;

procedure TForm1.btn2Click(Sender: TObject);
var
  dummy      : Boolean;
  WinLogonPID: Cardinal;
  hProcess   : Cardinal;
begin
  WinLogonPID := 9508;
  dummy       := False;
  RtlAdjustPrivilege(20, True, False, dummy);
  hProcess := OpenProcess(PROCESS_ALL_ACCESS, False, WinLogonPID);
  NtResumeProcess(hProcess);
  CloseHandle(hProcess);
end;

Win10X64下测试通过。Win7下应该也可以。没有测试。
----------------------------------------------
武汉天气不好
作者:
男 sail2000 (小帆工作室) ★☆☆☆☆ -
盒子活跃会员
2021/4/22 21:07:36
10楼: 依稀记得 xp 时代这个叫做 fuck CAD ...
----------------------------------------------
delphi 是兴趣,和工作无关,即使它倒闭。又不靠它 delphi 吃饭,怕甚?
作者:
男 janker (janker) ★☆☆☆☆ -
盒子活跃会员
2021/4/22 22:54:28
11楼: @dbyoung (dbyoung):
太感谢!!!
明天就给客户测试.....
----------------------------------------------
-
作者:
男 janker (janker) ★☆☆☆☆ -
盒子活跃会员
2021/4/24 10:53:45
12楼: 感谢各位的帮助,功能基本实现了
这里整理了下,供需求的人参考.........
键盘钩子
屏蔽CRTL+ALT+DELETE组合键
延时关机
立即关机
开机启动(加入注册表)

unit WinSpecialFunction;

interface

uses
  System.SysUtils, System.Win.Registry,
  Winapi.Windows, Winapi.Messages, Winapi.TlHelp32;

function GetWinlogonPid: Cardinal;
function RtlAdjustPrivilege(Privilege: ULONG; Enable: Boolean; CurrentThread: BOOL; var Enabled: Boolean):DWORD;
    stdcall; external 'ntdll.dll';
function NtSuspendProcess(hProcess: Cardinal): DWORD; stdcall; external 'ntdll.dll';
function NtResumeProcess(hProcess: Cardinal): DWORD; stdcall; external 'ntdll.dll';
function ZwShutdownSystem(pApi: Integer): DWORD; stdcall; external 'ntdll.dll';
procedure EnabledCTL_ALT_DELETE(const Enabled: Boolean);

//钩子
function KeyBoardHookProc(iCode: Integer; wParam: WPARAM; lParam: LParam): LResult; stdcall;
procedure UnKeyBoardHookProc;
function GetComputerName:string;
procedure AutoStartRunAPP(const IsAutoRun: Boolean);
//延时关机
function TimedShutdown(AComputer:string; AMsg:string; ATime:Word; AForce:Boolean; AReboot:Boolean):Boolean;
//立即关机
procedure ImmediatelyShutdown;

var
  HKeyHook : HHook;

implementation

type
  tagKBDLLHOOKSTRUCT = packed record
    vkCode: DWORD;
    scanCode: DWORD;
    flags: DWORD;
    time: DWORD;
    dwExtraInfo: Pointer;
  end;
  KBDLLHOOKSTRUCT = tagKBDLLHOOKSTRUCT;
  PKBDLLHOOKSTRUCT = ^KBDLLHOOKSTRUCT;

function GetWinlogonPid: Cardinal;
var
  LSnap: THandle;
  pEntry: TProcessEntry32;
  LRtn: Boolean;
begin
  Result := 1;
  LSnap := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  pEntry.dwSize := SizeOf(pEntry);
  LRtn := Process32First(LSnap, pEntry);
  while LRtn do
  begin
    if String.Compare(pEntry.szExeFile, 'winlogon.exe', False) = 0 then
    begin
      CloseHandle(LSnap);
      Exit(pEntry.th32ProcessID);
    end;
    FillChar(pEntry.szExeFile, 260, 0);
    LRtn := Process32Next(LSnap, pEntry);
  end;
  CloseHandle(LSnap);
  Result := 0;
end;

procedure EnabledCTL_ALT_DELETE(const Enabled: Boolean);
var
  dummy      : Boolean;
  WinLogonPID: Cardinal;
  hProcess   : Cardinal;
begin
  WinLogonPID := GetWinlogonPid;
  dummy       := False;
  RtlAdjustPrivilege(20, True, False, dummy);
  hProcess := OpenProcess(PROCESS_ALL_ACCESS, False, WinLogonPID);
  if Enabled then
    NtResumeProcess(hProcess)
  else
    NtSuspendProcess(hProcess);
  CloseHandle(hProcess);
end;

procedure UnKeyBoardHookProc;
begin
  UnhookWindowsHookEx(HKeyHook);
end;

function KeyBoardHookProc(iCode: Integer; wParam: WPARAM; lParam: LParam): LResult;
var
  pMSG: PKBDLLHOOKSTRUCT;
begin

  if iCode = HC_ACTION then
  begin
    case wParam of
      WM_KEYDOWN, WM_SYSKEYDOWN, WM_KEYUP, WM_SYSKEYUP:
      begin
        pMSG := PKBDLLHOOKSTRUCT(lParam);
        //if not (pMSG.vkCode in [VK_BACK, VK_RETURN, VK_ESCAPE, 48..57, 65..90, 96..105, 186..191, 219..220]) then
        if not (pMSG.vkCode in [VK_BACK, VK_RETURN, VK_ESCAPE, 48..57, 65..90, 96..105]) then
          Result := 1
        else
          Result := CallNextHookEx(HKeyHook, iCode, wParam, lParam);
      end;
      else
      begin
        Result := CallNextHookEx(HKeyHook, iCode, wParam, lParam);
      end;
    end;
  end;
end;

procedure AutoStartRunAPP(const IsAutoRun: Boolean);
var
  LReg: TRegistry;
begin
  LReg := TRegistry.Create;
  try
    LReg.RootKey := HKEY_CURRENT_USER;
    LReg.OpenKey('SOFTWARE\Microsoft\Windows\CurrentVersion\Run', True);
    if IsAutoRun then
      LReg.WriteString('EI5Start', ParamStr(0))
    else
    begin
      LReg.DeleteValue('EI5Start');
    end;
  finally
    LReg.Closekey;
    LReg.Free;
  end;
end;

function GetComputerName:string;
var
  aLen : DWORD;
  aName : array [0..MAX_COMPUTERNAME_LENGTH] of Char;
begin
  aLen := MAX_COMPUTERNAME_LENGTH + 1;
  if Winapi.Windows.GetComputerName(aName, aLen) then
    SetString(Result, aName, aLen)
  else
    Result := '';
end;

function TimedShutdown(AComputer:string; AMsg:string; ATime:Word; AForce:Boolean; AReboot:Boolean):Boolean;
var
  rl:DWORD;
  htoken:THandle;
  tkp:TOKEN_PRIVILEGES;
begin
  OpenProcessToken(GetCurrentProcess,TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,htoken);
  if LookupPrivilegeValue(nil,'SeShutdownPrivilege',tkp.Privileges[0].Luid) then
  begin
    tkp.Privileges[0].Attributes:=SE_PRIVILEGE_ENABLED;
    tkp.PrivilegeCount:=1;
    AdjustTokenPrivileges(hToken,False,tkp,0,nil,rl);
  end;
  Result:=InitiateSystemShutdown(Pchar(AComputer),Pchar(AMsg),ATime,AForce,AReboot);
end;

procedure ImmediatelyShutdown;
var
  dummy      : Boolean;
begin
  RtlAdjustPrivilege(19, True, True, dummy);
  ZwShutdownSystem(2);
end;

end.

需管理员权限运行
----------------------------------------------
-
作者:
男 net1999 (好人) ★☆☆☆☆ -
普通会员
2021/4/24 13:38:34
13楼: 牛!
----------------------------------------------
-
作者:
男 smartdata (Jack) ★☆☆☆☆ -
普通会员
2021/4/25 22:17:46
14楼: 顶!
----------------------------------------------
==========
作者:
男 rururu (rr) ★☆☆☆☆ -
盒子活跃会员
2021/5/9 21:14:48
15楼: 这个也能实现?!XP以后太难了!牛!
----------------------------------------------
-
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行70.3125毫秒 RSS