WinForm程序防止被调用
来源:互联网 发布:美国二战知乎 编辑:程序博客网 时间:2024/05/23 01:14
这是去年我在CSDN上给人回答的一个问题,如何防止程序被其他应用程序调用,只能双击打开。
WinForm是Windows下的程序,所以,可以通过判断父进程是否是explorer来达到这个目的,当时测试,是可行的,也引来了很多争论,有说判断传参的什么的,其实我觉得还是通过判断父进程来做会好一些,虽然也不是绝对安全的。
using System;using System.Collections.Generic;using System.Linq;using System.Windows.Forms;using System.Diagnostics;using System.Management; namespace 不允许外部调用{ static class Program { /// <summary> /// 应用程序的主入口点。 /// </summary> [STAThread] static void Main(string[] args) { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Process proc = Process.GetCurrentProcess(); if (!FillDetailUseWmi(proc.Id).ToLower().Equals("explorer".ToLower())) { MessageBox.Show("该程序禁止外部程序调用。"); Application.ExitThread(); } else { Application.Run(new Form1()); } } //// <summary> /// 使用Wmi获取指定进程的创建者等信息 /// </summary> /// <param name="pID">进程ID</param> private static string FillDetailUseWmi(int pID) { string pname = string.Empty; ManagementObjectSearcher searcher = new ManagementObjectSearcher("Select * From Win32_Process Where ProcessID=" + pID); ManagementObjectCollection moc = searcher.Get(); ManagementOperationObserver observer = new ManagementOperationObserver(); HandleObjectReady hor = new HandleObjectReady(); //监测异步方法是否已成功返回 observer.ObjectReady += new ObjectReadyEventHandler(hor.Done); foreach (ManagementObject mo in moc) { //异步调用该对象的GetOwner方法,获取进程创建者 mo.InvokeMethod(observer, "GetOwner", null); //等待异步调用返回 while (!hor.Complete) { System.Threading.Thread.Sleep(500); } string user = ""; //判断获取用户名的操作是否成功 if (hor.Obj["returnValue"].ToString() == "0") { user = hor.Obj.Properties["User"].Value.ToString(); } if (mo["ParentProcessID"] != null ) { //根据父进程ID获取父进程名称 int vpID=Convert.ToInt32(mo["ParentProcessID"]); pname = Process.GetProcessById(vpID).ProcessName; } } //释放资源 searcher.Dispose(); searcher = null; moc.Dispose(); moc = null; observer = null; hor = null; return pname; } /**/ /// <summary> /// 该类用于监测Wmi异步调用方法是否已经返回 /// </summary> public class HandleObjectReady { private bool complete = false; private ManagementBaseObject obj; public void Done(object sender, ObjectReadyEventArgs e) { complete = true; obj = e.NewObject; } public bool Complete { get { return complete; } } public ManagementBaseObject Obj { get { return obj; } } } }}
需要添加.Net引用 System.Management。
是我Google搜索C#制做进程监视器后找到一个帖子,获得灵感,写了这么个方法,基本上是可以满足条件的。
感觉现在CSDN上喷子也很多了,唉,素质越来越差了,当自己是高手是大牛,其实什么都不是,太自以为是。
总觉得自己的方法是好的,是对的,瞧不上的都是垃圾,可是并不知道什么叫做需求。
已经有一年没上CSDN了,这阵子又赶上密码泄漏的事件,还好,没我的在里面,不过CSDN说那是2009年的一个备份,但是我是在2007年注册的CSDN,不可信啊。万幸万幸,没我的。
原文地址:http://luacloud.com/2011/winform-program-is-invoked-to-prevent.html- WinForm程序防止被调用
- winform程序防止重复运行
- C# winform程序防止前台卡死
- Winform 调用WebService程序 图文
- 防止程序被多次重复调用的代码
- VS2005 WInform程序如何调用js
- C#中Winform程序调用WebService服务
- C#中Winform程序调用WebService方法
- Winform程序中调用cmd命令
- C#中Winform程序调用WebService服务
- C#中Winform程序调用WebService方法
- VS2017 Winform调用dll程序打包
- 防止程序多次执行(调用DLL)
- python 调用外部程序防止一直阻塞
- [WinForm]C# .net防止一个程序(WinForm)重复运行的方法。
- 防止网页被外部调用
- winform 防止界面假死
- 防止程序被重复执行
- c++结构体全面总结(转载)
- 面试经验
- Struts2 官方教程之Hello World Using Struts 2(四)
- ZTree+Struts2+ajax+json实现checkbox权限树
- Windows 8版本一览
- WinForm程序防止被调用
- 把Lua移植到stm32上,效果不错!
- 关于内存的4个经典题目GetMomery
- jbpm4.4入门编程小例子
- 读大学 究竟读什么? (关于应用程序apk的打包与发布到木蚂蚁市场上的问题)
- 同步IO与异步IO的区别
- 驱动如何实现对mdev的支持(自动创建一个设备)
- ubuntu下安装Apache+PHP+Mysql
- WinForm出现无法处理的异常解决