关于 Windows7 系统使用安全桌面导致产生一大堆CtfMon.exe 的解决办法

folder_open
comment1条评论

前几天当我还沉浸在学会怎样产生安全桌面并在里面放置登录事务的时候,在一次例行测试过程中我发现,如果在纯净版(使用官方镜像安装,没有打过补丁。之所以强调纯净版,是因为不排除微软会发布补丁修复这个问题的可能性)的Windows7上面生成安全桌面,会随之产生一个CtfMon.exe进程,但是当我们关闭了安全桌面的时候,这个进程不会被关闭,我测试了8次程序,进程列表里就出现了9个CtfMon(原本用户桌面上的那个当然也要算在内了),这怎么能行?要怎样解决这个问题?

直接Kill进程?

刚开始我的想法是:如果系统不自动关闭这个进程,那我就用程序把它给关了呗,于是就有了下面这段代码

我把这段代码插入到程序里面,当然,程序结束的时候CtfMon就不见了,可是随之而来的问题就是,我原桌面上的CtfMon也不见了,输入法都切换不了……这当然不行了。

那其他程序是怎么做的?

我一直在使用KeePass来作为我的密码管理工具,新版本的KeePass使用了c#作为编写语言,而它的登录窗口就使用到了安全桌面(前提是在设置里面启用了安全桌面登录),它是怎么做的呢?

于是我仔细观察了它的源代码,发现了下面这段话:

// Creating a window on the new desktop spawns a CtfMon.exe child
// process by default. On Windows Vista, this process is terminated
// correctly when the desktop is closed. However, on Windows 7 it
// isn’t terminated (probably a bug); creating multiple desktops
// accumulates CtfMon.exe child processes.

这段话大概的意思就是:默认状态下,在新桌面创建一个窗口会产生一个CtfMon.exe的子进程,在Vista下关闭桌面,这个进程也会随之结束,但是在Windows7下却不会(可能是个bug),会导致产生一大堆CtfMon子进程……

看来他们早就注意到这个问题了,他们自己写了一个叫做ChildProcessesSnapshot的类,它的大概原理就是在你初始化这个类的时候会产生一个进程快照,然后再调用他的TerminateNewChildsAsync,会将快照之后的进程结束掉,这样就避免了原本进程被K掉的情况。

于是我就把这个ChildProcessesSnapshot类搬来试试(没有直接完整复制过来,因为牵涉到了很多相关联的类,我稍稍整理了一下,原本的代码可以前往sourceforge参阅)

使用方法很简单:

经测试果然比较奏效(再次佩服一下这些大牛的思考能力)。

当然了,这个类肯定还可以衍生出很多用法,灵活运用嘛…

当然,记得在分享的时候别删掉他们的版权信息,这也算是对原作者的一种尊重。

Tags:

看看其他

1条评论. Leave new

  • […] PS:我在使用的过程中发现在某些Win7系统中(Win8.1和Win10经测试没有发现这个问题),打开一次桌面就会打开一个输入法管理器进程(CtfMon.exe),而桌面关闭了以后它不会关闭,这样可能会出现进程中有好几个甚至N多CtfMon,要怎么解决这个问题呢?这个我们就到这篇文章里面去讨论吧。 […]

    回复

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

Fill out this field
Fill out this field
请输入有效的电子邮箱地址。