想到以前在做项目时要求程序只能有一个运行实例,这种方法来处理岂不是很好,换种思路来处理:先取得当前运行的所有Process然后再找到那个Setup或是*.msi那不就好了。想到着就赶快动手试验,在程序中加上处理代码,很快搞定。
Process[] processes = Process.GetProcesses();
string tmp = "";
int i = 0;//调试时为了查找线程的个数
foreach (Process pro in processes)
{
//MSI Title即为你的打包文件在运行时显示的标题
if (pro.ProcessName.ToLower() == "msiexec" && pro.MainWindowTitle == "MSI Title")
{
//这里在Vista下测试时因为要读写文件(由于Vista使用了UAC来增强安全性,
//要求必须以管理员身份运行,而直接运行msi文件只能以普通权限来运行),
//所以不让用户直接运行MSI文件,而要求必须从Setup.exe文件运行,
//如果你不需要在Vista下使用则不用如此处理
MessageBox.Show("Please run setup.exe", "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error);
throw new InstallException("run");
}
else if (pro.ProcessName.ToLower().IndexOf("setup") && pro.MainWindowTitle == "MSI Title")
{//判断ProcessName是否是setup,并且其MainWindowTitle为你的安装文件的Title
tmp = tmp + pro.Id + "" + pro.ProcessName + Environment.NewLine;
tmp = tmp + " " + i.ToString() + "=" + pro.MainModule.FileName + Environment.NewLine;//pro.MainModule.FileName即为Setup的完整运行路径
tmp = tmp + " " + i.ToString() + "=" + pro.MainWindowTitle + Environment.NewLine;
}
}
MessageBox.Show(tmp);
string tmp = "";
int i = 0;//调试时为了查找线程的个数
foreach (Process pro in processes)
{
//MSI Title即为你的打包文件在运行时显示的标题
if (pro.ProcessName.ToLower() == "msiexec" && pro.MainWindowTitle == "MSI Title")
{
//这里在Vista下测试时因为要读写文件(由于Vista使用了UAC来增强安全性,
//要求必须以管理员身份运行,而直接运行msi文件只能以普通权限来运行),
//所以不让用户直接运行MSI文件,而要求必须从Setup.exe文件运行,
//如果你不需要在Vista下使用则不用如此处理
MessageBox.Show("Please run setup.exe", "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error);
throw new InstallException("run");
}
else if (pro.ProcessName.ToLower().IndexOf("setup") && pro.MainWindowTitle == "MSI Title")
{//判断ProcessName是否是setup,并且其MainWindowTitle为你的安装文件的Title
tmp = tmp + pro.Id + "" + pro.ProcessName + Environment.NewLine;
tmp = tmp + " " + i.ToString() + "=" + pro.MainModule.FileName + Environment.NewLine;//pro.MainModule.FileName即为Setup的完整运行路径
tmp = tmp + " " + i.ToString() + "=" + pro.MainWindowTitle + Environment.NewLine;
}
}
MessageBox.Show(tmp);
不过此方法有点不妥之处,那就是如果用户改变了Setup.exe或是*.msi的文件名就不好处理了,为了防止在用户更改文件名后运行安装,你可以在程序中加上判断文件名更改的处理,给用户提示。