C#屏蔽系统热键Ctrl+Alt+Delete的代码尝试。

开发者福利!热门AI工具限时免费用 购周边即赠Coding Plan Lite,Claude Code、Cursor等20+工具畅享,效率翻倍! 阅读详情

最近在做一款小软件,需要锁定用户的输入,包括系统热键(Ctrl+Alt+Delete),在网络中寻找良久,发现这些不错的代码。

经过仔细整理,现将这些代码公布,有兴趣的拿去用用。

搜集的过程有些艰辛,从VB6,到VB.NET,到我熟悉的C#。

 

一、思路分析。

1. 在窗体类Form中,重载消息循环WndProc来实现功能按键的屏蔽

protected override void WndProc(ref Message m)
{

  //ToDo:根据m.Msg来处理你要的按键

   base.WndProc(ref m);
}

优点:可以屏蔽大部分按键。使用简单。

缺点:不能注册全局热键,对系统级的热键无效,比如:a. Ctrl+Esc,  b. Ctrl+Shift+Esc,

c. Alt+Tab,  d. Alt+Esc,  e. Ctrl+Alt+Delete

类似的方法有System.Windows.Forms.Control的KeyPress,KeyDown事件,

2.利用钩子技术,这个可以捕获大多数键盘消息,但对Ctrl+Alt+Delete仍然无效。

3.最后发现一份VB6写的代码,提到这个方案:

锁定 Ctrl+Alt+Del 使用远程线程、代码注入及子类化技术。

普通键盘消息,使用普通钩子技术”

虽然这些我都还不太懂,但总算把代码移植到了.NET环境下,功能是实现了。

二、代码分析   

 第一步:包装Win32 API

User32.dll,

复制代码
 1 [DllImport("user32.dll", CallingConvention = CallingConvention.StdCall)]
 2 public static extern IntPtr SetWindowsHookEx(int hookType, HookProc lpfn, IntPtr pInstance, int threadId);
 3 
 4 [DllImport("user32.dll", CallingConvention = CallingConvention.StdCall)]
 5 public static extern bool UnhookWindowsHookEx(IntPtr pHookHandle);
 6 
 7 [DllImport("user32.dll", CallingConvention = CallingConvention.StdCall)]
 8 public static extern int CallNextHookEx(IntPtr pHookHandle, int nCode, int wParam, IntPtr lParam);
 9 
10 [DllImport("user32.dll")]
11 public static extern bool BlockInput(bool fBlockIt);
复制代码

Kernel32.dll,

复制代码
 1 [DllImport("kernel32.dll")]
 2 public static extern IntPtr OpenProcess(ProcessAccessFlags dwDesiredAccess,
 3     [MarshalAs(UnmanagedType.Bool)] bool bInheritHandle,
 4     int dwProcessId);
 5 [DllImport("kernel32.dll", SetLastError = true)]
 6 public static extern bool ReadProcessMemory(
 7   IntPtr hProcess,
 8   IntPtr lpBaseAddress,
 9   [Out] byte[] lpBuffer,
10   int dwSize,
11   out int lpNumberOfBytesRead
12  );
13 [DllImport("kernel32.dll", SetLastError = true)]
14 public static extern bool WriteProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, uint[] lpBuffer, uint nSize, out int lpNumberOfBytesWritten);
15 
16 
17 [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)]
18 public static extern ushort GlobalAddAtom(string lpString);
19 [DllImport("kernel32.dll", SetLastError = true, ExactSpelling = true)]
20 public static extern ushort GlobalDeleteAtom(ushort nAtom);
21 [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Auto, EntryPoint = "GlobalFindAtomW")]
22 public static extern ushort GlobalFindAtom(string lpString);
23 
24 
25 [DllImport("kernel32.dll", SetLastError = true)]
26 public static extern IntPtr CreateToolhelp32Snapshot(SnapshotFlags dwFlags, uint th32ProcessID);
27 [DllImport("kernel32.dll", EntryPoint = "Process32FirstW")]
28 public static extern bool Process32First(IntPtr hSnapshot, ref PROCESSENTRY32 lppe);
29 [DllImport("kernel32.dll", EntryPoint = "Process32NextW")]
30 public static extern bool Process32Next(IntPtr hSnapshot, ref PROCESSENTRY32 lppe);
31 
32 
33 [DllImport("kernel32.dll", SetLastError = true)]
34 [return: MarshalAs(UnmanagedType.Bool)]
35 public static extern bool CloseHandle(IntPtr hObject);
36 [DllImport("kernel32.dll")]
37 public static extern IntPtr GetCurrentProcess();
38 
39 
40 [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
41 public static extern IntPtr GetModuleHandle(string lpModuleName);
42 [DllImport("kernel32.dll", CharSet = CharSet.Ansi, ExactSpelling = true, SetLastError = true)]
43 public static extern UIntPtr GetProcAddress(IntPtr hModule, string procName);
44 [DllImport("kernel32.dll", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
45 public static extern IntPtr VirtualAllocEx(IntPtr hProcess, IntPtr lpAddress, uint dwSize, AllocationType flAllocationType, MemoryProtection flProtect);
46 [DllImport("kernel32.dll", SetLastError = true, ExactSpelling = true)]
47 public static extern bool VirtualFreeEx(IntPtr hProcess, IntPtr lpAddress, int dwSize, FreeType dwFreeType);
48 
49 
50 [DllImport("kernel32.dll", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
51 public static extern IntPtr CreateRemoteThread(IntPtr hProcess, IntPtr lpThreadAttributes, uint dwStackSize, int lpStartAddress, IntPtr lpParameter, uint dwCreationFlags, out IntPtr lpThreadId);
52 [DllImport("kernel32.dll", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
53 public static extern UInt32 WaitForSingleObject(IntPtr hHandle, Int32 dwMilliseconds);
54 [DllImport("kernel32.dll", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
55 public static extern bool GetExitCodeThread(IntPtr hThread, out int lpExitCode);
56 
57 [DllImport("Kernel32.dll", EntryPoint = "RtlMoveMemory", SetLastError = false)]
58 public static extern void MoveMemory(object dest, IntPtr src, int size);
复制代码

advapi32.dll

View Code

第二步,创建一个辅助类,HookHelper

以下是两个公开的方法:

View Code

第三,提供一下源码的地址

http://ishare.iask.sina.com.cn/f/17782020.html

总结:第一次发博客,希望大家支持。

------------------------------《《《《《《《《《

2011年08月09日,程序出错的BUG修正,感谢朋友的指出。

------------------------------《《《《《《《《《

 

 

错误描述:

在多次切换锁定和解锁功能,并狂按Alt键时程序会关闭,经调试,出现如下错误:

检测到 CallbackOnCollectedDelegate
  Message: 对“Demo!SomeNamespace.SomeClass+SomeDelegate::Invoke”类型的已垃圾回收委托进行了回调。这可能会导致应用程序崩溃、损坏和数据丢失。向非托管代码传递委托时,托管应用程序必须让这些委托保持活动状态,直到确信不会再次调用它们。

错误原因:

如果非托管代码需要多次调用托管代码中的回调,请将委托的引用保存为成员变量。否则会出现类似上面的异常: 

  。。。。

  如果不用成员变量,而用局部变量引用被new出来的委托,那么非托管代码可能刚开始的几次回调是OK的,但是接下来就会出现上面所说的异常,

原因就在于GC将局部变量和局部变量引用的委托对象都销毁了,非托管代码再去访问那个函数指针时发现指针指向的地址已经无效。

 

解决办法:

复制代码
//1.把委托拿到外面定义
private HookProc m_HookProc;

//2.在构造函数里赋值这个委托
{
    m_HookProc = new HookProc(LowLevelKeyboardProc);
}


//3.在调用方法中使用这个定义过的委托。
{
    //安装钩子
    m_lHookID = Win32Lib.SetWindowsHookEx(
        (int)HookType.WH_KEYBOARD_LL,
        m_HookProc,
        pInstance,
        0);

    //这里注释掉的是以前的代码
    //m_lHookID = Win32Lib.SetWindowsHookEx(
    //   (int)HookType.WH_KEYBOARD_LL,
    //   new HookProc(LowLevelKeyboardProc),
    //   pInstance,
    //   0);
}
复制代码


再次感谢大家的支持。

http://www.cnblogs.com/robnetcn/archive/2011/08/05/LockSysKey.html

2022最新C#禁用ctrl+alt+del等键盘热键方法,禁用USB,win7、win10有效 C#实现的禁用ctrl+alt+del键,Windows键、Esc键等任意键,USB禁用,针对win7、win10环境,2022年最新测试有效,设置方便。qq347103342 阅读详情

相关推荐

C# WinForm中屏蔽特殊功能键的技术实现

本文还有配套的精品资源,点击获取 简介:在Windows系统中,Win键、Ctrl+Alt+Del和Alt+F4等组合键具有特定的功能,如打开“开始”菜单、启动任务管理器和关闭窗口。在开发C# WinForm应用程序时,出于安全或特定需求可能需要屏蔽这些键。本文将介绍如何在C#中实现对这些特殊功能键的屏蔽和释放。其中,Win键可以通过设置键盘钩子实现屏蔽,而Alt+F4可以...

weixin_35752122的博客 2388

C#利用钩子屏蔽ctrl+alt+delete键盘按钮

C#屏蔽键盘,利用HOOK钩子屏蔽键盘上的 ctrl+alt+delete组合键按钮,源码可直接编译,编译运行截图如图所示,程序在屏蔽指定按钮后可以解除屏蔽。 运行环境:Visual Studio2010

C# 键盘钩子例子 可屏蔽Ctrl+Alt+Delete

这是我在网上收集了N久的成果,可以屏蔽Ctrl+Alt+Delete组合键(XP下有效),非常实用。

C# WinForm 屏蔽 ctrl+alt+delete win10

代码C# WinForm 屏蔽 ctrl+alt+delete win10。

qq_37823627的博客 998

c# winform使用API屏蔽系统热键和任务管理器

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Runtime.Interop

czh4869623的专栏 2463

c# 钩子屏蔽键盘快捷键

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace Hook_Demo { public partial class Form1 : Form

Stoneson 1888

C# 屏蔽系统热键(包括禁止使用任务管理器)

一般来说会用到hook(钩子),即获取系统的按键或者鼠标动作,然后在系统响应之前执行自定义动作,或者直接截断这个消息, 这就是屏蔽系统热键的原理了。 首先要调用操作系统的dll文件,先引入命名空间 using System.Runtime.InteropServices; 调用操作系统动态链接库的方法 [DllImport("user32.dll", CharSet = C

maidou0921的专栏 1万+

C#代码屏蔽CTRL+ALT+DEL

非常折腾的方法,就是为了不写驱动! 首先是挂起winlogon进程的类: using System; using System.Diagnostics; using System.Runtime.InteropServices; namespace WindowsFormsApplication1 {     class ProcessMgr

suijuebi4678的博客 3237

C#中通过钩子实现屏蔽组合功能键

Hook(钩子)是WINDOWS提供的一种消息处理机制平台,是指在程序正常运 行中接受信息之前预先启动的函数,用来检查和修改传给该程序的信息,(钩子)实 际上是一个处理消息的程序段,通过系统调用,把它挂入系统。每当特定的消息发出, 在没有到达目的窗口前,钩子程序就先捕获该消息,亦即钩子函数先得到控制权。这 时钩子函数即可以加工处理(改变)该消息,也可以不作处理而继续传递该消息,还 可以强制结束消息的传递。 C#中也可以通过调用Win32 API安装和卸载钩子函数,实现基于钩子的特定功能。 本实例为通过C#屏蔽键盘、利用HOOK钩子屏蔽ctrl+alt+delete组合键的示例源码,可直接编译。 示例支持屏蔽按键、解除屏蔽

c# 实现锁屏及禁止键盘和鼠标

1.要实现锁定系统不让别人用,可以调用系统锁定API函数来实现 //引入API函数 [DllImport("user32 ")] public static extern bool LockWorkStation();//这个是调用windows的系统锁定 2.API函数锁定键盘及鼠标 [DllImport("user32.dll")]

Lassewang的成长历程 7132

C# 屏蔽Ctrl Alt Del 快捷键方法+屏蔽所有输入

Win32.cs /* * * FileCreate By Bluefire * Used To Import WindowsApi * */ using System; using System.Collections.Generic; using System.Text; using System.Runtime.InteropServices; ...

weixin_30745641的博客 622

C#修改注册表 屏蔽 Ctrl+Alt+Del 键

            //屏蔽 Ctrl + Alt + Del 键            Microsoft.Win32.RegistryKey key = Microsoft.Win32.Registry.CurrentUser;            Microsoft.Win32.RegistryKey key1 = key.CreateSubKey("Software/Micros

星际垃圾的专栏 2633

实现屏蔽 Ctrl + Alt + Del 、Ctrl + Shift + Esc 等热键(一)

winlogon 进程通过 SignalManagerWaitForSignal 函数循环等待系统快捷键。最终通过 WMsgKMessageHandler 回调函数来实现 RPC 消息的处理。第一个参数 uMsgCSessionKey 控制会话有关(CSession)的回调消息,这不是我们需要关注的。第二个参数 uMsgWLGenericKey 控制注册调用(WLGeneric)的回调消息,其中包含了对快捷键处理有关的函数。

溡漪幽博客 5043

C# winform禁用CTRL+ALT+DEL完美代码,禁用功能键

C# winform禁用CTRL+ALT+DEL, 一。用C++写个DLL 功能: 隐藏 桌面,开始按钮,任务栏,系统时间等 禁止:alt+Tab ,alt+Esc,任务管理器,CTRL+ALT+DEL等 ...

cok8420的博客 2274

c# 屏蔽快捷键

c# 屏蔽快捷键 前言 有时候开发会遇到这样一个需求,软件需要屏蔽用户的组合快捷键或某些按键,避免强制退出软件,防止勿操作等。 原理 1、要实现组合键,按键拦截,需要用到user32.dll中的SetWindowsHookEx。 2、要拦截ctrl+alt+del,需要使用ntdll.dll的ZwSuspendProcess函数挂起winlogon程序,退出之后使用ZwResumePro...

cxu123321的博客 1641

【windows】关于禁用ctrl +alt + delete 等的热键问题

想要禁用window热键ctrl +alt + delete和ESC+ SHIFT+CTRL等的热键。 不能通过钩子,就想到注册表了。 创建一个.reg文件,将如下写进去, Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout] ...

程序猿的学习路途博客 8158

完美屏蔽 Ctrl+Alt+Del 键

完美屏蔽 Ctrl+Alt+Del 键一、前言  在Windows 9x/Me系统中,屏蔽Ctrl+Alt+Del和各种任务开关键的方法是通过下面的方法实现的:BOOL bOldState;SystemParametersInfo(SPI_SETSCREENSAVERRUNNING, TRUE, &bOldState, 0); 但在NT平台下,此方法不再适用,即使使用钩子技术也无法拦截到这个组

荣植华的专栏 8753
上一篇: 利用hook屏蔽程序中的按键
下一篇: 一个封锁操作被对 WSACancelBlockingCall 的调用中断 ErrorCode=10004
llw01
博客等级 码龄17年 36粉丝 16原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值