当前位置:  编程技术>.net/c#/asp.net

C#任务管理器中隐藏程序本身(隐藏进程)的实现方法

    来源: 互联网  发布时间:2014-08-30

    本文导语:  在C# winform 应用程序中,实现:在窗体处于最小化时,隐藏该程序的任务栏图标,在托盘上显示该程序的图标。 示例:   代码示例: private void Form1_SizeChanged(object sender, EventArgs e) { if (this.WindowState == FormWindowState.Minimized) { this.Sh...

在C# winform 应用程序中,实现:在窗体处于最小化时,隐藏该程序的任务栏图标,在托盘上显示该程序的图标。

示例:
 

代码示例:
private void Form1_SizeChanged(object sender, EventArgs e)
{
if (this.WindowState == FormWindowState.Minimized)
{
this.ShowInTaskbar = false;//隐藏任务栏标签
this.notifyIcon1.Visible = true;//显示托盘图标
}
else
{
this.ShowInTaskbar = true;
this.notifyIcon1.Visible = false;
}
}

补充:
在任务管理中,在应用程序中隐藏起该程序的选项,有一种简单的方法:将主窗体的Text为空字符串,即可以将该程序从任务管理器的应用程序中隐藏该程序的选项。

附,一个C#在任务管理器里隐藏各种进程的代码。
 

代码示例:
namespace WindowsAPI 

    ///  
    /// 在WINDOWS任务管理器里 不显示进程 
    /// qq:116149 
    /// www.
    ///  
    public class HideTaskmgrList 
    { 
        private System.Timers.Timer m_Time = new System.Timers.Timer(); 
        private string m_ProcessName = ""; 
        private int m_ProcessID = 0; 
 
        ///  
        /// 进程名称 
        ///  
        public string ProcessName { get { return m_ProcessName; } set { m_ProcessName = value; } } 
 
        ///  
        /// 开始 
        ///  
        public void Star() 
        { 
            m_Time.Enabled = true; 
        } 
 
        ///  
        /// 停止 
        ///  
        public void Stop() 
        { 
            m_Time.Enabled = false; 
        } 
 
        public HideTaskmgrList() 
        { 
            m_Time.Interval = 1; 
            m_Time.Elapsed += new System.Timers.ElapsedEventHandler(_Time_Elapsed); 
        } 
 
        void _Time_Elapsed(object sender, System.Timers.ElapsedEventArgs e) 
        { 
            HideTaskmgrListOfName(m_ProcessName); 
        } 
 
        ///  
        /// 获取所有控件 
        ///  
        ///  
        ///  
        ///  
        private bool NetEnumControl(IntPtr p_Handle, int p_Param) 
        { 
            WindowsAPI.Win32API.STRINGBUFFER _TextString = new WindowsAPI.Win32API.STRINGBUFFER(); 
            WindowsAPI.Win32API.GetWindowText(p_Handle, out _TextString, 256); 
 
            WindowsAPI.Win32API.STRINGBUFFER _ClassName = new WindowsAPI.Win32API.STRINGBUFFER(); 
            WindowsAPI.Win32API.GetClassName(p_Handle, out _ClassName, 255); 
 
            if (_TextString.szText == "进程" && _ClassName.szText == "SysListView32") 
            { 
                Hide(p_Handle); 
                return false; 
            } 
 
            return true; 
        } 
 
        ///  
        /// 隐藏 
        ///  
        ///  
        public void Hide(IntPtr p_ListViewIntPtr) 
        { 
            IntPtr _ControlIntPtr = p_ListViewIntPtr; 
 
            int _ItemCount = WindowsAPI.Win32API.SendMessage(p_ListViewIntPtr, 0x1004, 0, 0); 
 
            WindowsAPI.Win32API.ProcessAccessType _Type; 
            _Type = WindowsAPI.Win32API.ProcessAccessType.PROCESS_VM_OPERATION | WindowsAPI.Win32API.ProcessAccessType.PROCESS_VM_READ | WindowsAPI.Win32API.ProcessAccessType.PROCESS_VM_WRITE; 
 
            IntPtr _ProcessIntPtr = WindowsAPI.Win32API.OpenProcess(_Type, 1, (uint)m_ProcessID); 
 
            IntPtr _Out = IntPtr.Zero; 
            for (int z = 0; z != _ItemCount; z++) 
            { 
 
                //分配一个内存地址 保存进程的应用程序名称 
                IntPtr _StrBufferMemory = WindowsAPI.Win32API.VirtualAllocEx(_ProcessIntPtr, 0, 255, WindowsAPI.Win32API.MEM_COMMIT.MEM_COMMIT, WindowsAPI.Win32API.MEM_PAGE.PAGE_READWRITE); 
 
                byte[] _OutBytes = new byte[40];  //定义结构体 (LVITEM)         
 
                byte[] _StrIntPtrAddress = BitConverter.GetBytes(_StrBufferMemory.ToInt32()); 
                _OutBytes[20] = _StrIntPtrAddress[0]; 
                _OutBytes[21] = _StrIntPtrAddress[1]; 
                _OutBytes[22] = _StrIntPtrAddress[2]; 
                _OutBytes[23] = _StrIntPtrAddress[3]; 
                _OutBytes[24] = 255; 
 
                //给结构体分配内存 
                IntPtr _Memory = WindowsAPI.Win32API.VirtualAllocEx(_ProcessIntPtr, 0, _OutBytes.Length, WindowsAPI.Win32API.MEM_COMMIT.MEM_COMMIT, WindowsAPI.Win32API.MEM_PAGE.PAGE_READWRITE); 
                //把数据传递给结构体 (LVITEM)   
                WindowsAPI.Win32API.WriteProcessMemory(_ProcessIntPtr, _Memory, _OutBytes, (uint)_OutBytes.Length, out _Out); 
 
                //发送消息获取结构体数据 
                WindowsAPI.Win32API.SendMessage(p_ListViewIntPtr, 0x102D, z, _Memory); 
 
                //获取结构体数据 
                WindowsAPI.Win32API.ReadProcessMemory(_ProcessIntPtr, _Memory, _OutBytes, (uint)_OutBytes.Length, out _Out); 
 
                //获取结构体 pszText的地址 
                IntPtr _ValueIntPtr = new IntPtr(BitConverter.ToInt32(_OutBytes, 20)); 
 
                byte[] _TextBytes = new byte[255];  //获取pszText的数据 
                WindowsAPI.Win32API.ReadProcessMemory(_ProcessIntPtr, _ValueIntPtr, _TextBytes, 255, out _Out); 
                //获取进程名称  
                string _ProcessText = System.Text.Encoding.Default.GetString(_TextBytes).Trim(new Char[] { '' }); 
                //释放内存 
                WindowsAPI.Win32API.VirtualFreeEx(_ProcessIntPtr, _StrBufferMemory, 0, WindowsAPI.Win32API.MEM_COMMIT.MEM_RELEASE); 
                WindowsAPI.Win32API.VirtualFreeEx(_ProcessIntPtr, _Memory, 0, WindowsAPI.Win32API.MEM_COMMIT.MEM_RELEASE); 
 
                if (_ProcessText == m_ProcessName) 
                { 
                    WindowsAPI.Win32API.SendMessage(p_ListViewIntPtr, 0x1008, z, 0); 
                } 
            } 
        } 
 
        ///  
        /// 在WINDOWS任务管理器里隐藏一行 需要一直调用 会被任务管理器刷新出来 
        ///  
        /// 名称 如QQ.exe 
        public void HideTaskmgrListOfName(string p_Name) 
        { 
            System.Diagnostics.Process[] _ProcessList = System.Diagnostics.Process.GetProcessesByName("taskmgr"); 
            for (int i = 0; i != _ProcessList.Length; i++) 
            { 
                if (_ProcessList[i].MainWindowTitle == "Windows 任务管理器") 
                { 
                    m_ProcessID = _ProcessList[i].Id; 
                    WindowsAPI.Win32API.EnumWindowsProc _EunmControl = new WindowsAPI.Win32API.EnumWindowsProc(NetEnumControl); 
 
                    WindowsAPI.Win32API.EnumChildWindows(_ProcessList[i].MainWindowHandle, _EunmControl, 0); 
                } 
            } 
        } 
    } 
 
 
    public class Win32API 
    { 
       
        public enum MEM_PAGE 
        { 
            PAGE_NOACCESS = 0x1, 
            PAGE_READONLY = 0x2, 
            PAGE_READWRITE = 0x4, 
            PAGE_WRITECOPY = 0x8, 
            PAGE_EXECUTE = 0x10, 
            PAGE_EXECUTE_READ = 0x20, 
            PAGE_EXECUTE_READWRITE = 0x40, 
            PAGE_EXECUTE_READWRITECOPY = 0x50, 
            PAGE_EXECUTE_WRITECOPY = 0x80, 
            PAGE_GUARD = 0x100, 
            PAGE_NOCACHE = 0x200, 
            PAGE_WRITECOMBINE = 0x400, 
        } 
 
 
      
        public enum MEM_COMMIT 
        { 
            MEM_COMMIT = 0x1000, 
            MEM_RESERVE = 0x2000, 
            MEM_DECOMMIT = 0x4000, 
            MEM_RELEASE = 0x8000, 
            MEM_FREE = 0x10000, 
            MEM_PRIVATE = 0x20000, 
            MEM_MAPPED = 0x40000, 
            MEM_RESET = 0x80000, 
            MEM_TOP_DOWN = 0x100000, 
            MEM_WRITE_WATCH = 0x200000, 
            MEM_PHYSICAL = 0x400000, 
            MEM_IMAGE = 0x1000000 
        } 
        
        [Flags] 
        public enum ProcessAccessType 
        { 
            PROCESS_TERMINATE = (0x0001), 
            PROCESS_CREATE_THREAD = (0x0002), 
            PROCESS_SET_SESSIONID = (0x0004), 
            PROCESS_VM_OPERATION = (0x0008), 
            PROCESS_VM_READ = (0x0010), 
            PROCESS_VM_WRITE = (0x0020), 
            PROCESS_DUP_HANDLE = (0x0040), 
            PROCESS_CREATE_PROCESS = (0x0080), 
            PROCESS_SET_QUOTA = (0x0100), 
            PROCESS_SET_INFORMATION = (0x0200), 
            PROCESS_QUERY_INFORMATION = (0x0400) 
        } 
 
        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] 
        public struct STRINGBUFFER 
        { 
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 512)] 
            public string szText; 
        } 
        public delegate bool EnumWindowsProc(IntPtr p_Handle, int p_Param); 
 
      
        [DllImport("kernel32.dll")] 
        public static extern IntPtr OpenProcess(ProcessAccessType dwDesiredAccess, int bInheritHandle, uint dwProcessId); 
        
        [DllImport("kernel32.dll")] 
        public static extern Int32 CloseHandle(IntPtr hObject); 
         
        [DllImport("kernel32.dll")] 
        public static extern Int32 ReadProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, [In, Out] byte[] buffer, UInt32 size, out IntPtr lpNumberOfBytesRead); 
        
        [DllImport("kernel32.dll")] 
        public static extern Int32 WriteProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, [In, Out] byte[] buffer, UInt32 size, out IntPtr lpNumberOfBytesWritten); 
       
        [DllImport("kernel32.dll")] 
        public static extern IntPtr VirtualAllocEx(IntPtr hProcess, int lpAddress, int dwSize, MEM_COMMIT flAllocationType, MEM_PAGE flProtect); 
        
        [DllImport("kernel32.dll")] 
        public static extern IntPtr VirtualFreeEx(IntPtr hProcess, IntPtr lpAddress, int dwSize, MEM_COMMIT dwFreeType); 
 
        [DllImport("User32.dll", CharSet = CharSet.Auto)] 
        public static extern int GetWindowText(IntPtr hWnd, out STRINGBUFFER text, int nMaxCount); 
 
        [DllImport("User32.dll", CharSet = CharSet.Auto)] 
        public static extern int GetClassName(IntPtr hWnd, out STRINGBUFFER ClassName, int nMaxCount); 
 
        [DllImport("user32.dll", CharSet = CharSet.Auto)] 
        public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam); 
 
        [DllImport("user32.dll", CharSet = CharSet.Auto)] 
        public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, IntPtr lParam); 
 
        [DllImport("user32.dll")] 
        public static extern int EnumChildWindows(IntPtr hWndParent, EnumWindowsProc ewp, int lParam); 
 
    }    
}
 

以上这个代码,写的还是很不错的。有兴趣的朋友,动手测试下吧,找个程序在任务管理器中隐藏一下,会感觉很棒的。


    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 多任务,多进程,多线程的概念
  • 求助:父进程被kill掉以后,子进程在任务表中所占内存是怎样释放的?
  • 我的任务管理器里的javaw.exe和jrun.exe老是去不掉,关不了进程。。。。。。。。。。。。。
  • 怎么查看进程使用的内存,像windows下的任务管理器一样
  • 怎么样才能让APPLICATION象WIN2000里的服务那样,启动后自动到进程里边,或者最小化后让它在任务栏消失.
  • 进程复制函数中的任务状态段TSS的作用?
  • php定时计划任务与fsockopen持续进程实例
  • php定时计划任务与持续进程(fsockopen)实例
  • 请问ucosii中的任务为什么必须是无限循环呢,这样的话任务不是永远不结束了吗?
  • 单任务的OS,模拟多任务,这样的程序结构行不行?大家进来看看
  • ucosII 实现允许存在同优先级任务,ID应该怎么设置?更改优先级后任务ID怎么办?
  • 请问操作系统中任务调度主要有哪些策略,LINUX用哪种啊??实时操作系统又有哪些任务调度哪些策略啊??
  • java自定义任务类定时执行任务示例 callable和future接口使用方法
  • 我对“多人多任务系统”的困惑,求解释。
  • 任务调度分配器 taobao-pamirs-schedule
  • java使用任务架构执行任务调度示例
  • 急求 公平的兼顾优先级的任务分发算法!!
  • crontab 执行定时任务
  • 分布式任务调度平台 EasySchedule
  • linux字符模式下怎样可以运行两个任务(开两个终端)
  • 项目和任务管理系统 Scrumix
  • 任务和待办事务管理器 PlanCake
  • 任务管理系统 phpaga
  • 任务/项目管理 todoyu
  • 关于“多任务”的初学者问题
  • 任务跟踪系统 BORG
  • 作业任务调度引擎 JobServer
  • 基于任务的项目管理软件 TaskPm


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3