我想在我的ANSI-C代码中禁用Windows XP中的CTRL + ALT + DEL?

我想在我的ANSI-C代码中禁用Windows XP中的CTRL + ALT + DEL。 可以做到吗?

首先,陷阱Ctrl-Alt-Del(安全注意序列)并禁用它是两个不同的事情。 尽管有很多误解,但可以禁用SAS。

这里有3种方式来做到这一点:

  1. 设置HKCU / Software / Microsoft / Windows / CurrentVersion / Policies / System / DisableTaskMgr = 1

  2. 用你自己的替换msgina.dll或写一个键盘驱动程序。

  3. 转到开始菜单,选择运行,然后键入“gpedit.msc”运行组策略编辑器。 查看用户配置| 管理模板| 系统,你会发现一个名为Ctrl + Alt + Del选项 – “删除任务管理器”

为了捕捉SAS,你可以编写一个GINA存根,创建一个键盘驱动程序或替换TaskMgr.exe

这些要求主要针对嵌入式系统,您可以控制WinXP映像的制作方式。

参考: MSDN Mag 2002年9月

是的。

CTRL + ALT + DEL,称为安全注意序列(SAS) ,不能通过通用的全局Windows挂机机制截获。

我所知道的拦截SAS的选项,不管情况如何,只有一个:司机。

但它并不需要是一个完整的设备驱动程序,它可以是一个简单的称为过滤器驱动程序。 你需要学习如何进行内核开发,这个开发并不是那么简单,而且需要你做两个机器的内核调试。 如果您希望在具有较新Windows的其他计算机上使用您的驱动程序,则自Windows Vista x64以后,您将需要签署驱动程序,而较新的驱动程序不会加载未签名的驱动程序,只允许这些操作系统的x86版本执行此操作。 你会得到一些有趣的BSOD的风险。

键盘筛选器驱动程序的官方微软示例是kbfiltr示例。

现在有一个更简单的方法来规避这一切:使用一些与驱动程序通信的库来完成所有这些肮脏的工作。 而这正是我所要做的。

我开发了一个叫做Interception的库,它允许用户在使用设备驱动程序的功能的同时拦截来自普通用户模式程序的设备输入。 这是一个小而简单的C API,与我已经正确签署的驱动程序进行内部通信。

在使用API​​之前,您必须使用安装程序在您的系统上安装驱动程序。

在我的网站上已经有了一个SAS拦截的样本,你也可以在github上查看。 我会把它留在这里作为参考:

#include <iostream> #include <utils.h> #include <interception.h> using namespace std; namespace scancode { enum { esc = 0x01, ctrl = 0x1D, alt = 0x38, del = 0x53, }; } InterceptionKeyStroke ctrl_down = {scancode::ctrl, INTERCEPTION_KEY_DOWN , 0}; InterceptionKeyStroke alt_down = {scancode::alt , INTERCEPTION_KEY_DOWN , 0}; InterceptionKeyStroke del_down = {scancode::del , INTERCEPTION_KEY_DOWN | INTERCEPTION_KEY_E0, 0}; InterceptionKeyStroke ctrl_up = {scancode::ctrl, INTERCEPTION_KEY_UP , 0}; InterceptionKeyStroke alt_up = {scancode::alt , INTERCEPTION_KEY_UP , 0}; InterceptionKeyStroke del_up = {scancode::del , INTERCEPTION_KEY_UP | INTERCEPTION_KEY_E0 , 0}; bool operator==(const InterceptionKeyStroke &first, const InterceptionKeyStroke &second) { return first.code == second.code && first.state == second.state; } bool shall_produce_keystroke(const InterceptionKeyStroke &kstroke) { static int ctrl_is_down = 0, alt_is_down = 0, del_is_down = 0; if (ctrl_is_down + alt_is_down + del_is_down < 2) { if (kstroke == ctrl_down) { ctrl_is_down = 1; } if (kstroke == ctrl_up ) { ctrl_is_down = 0; } if (kstroke == alt_down ) { alt_is_down = 1; } if (kstroke == alt_up ) { alt_is_down = 0; } if (kstroke == del_down ) { del_is_down = 1; } if (kstroke == del_up ) { del_is_down = 0; } return true; } if (ctrl_is_down == 0 && (kstroke == ctrl_down || kstroke == ctrl_up)) { return false; } if (alt_is_down == 0 && (kstroke == alt_down || kstroke == alt_up)) { return false; } if (del_is_down == 0 && (kstroke == del_down || kstroke == del_up)) { return false; } if (kstroke == ctrl_up) { ctrl_is_down = 0; } else if (kstroke == alt_up) { alt_is_down = 0; } else if (kstroke == del_up) { del_is_down = 0; } return true; } int main() { InterceptionContext context; InterceptionDevice device; InterceptionKeyStroke kstroke; raise_process_priority(); context = interception_create_context(); interception_set_filter(context, interception_is_keyboard, INTERCEPTION_FILTER_KEY_ALL); while (interception_receive(context, device = interception_wait(context), (InterceptionStroke *)&kstroke, 1) > 0) { if (!shall_produce_keystroke(kstroke)) { cout << "ctrl-alt-del pressed" << endl; continue; } interception_send(context, device, (InterceptionStroke *)&kstroke, 1); if (kstroke.code == scancode::esc) break; } interception_destroy_context(context); return 0; } 

把钩子放到键盘系统中是不可行的,尽管这里有一些说法。

键盘系统通过发出特定的硬件中断来工作。 操作系统捕获这个中断并对其作出适当的响应。 这将是受键盘挂钩影响的东西。

顺序CTRL-ALT-DEL从其他键发出单独的硬件中断。 这是原本完成的,即使其他键盘命令被冻结,重启命令也是可用的。 (尽管MS-DOS中的终止 – 驻留应用程序仍然可以捕获和处理中断。)

现在使用密钥序列登录的原因是由于这种行为。 由于它发出一个单独的硬件中断,序列被用来验证其他应用程序没有挂上钩子。这是为了防止欺骗登录提示。

我并不是说要捕捉这个中断并修改它的行为是不可能的。 我不知道这不是。 但是它不会像把钩子放到键盘处理代码那样简单。

Winlogon只是调用默认桌面上的SetWindowsHookEx来捕捉CAD。 由于只有一个叫做SetWindowsHookEx的线程才能注销这个钩子,所以确保没有其他进程可以窃取它。 另外键盘挂钩只能在进程桌面上运行。 您可以尝试切换到新的桌面并点击CAD。 一些内部信息, 你会发现在这里 。

为什么所有的答案都说这是不可能的? 这是非常可能的,例如这里是如何启用它,以防病毒已禁用它:

 Click Start Click Run Enter gpedit.msc in the Open box and click OK In the Group Policy settings window Select User Configuration Select Administrative Templates Select System Select Ctrl+Alt+Delete options Select Enable Task Manager 

如何使这个禁用它,以及如何从代码做到这一点我会让你弄清楚(提示:你可能想要编辑一些注册表键 ),因为这个问题是相当可疑的。

你也可以安装各种键盘钩子来改变ctrl + alt + delete的功能。

您可以在这里阅读有关注册表API。

如果你不想在按下ctrl alt delete时发生任何事情,请查看windows钩子和windows API钩子。 这些不易编码; 如果你想API挂钩,那么我建议这个库 – 你也许可以做到这一点,但与经典的Windows挂钩。 你需要编写你自己的msgina.dll来严格的钩住这个函数。 如果你不一定要切断对这个命令的任何回应(你可能不这样做),那么你很可能会用简单的方法逃脱。

这是为了回应OP所要做的,而不是问题本身。

最简单的方法来实现你的目标是编写一个键盘过滤器驱动程序,丢弃所有的输入。 (这实际上是禁用所有我能想到的输入的唯一正确方法,并且是诸如LogMeIn等产品所使用的方法)