繁体   English   中英

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

[英]How can I intercept all key events, including ctrl+alt+del and ctrl+tab?

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

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

你不能。 Ctrl+Alt+Del 的全部意义在于只有系统可以处理它,因为这样系统始终可以处理它。

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

补充一下 Shog9 所说的,如果您的应用程序可以拦截 ctrl+alt+del,那么您的应用程序将能够伪装成 Windows 登录对话框,并通过这样做来诱骗最终用户将他们的凭据输入到您的应用程序中。

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

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

更具体地说,你的“应用软件”不能:相反,按照设计,只有“系统软件”可以做到这一点; 它不是,你不能或不能写系统软件,但你的OP似乎很清楚,询问如何做到这一点,而无需编写系统软件......而答案,你可以” t:因为系统旨在防止应用程序挂钩这些组合键。

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

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

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

设备驱动程序是一个不同的主题:例如驱动程序开发入门

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

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

然而,忽略你应该做的,而是专注于你能做的,如果你想拦截键盘,显然是可以做到的。 我自己没有研究过键盘,但是这篇文章这篇文章声称成功,通过编写“键盘过滤器驱动程序”(这是一种内核模式,而不是 Win32 设备驱动程序)。 如果您编写其中之一,尽管您可能会受到一些回击,例如来自 DDK MVP 的这种反应,或者来自反窥探产品的这种反应

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

来自 MSDN 文档:WH_KEYBOARD_LL

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

由于这似乎是“拦截”三个关键伪中断控制 alt 删除的各种方法的累积的好收集点,这是我昨天遇到的可能有用的东西。

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

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

尤其是移除了诸如机械扬声器音量控制之类的明智而直接的东西。 (当然,笨重,更多物质,但当然这就是事情,对个人或存在有什么好处,无限和完美的意识没有处理它或它的经验?)

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

我说把一些按钮——直接到硬件控制——放回原处——至少在这些技术的软件方面完全适应人工软接口之前,我在对所有启发式的详尽说明中解释了这一点供应。

即使在宇宙的力学中,我敢打赌有一个方便的重置、恢复、暂停、停止类型的功能,以确保存在的安全性和基本可行性存在:智能意识和意志。

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

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

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

这篇 2002 年更新的文章于 2006 年更新,解释了一种无需编写键盘驱动程序即可完成此操作的方法。 http://www.codeproject.com/KB/system/preventclose.aspx?msg=1666328

如果您只想抑制对任务管理器的调用,则在隐藏窗口中启动 taskmgr.exe 即可完成这项工作

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

    Process.Start(taskmgr);

您可以在 XP 及之前实现这一点,但在 Vista 中则不再如此。

尝试调查您是否可以编写一个应用程序,将自身作为受密码保护的屏幕保护程序启动。

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

在您的程序运行时拦截 ctrl 和 alt 按键,并取消这些按键怎么样?

我不知道这在 Vista 中会有多好,但它值得一试。

我记得在 2001 年左右做过这样的事情,所以它可能在 98 上运行。自从我什至试图搞乱诸如锁定 ctrl-alt-del 之类的事情已经太久了。

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

创建一个键盘钩子。 当用户按下 ctrl || 替代 || delete set bool to true .. 如果他们按下任何其他东西,将它们全部设置为 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;

当屏幕有焦点时,将其交给任务管理器,关闭该死的东西。 屏幕闪烁得如此之快,以至于用户从未注意到。 我可以做任何我想做的事。

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

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

Process explorer 是这样做的:

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

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

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

我没有测试过,但有这个摘录:

顾名思义,系统击键主要供操作系统使用。 如果您截获 WM_SYSKEYDOWN 消息,请稍后调用 DefWindowProc。 否则,您将阻止操作系统处理该命令。

如果它真的像它说的那样工作,对我来说似乎是一个安全漏洞。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM