如何拦截所有关键事件,包括ctrl + alt + del和ctrl + tab?

时间:2009-05-20 04:04:25

标签: c# c++ windows keyboard

我正在编写一个屏幕保护程序类型的应用程序,需要阻止用户在不输入密码的情况下访问系统。我想捕获/抑制用户可能尝试退出应用程序的各种方法,但我做的所有研究似乎都指向“你不能”。

C#或C ++中的任何东西都会很棒。 我曾想过禁用键盘,但后来我还有其他问题。

13 个答案:

答案 0 :(得分:31)

你做不到。 Ctrl + Alt + Del的重点是只有系统才能处理它,因为系统可以始终处理它。

幸运的是,Windows内置了对受密码保护的屏幕保护程序的支持(可在“显示属性”中使用“恢复时,密码保护”选项,或通过组策略)。只需使用它。

答案 1 :(得分:15)

要添加Shog9所说的内容,如果您的应用程序可以拦截ctrl + alt + del,那么您的应用程序将能够伪装成Windows登录对话框,并通过这样做欺骗最终用户输入他们的凭据到你的申请。

如果您确实想要替换Windows登录对话框,请参阅Winlogon and GINA(但是这表示“在Windows Vista中忽略了GINA DLL”,我还没有听说过Vista的用途)。

  

如果有人问我不会告诉他们他们不能。

更具体地说,您的“应用软件”不能:相反,按照设计,只有“系统软件”可以做到这一点;并不是说你不允许或不能编写系统软件,但你的OP似乎非常清楚地询问如何在不编写系统软件的情况下这样做......以及的答案是你不能:因为系统旨在阻止应用程序挂钩这些组合键。

  

你能给我指导编写系统的东西..我实际上认为如果它是系统级别会更好..这对OEM来说真的很有意义。另外如果我把它写成系统级别,我可以编写一个应用程序来控制它。

例如,键盘过滤设备驱动程序或GINA DLL将被视为系统软件:由管理员(或OEM)安装并作为操作系统的一部分运行。

我不知道GINA的名字;我已经(上面)在MSDN中给它一个链接。我希望它是Win32用户模式代码。

设备驱动程序是一个不同的主题:例如Getting Started on Driver Development

  

有没有办法重新映射键盘以便删除不在原来的位置?

我仍然不确定你和/或你的老板是否有正确的想法。恕我直言,你不应该是一个阻止用户按Ctrl-Alt-Del的应用程序。如果要在不键入密码的情况下阻止用户访问系统,则应该锁定(密码保护)系统,就像用户按下Ctrl Alt Del然后选择“锁定此计算机”一样。要解锁计算机,他们需要按Ctrl Alt Del并将其凭据输入WinLogon。

然而,忽略你应该做的事情并专注于你能做的事情,如果你想拦截键盘,显然它可以完成。我自己没有学过键盘,但是this postthis post声称成功,通过编写“键盘过滤器驱动程序”(这是一种内核模式,而不是Win32,设备驱动程序)。如果你写下其中一个虽然你可能会得到一些推迟,例如例如this reaction from a DDK MVPthis reaction from an anti-snooping product

答案 2 :(得分:4)

我没有测试过,但是使用SetWindowsHookEx()

来自MSDN文档: WH_KEYBOARD_LL

Windows NT / 2000 / XP: 安装一个监视低级键盘输入事件的钩子过程。有关更多信息,请参阅LowLevelKeyboardProc挂钩过程。

答案 3 :(得分:3)

拦截crtl + alt + del是可能的,但显然微软很难做到,因为那样你就可以弹出假锁定对话框,并记录人们的密码。

答案是编写设备驱动程序。我不记得你是否可以使用普通的旧键盘滤波器,或者你是否必须编写键盘ISR。无论哪种方式,它当然是可能的,但如果您没有驾驶员经验,那将会非常痛苦。

答案 4 :(得分:3)

因为这似乎是一个很好的收集点,可以通过各种方式“拦截”三个关键的伪破 控制alt删除,这是我昨天遇到的可能有用的东西。

http://cuinl.tripod.com/Tips/enablectrldel.htm

在我看来,当看起来唯一实用且及时的选择是切断电源(即机械移除过载的类似Android的掌上电脑的电池)来停止任何游行或故障导致相当坚实和完整(或长期持久)的反应迟钝 - 似乎一个危险和令人沮丧的血统继续 - 并继续变得更糟。

特别是在删除机械扬声器音量控制等明智和直接的事情的同时。 (当然,笨重,更多的材料,但当然这只是事物,对个人或存在有益的是无限和完美的意识,没有处理它或它的经验?)

这是设计环境的一系列方法,负责响应用户 - 对关键且真正有意义的技术界面的部分。 (唯一?)

我说把一些按钮 - 直接到硬件控制 - 放回到这些东西上 - 至少直到这些技术的软件方面完全适应人工软接口,我在一个详尽的会计中解释所有的启发性供应。

即使在宇宙的机制中,我也打赌有一个方便的重置,恢复,暂停,停止类型的功能,以确保安全性的基本可行性以及作为启动后所有设计者的存在的基本可行性永恒的存在之谜:智慧的意识和意志。

答案 5 :(得分:1)

你可以在XP和之前实现这一点,但不再使用Vista了。

答案 6 :(得分:1)

Mark Russinovich(http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx)的“Process Explorer”就是这样做的,而且在Sysinternals被微软收购之前它一直在做。

2006年更新的这篇文章解释了一种不用编写键盘驱动程序的方法。 http://www.codeproject.com/KB/system/preventclose.aspx?msg=1666328

答案 7 :(得分:1)

如果您只想阻止对任务管理器的调用,那么在隐藏窗口中启动taskmgr.exe即可完成工作

    ProcessStartInfo taskmgr = new ProcessStartInfo()
    {
        FileName = "taskmgr.exe",
        WindowStyle = ProcessWindowStyle.Hidden
    };

    Process.Start(taskmgr);

答案 8 :(得分:1)

尝试调查是否可以编写一个以密码保护屏幕保护程序启动的应用程序。

屏幕保护程序可以做的不仅仅是显示漂亮的图片 - 我之前看过交互式屏幕保护程序使用鼠标和键盘来提供一个简单的游戏,虽然我不记得我看到哪个版本的Windows运行...它可能是Windows 95.(在这种情况下所有的赌注都已关闭)。

答案 9 :(得分:1)

好的..我不会在这里发布代码 但是这个gyst就是这个

创建一个键盘钩子。 当用户按下ctrl ||时alt || delete set bools to true ..如果他们按下任何其他内容将all设置为false。

switch (p_key)
            {
                default: Clear(); break;

                case Keys.LMenu: altHit = true; break;
                case Keys.RMenu: altHit = true; break;
                case Keys.LControlKey: ctrlHit = true; break;
                case Keys.RControlKey: ctrlHit = true; break;
                case Keys.Delete: delHit = true; break;

当屏幕有焦点时将其丢失给任务管理器,关闭血腥的东西。 屏幕闪烁得如此之快,用户从不会注意到它。 我可以做任何我想做的事。

我承认这是一个kludge,但它确实产生了预期的效果。 (哦,我希望我不必这样做)

答案 10 :(得分:1)

如果在程序运行时拦截ctrl和alt按键,并且.cancel'ing那些按键?

我不知道这有什么用,如果在Vista中,但它值得一试。

我记得在2001年左右做过这样的事情,所以它可能在98上运行。已经太久了,因为我甚至试图搞砸锁定ctrl-alt-del之类的东西。

答案 11 :(得分:0)

您仍然可以在Windows 7中截取 Ctrl + Alt + Del

这是Process explorer执行此操作的方式:

http://mygreenpaste.blogspot.com/2005/07/image-file-execution-options-good-evil.html

答案 12 :(得分:0)

我正在阅读此文档页面,经过一番思考和搜索,我想到了这个问题。

https://docs.microsoft.com/en-us/windows/win32/learnwin32/keyboard-input

我没有测试过,但是有以下摘录:

顾名思义,系统按键主要用于 通过操作系统。如果您截获WM_SYSKEYDOWN消息, 之后调用DefWindowProc。否则,您将阻止操作 系统处理命令。

如果它确实像说的那样起作用,对我来说似乎就像一个安全漏洞。