我正在用C#做一个在线测验项目.测试客户端是在Windows XP上运行的Windows桌面应用程序.我需要阻止control+ alt+ delete组合键以防止学生最小化/关闭应用程序.
使用PInvoke对我来说没问题.
我知道这肯定是可能的,因为我看到有三个应用程序这样做.它们都是专有的,所以我无法知道它是如何完成的.
Tar*_*mán 26
我发现了一种非常难看的方式(效果很好).如果我独占打开taskmgr.exe,那么当用户按下Ctrl + Alt + Del时没有任何反应.
FileStream fs = new FileStream(System.IO.Path.Combine(Environment.SystemDirectory, "taskmgr.exe"), FileMode.Open, FileAccess.ReadWrite, FileShare.None);
Run Code Online (Sandbox Code Playgroud)
我最喜欢这个解决方案,它没有永久性的影响.例如,如果应用程序被杀死,则Ctrl + Alt + Del将再次运行.
缺点:必须启用欢迎屏幕,否则将弹出Windows安全性而不是Windows尝试打开taskmgr并静默失败.(→如果计算机位于域中,它也将无法工作,因为在域中会禁用"欢迎"屏幕.)
(当然这不适用于Vista或W7.)
Ski*_*izz 15
对于Windows XP,正确的方法是创建自己的图形标识和身份验证动态链接库,或简称gina.dll.这是一篇关于它的MSDN文章.此DLL导出一组与Winlogon进程交互的函数,并为登录请求提供用户界面 - Secure Action Sequence事件.主登录请求是ctrl-alt-delete响应.标准gina.dll调用登录屏幕或任务管理器/注销对话框.创建自己的gina并不困难,但它确实需要C/C++编码而不是C#,并且很容易使系统无法启动.这并不能阻止人们在启动时按F8并选择安全启动选项,该选项不会加载自定义gina.dll.
编辑:我还应该说你不需要实现gina需要实现的所有功能,你可以动态加载以前的gina.dll并将你不感兴趣的所有调用传递给旧的gina.dll .
编辑2:这不适用于Vista/Win7,因为他们改变了登录过程的架构.仍然可以在Vista/Win7中禁用ctrl-alt-delete,但它需要一个不同的机制 - 有关于它的MSDN文章.
编辑3:这是一个ZIP文件,其中包含制作gina.dll的源代码.它是使用DevStudio 2005构建的.文件GinaInterface.cpp详细说明了安装新gina.dll库所需的步骤.这将禁用"欢迎"屏幕并将其替换为"按crtl-alt-del"登录对话框.就目前而言,这与标准gina.dll没有区别,所有与gina相关的调用都会传递给原始的gina.dll文件(在Windows\System32文件夹中称为msgina.dll).要禁用ctrl-alt-del键,请更新GinaInterface.cpp中的函数WlxLoggedOnSAS.要在应用程序运行时停止ctrl-alt-del,可以创建一个命名的互斥锁(CreateMutex)并测试它在gina.dll中的存在,如果互斥锁存在则停止ctrl-alt-del.
Mat*_*ren 12
正如其他人提到它很难阻止Ctrl- - Alt,Del因为它是Windows安全的基本组成部分.
然而,你可以阻止什么之后就可以完成Ctrl- Alt- Del已经通过添加以下注册表项推动.
HKEY_CURRENT_USER \软件\微软\的Windows\CurrentVersion \政策\系统
HKEY_CURRENT_USER\SOFTWARE \微软\的Windows\CurrentVersion \政策\ Explorer中
如果你这样做,那么当你推Ctrl- Alt- Del你会得到如下的对话(在XP下):

这不是万无一失的,但它会阻止用户做一些基本的事情.
更新:刚刚意识到这也阻止了Ctrl- Shift- Esc我以前没有意识到.
您可以预先运行隐藏进程taskmgr.exe
ProcessStartInfo psi = new ProcessStartInfo(System.IO.Path.Combine(Environment.SystemDirectory, "taskmgr.exe"));
psi.RedirectStandardOutput = false;
psi.WindowStyle = ProcessWindowStyle.Hidden;
psi.UseShellExecute = true;
processTaskMgr = Process.Start(psi);
Run Code Online (Sandbox Code Playgroud)