Win7下如何屏蔽ctrl+alt+del键?

hook什么的已经失效了,而且将winlogon.exe挂起的方法有问题(挂起中按下ctrl+alt+del,再恢复时弹出了界面),请问还有别的方法没?不要汇编的,只要vc的

5个回答

win7下,登录页面是无法通过hook屏蔽的,因为系统登录页面会优先获取到组合键。我之前用过一个方法可以屏蔽ALT+CTRL+DEL,就是注入方式锁定登录页面管理进程**winlogon**,但是如果按了组合键只是暂时不触发,锁定解除后,还会继续触发。在某些情况下,还会造成卡登陆页面。所以我建议你通过注入方式锁定explorer进程,会好一点。进程锁定代码如下

 public static class ProcessFrozenController
    {
        private const int THREADACCESS_SUSPEND_RESUME = 0x0002;

        [DllImport("kernel32.dll", SetLastError = true)]
        private static extern IntPtr OpenThread(uint dwDesiredAccess, bool bInheritHandle, uint threadId);

        [DllImport("kernel32.dll", SetLastError = true)]
        private static extern int SuspendThread(IntPtr hThread);

        [DllImport("kernel32.dll", SetLastError = true)]
        private static extern int ResumeThread(IntPtr hThread);

        [DllImport("kernel32.dll")]
        private static extern uint GetLastError();

        [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
        private static extern bool CloseHandle(IntPtr hobject);

        public static bool FreezeProcess(string processName, ref string msg)
        {
            Process[] processArray = Process.GetProcesses();
            Process operateProcess = null;

            foreach (Process p in processArray)
            {
                if (p.ProcessName.ToLower().Trim() != processName) continue;

                operateProcess = p;
                break;
            }

            if (operateProcess == null)
            {
                msg = "未找到进程";
                return false;
            }

            List<ProcessThread> handledList = new List<ProcessThread>();
            foreach (ProcessThread pthd in operateProcess.Threads)
            {
                if (SuspendProcessThread(pthd))
                {
                    handledList.Add(pthd);
                    continue;
                }

                foreach (ProcessThread hpthd in handledList)
                {
                    ResumeProcessThread(hpthd);
                }

                msg = "冻结进程失败";
                return false;
            }
            operateProcess.Dispose();

            return true;
        }

        public static void UnfreezeProcess(string processName)
        {
            Process[] processArray = Process.GetProcesses();
            Process operateProcess = null;

            foreach (Process p in processArray)
            {
                if (p.ProcessName.ToLower().Trim() != processName) continue;

                operateProcess = p;
                break;
            }

            if (operateProcess == null)
            {
                return;
            }

            foreach (ProcessThread thd in operateProcess.Threads)
            {
                ResumeProcessThread(thd);
            }
            operateProcess.Dispose();
        }

        #region 私有函数

        private static bool SuspendProcessThread(ProcessThread thread)
        {
            IntPtr threadHandle = OpenThread(THREADACCESS_SUSPEND_RESUME, false, (uint)thread.Id); // Open thread with required permissions
            if (threadHandle == IntPtr.Zero) // If thread pointer is zero, means that the 'OpenThread' function has failed
            {
                return false;
            }
            if (SuspendThread(threadHandle) == -1) // If the result is -1, the funtion has failed
            {
                CloseHandle(threadHandle);
                return false;
            }
            CloseHandle(threadHandle);
            return true;
        }

        private static bool ResumeProcessThread(ProcessThread thread)
        {
            IntPtr threadHandle = OpenThread(THREADACCESS_SUSPEND_RESUME, false, (uint)thread.Id); // Open thread with required permissions
            if (threadHandle == IntPtr.Zero) // If thread pointer is zero, means that the 'OpenThread' function has failed
            {
                return false;
            }
            if (ResumeThread(threadHandle) == -1) // If the result is -1, the funtion has failed
            {
                CloseHandle(threadHandle);
                return false;
            }
            CloseHandle(threadHandle); // Don't forget close thread handle
            return true;
        }

        #endregion
    }

jok_219
jok_219 回复yangbo50304: 你需要在操作系统下打开硬盘?如果是用代码获取硬盘文件,应该没问题的。
接近 5 年之前 回复
yangbo50304
yangbo50304 谢谢你的帮助,不过把explorer.exe进程卡主的话,我的某些打开硬盘的功能就不好使了!!
接近 5 年之前 回复
yangbo50304
yangbo50304 挂起有问题,在挂起中按下ctrl+alt+del,再恢复后就弹出来了。
接近 5 年之前 回复
yangbo50304
yangbo50304 这个应该就是挂起吧?
接近 5 年之前 回复

是进程冻结与解冻

管用,Win7和XP系统下都可以屏蔽Ctrl+Alt+Del。但是在解冻winlogon.exe时,会自动弹出系统界面(就是手工按Ctrl+Alt+Del出来的那个界面)。

你试试抓取一个弹出界面的handle,然后通过sendmessage把窗口隐藏

yangbo50304
yangbo50304 我看代码了,是suspendthread,你说的获取win登录的handle,怎么获取?enumwindow?
接近 5 年之前 回复

如果要禁用任务管理器
http://jingyan.baidu.com/article/cbf0e500eafe592eaa2893c4.html

如果实在是想禁止。
可以hook按键 del 键。 接收到del按键 消息判断 ctrl和alt是否按下。 如果按下 那么发送 keybd_event 弹起。
不知道可行不。

wawd74520
失落的神庙 回复yangbo50304: 替换掉系统的欢迎界面。
接近 5 年之前 回复
yangbo50304
yangbo50304 不光是任务管理器的问题,是整个系统的登录界面不想让他显示。
接近 5 年之前 回复
wawd74520
失落的神庙 回复yangbo50304: 或者直接替换掉系统的任务管理器
接近 5 年之前 回复
yangbo50304
yangbo50304 Win7下hook已经不好使了。
接近 5 年之前 回复

们经过加工加工环节改价格

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问