标签:style class blog code http tar
最近做了个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); } }
工具开发系列之:通过程序句柄操作程序,布布扣,bubuko.com
标签:style class blog code http tar
原文地址:http://www.cnblogs.com/xiguain/p/3795095.html