首页 > 代码库 > 工具开发系列之:通过程序句柄操作程序

工具开发系列之:通过程序句柄操作程序

    最近做了个C/S系统,是一个包含ToolBox的程序,大致的功能是在系统使用过程当中包含了该系统提供公众工具,协同完成工作。说白了就是调用一些自己开发的或是第三方的应用程序。

    于是在使用过程当中,有效的协调对应的进程及线程就是比较常见的问题了,这里说一个简单的例子如何去隐藏一个程序工具。

句柄

句柄,是整个Windows编程的基础。一个句柄是指使用的一个唯一的整数值,即一个4字节(64位程序中为8字节)长的数值,来标识应用程序中的不同对象和同类对象中的不同的实例,诸如,一个窗口,按钮,图标,滚动条,输出设备,控件或者文件等。应用程序能够通过句柄访问相应的对象的信息,但是句柄不是一个指针,程序不能利用句柄来直接阅读文件中的信息。如果句柄不用在I/O文件中,它是毫无用处的。 句柄是Windows用来标志应用程序中建立的或是使用的唯一整数,Windows使用了大量的句柄来标志很多对象。--摘自《百度百科》

 

获取句柄

获取句柄的方式有很多,这里以最简单的方式去实现,通过进程名称:

static IntPtr mainWindowHander;        private void GetProcess(string handlerName)        {            Process[] allProcesses = Process.GetProcesses();            foreach (Process p in allProcesses)            {                //进程名是在任务管理器里可以看到,这里不一样要修改一下。                if (p.ProcessName == handlerName)                {                    mainWindowHander = p.MainWindowHandle;                    break;                }            }            if (mainWindowHander == IntPtr.Zero)            {                Process p = new Process();                p.StartInfo.FileName = @"C:\Notpad\" + handlerName + ".exe"; //程序地址,改成你们自己的。                p.Start();                Thread.Sleep(3000);  //这里是笨方法,要等待3秒,以免进程还没有启动就获取句柄。                mainWindowHander = p.MainWindowHandle;            }        }

控制对应程序的显示/隐藏:

        [DllImport("user32.dll")]        private static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow);        private const int SW_HIDE = 0; //常量,隐藏        private const int SW_SHOWNORMAL = 1; //常量,显示,标准状态        private const int SW_SHOWMINIMIZED = 2; //常量,显示,最小化        private const int SW_SHOWMAXIMIZED = 3; //常量,显示,最大化        private const int SW_SHOWNOACTIVATE = 4;//常量,显示,不激活        private const int SW_RESTORE = 9; //常量,显示,回复原状        private const int SW_SHOWDEFAULT = 10;//常量,显示,默认        private void ToChange(IntPtr p, bool isboolean)        {            if (isboolean)            {                ShowWindowAsync(p, SW_SHOWNORMAL);            }            else            {                ShowWindowAsync(p, SW_HIDE);            }        }

使用界面:

Code:

private void btnHide_Click(object sender, EventArgs e)        {            exeName = txtHandlerName.Text;            GetProcess(exeName);            if (mainWindowHander != IntPtr.Zero) {                ToChange(mainWindowHander,false);            }        }