当前位置: 代码迷 >> C# >> [C#]怎的在任务管理器中隐藏主程序的进程名
  详细解决方案

[C#]怎的在任务管理器中隐藏主程序的进程名

热度:37   发布时间:2016-05-05 03:17:31.0
[C#]怎样在任务管理器中隐藏主程序的进程名?
众所周知程序被比如说任务管理器强行关闭之后,托盘的图标会残留。
于是,费了很多周折调用了N多API之后,写出了刷新残留图标的代码,包括win7托盘的可见部分和隐藏部分的残留图标。
结果只能在程序启动时判断,如果有上次残留的图标就删掉。
然后开始看“守护进程”
看了大半天做出来了,在控制台项目中用 CreateProcess 将窗体项目程序作为子进程打开,然后 WaitForSingleObject
子进程正常关闭或者被强制关闭之后,我就可以调用之前写好的刷新图标功能了(因为只有一个图标提示文字作为参数)
然后废话说了这么多,现在有两个问题:

1.怎样隐藏“守护进程”,让它不要出现在任务管理器的进程列表中
2.第一个问题没解决掉的话,如果“守护进程”被关闭了,子进程还是在的,所以怎么检测守护进程的关闭然后重新打开,我的想法是用守护进程的守护进程来打开守护进程。。。

另外能不能不用新建一个控制台应用程序,直接在窗体项目的 Program.cs中用调用编译好的窗体程序?这样会不会导致循环调用然后失败,或者说这样的话窗体程序相当于不存在了,我没啥好的想法了。

这个是控制台程序也就是守护进程的代码:

            //子进程启动信息设置
            STARTUPINFO si = new STARTUPINFO();
            si.cb = Marshal.SizeOf(si);
            ProcessAPI.GetStartupInfo(out si);
            si.wShowWindow = SW_SHOWNORMAL;
            //si.dwFlags = STARTF_USESHOWWINDOW;

            // 运行子进程并等待其结束  
            SECURITY_ATTRIBUTES sa = new SECURITY_ATTRIBUTES();
            PROCESS_INFORMATION pi;
            ProcessAPI.CreateProcess(
                "../../../窗体/bin/debug/窗体.exe",
                "", ref sa, ref sa, false, 0, new IntPtr(), null, ref si, out pi);
            ProcessAPI.WaitForSingleObject(pi.hProcess, INFINITE);

            // 获取子进程返回值  
            uint pdwExitCode;
            bool flag = ProcessAPI.GetExitCodeProcess(pi.hProcess, out pdwExitCode);

            ProcessAPI.CloseHandle(pi.hProcess);

            if (flag)
            {
                Console.WriteLine("program exit with code {0}", pdwExitCode);
            }
            else
            {
                Console.WriteLine("Error: {0}", new System.ComponentModel.Win32Exception(Marshal.GetLastWin32Error()).Message);
            }

如果放到窗体程序里感觉会简单很多也不用那么蛋疼的路径

主要是想知道第一个问题的解决方法。

另外如果有对托盘图标很强迫症的也可以一起讨论下更好的解决办法。
------解决思路----------------------
蛋疼的需求
既然用户想强制用任务管理器结束进程,那么他自己鼠标放到残留的图标上面,图标不就消失了
------解决思路----------------------
1.怎样隐藏“守护进程”,让它不要出现在任务管理器的进程列表中
最好不要有这样的想法,你这是在做病毒

2.第一个问题没解决掉的话,如果“守护进程”被关闭了,子进程还是在的,所以怎么检测守护进程的关闭然后重新打开,我的想法是用守护进程的守护进程来打开守护进程。。。
你的守护进程可以与主进程相互守护,而不是必须用第3个程序监视第2个程序,那样就没完没了了
------解决思路----------------------
你的守护进程怎么查询窗体进程的,反过来也就怎样查询。
------解决思路----------------------
遍历进程列表,如果没有找到你的守护进程,就启动它
------解决思路----------------------
引用:
模仿QQ把守护进程名称改为  svchost.exe 


有什么根据说这个话吗?
------解决思路----------------------
引用:
模仿QQ把守护进程名称改为  svchost.exe 得了,反正被关了也就是窗体程序强制关闭后图标无法正常消失而已不管了,结贴。

你这还是在做病毒的思路啊
不要胡乱的把进程名改为系统进程名啊
------解决思路----------------------
你想用管道传递消息,思路是可行的
就是不管进程是否还存在,只要它"死住"了,也就是通信异常了,那么就再启动一个进程

你可以在守护程序里也加个参数啊
如果是被主进程启动的,那么就不要再次启动主进程了
如果是双击exe文件启动的,那么就启动主进程
------解决思路----------------------
其实用定时查询,也并不浪费多少CPU啊
进程列表里一共能有多少进程,100个顶天了吧
而且也没有必要每毫秒都轮询一次
每秒甚至每5秒检测一次足够了
------解决思路----------------------
关键问题是你应该使用timer这种机制
而不是用个线程死循环
否则浪费CPU就不是检测进程的时候浪费了,而是不检查进程的时候才是在浪费
------解决思路----------------------
引用:
嗯。我的思路是运行守护进程程序时,先判断主程序是否在运行,如果没运行就 CreateProcess,如果在运行就 OpenProcess;同时也判断下自己是否已经在运行了,这样的话问题就都解决了。一开始我以为只有 CreateProcess 才能在后面加 WaitForSingleObject,刚才查了下 OpenProcess 也行的。
另外作为一只编程菜鸟,我最近用过WinAPI之后,甚至都不想用 C#封装好的命名空间里的东西了,这个不知道有没有什么不好的影响。。

不好的影响就是,你换个操作系统,API可能不一样的
  相关解决方案