如何程序只启动一个实例 比如:我打开第一个CS文件,会自动启动一个VS来打开这个CS文件,再打开第二个CS文件,系统会自动用已启动的VS来打开这个文件,而不会重新启到一个VS,请问这个是如何实现的??谢谢!!! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 using System;using System.Collections.Generic;using System.Windows.Forms;using System.Threading;namespace WindowsApplication35{ static class Program { /// <summary> /// 应用程序的主入口点。 /// </summary> [STAThread] static void Main() { bool vExists; Mutex vMutex = new Mutex(false, "WindowsApplication35", out vExists); if (!vExists) { MessageBox.Show("程序已经启动!"); return; } else { vMutex.WaitOne(); } Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1()); } }} public bool PrevInstance() { string procName = System.Diagnostics.Process.GetCurrentProcess().ProcessName; if (System.Diagnostics.Process.GetProcessesByName(procName).GetUpperBound(0) > 0) { return true; } else { return false; } }返回true就是已经运行了 很多程序的设置中有“是否允许启动多个实例”的选项(例如UltraEdit)。如果是是,不管系统中是否有实例在运行,都会启动一个新的实例进行操作(例如打开当前文档)。这好像是Windows的默认做法。如果是是,需要在程序中检查是否有实例在运行,如果没有,同上情况。如果有,需要在程序中作处理来进行操作(例如关闭原来的文档和/或打开新的文档)。以上是猜测。回头试试看。 zswang(伴水清清)(专家门诊清洁工) ,谢谢!!我的意思是如果有这么一个进程就用这个进程来打开文件,说简单一点就是像用VS打开CS文件一样,不管双击多个CS文件,始终只有一个VS程序启动 我的做法是在程序里放个timer控件,每1000毫秒读取一下本地的一个xml文件,如果xml的内容改过就根据xml里的内容重新加载。不好意思,方法比较另类。 to:alldj(灵山妖姬);你的方法倒是可以改进一下,如果有进程在运行,则往xml里面写入双击的文件所在的路径,进程每隔一定时间扫描一下这个xml,然后把文件打开,呵呵,还有更好的方法吗 还有种办法,写一个dll,然后在程序里用委托回调使这个dll不停地侦测注册表里的某一个位置,而双击文件的时候通过启动程序把文件和路径写进注册表里。 微软的做法多数是先把文件信息加载到内存里,再从内存里和developer挂钩,再去读取。做是能做,就是麻烦。 public bool PrevInstance() { string procName = System.Diagnostics.Process.GetCurrentProcess().ProcessName; if (System.Diagnostics.Process.GetProcessesByName(procName).GetUpperBound(0) > 0) { return true; } else { return false; } }返回true就是已经运行了这个方法就可以了 我不是要判断程序是否已经运行,而在在已经运行的情况下如何用这个程序来打开你双击的文件,就像VS已经启起来 了,你再双击一个CS文件的时候会自动用这个VS来打开,而不会再起一个VS来打开这你双击的CS文件!! 以上朋友讲了,当双击文件时,如果进程存在,则将文件路径写入XML在程序运行过程中,每一时间段扫描一下XML文件,如果存在文件路径,则打开。但是运行效率好像有点低...等待... 恩,我也想知道,ms是怎么做的,还有我用的文本编辑软件(EMedit)也是这样的 伴水的方法只是解决了检测是否有实例在运行的问题。lz的要求还要用已经在运行的实例打开文件。可以用System.Diagnostics.Process.GetProcessesByName找到正在运行的进程,进程得到了那么窗口也就有了,然后用SendMessage发出打开文件的消息,当然你的程序要能响应你自己定义的打开文件的消息。具体怎么实现就自己找下吧,资料太多了。 通过发消息的方法是可以的注意如果是发送字符串这样的不定长数据需要用WM_COPYDATA消息处理跨进程结构传递 求一产品入库存设计思路?在线等 这个调用打开FORM的方法应该怎么修改? 这个输出为什么没有后面的小数 c#的数组问题 microsoft excel11.0 library 怎么没有 C#treeview 求InstallShield12下载的地址 如何生成一批标签ID? winform datagrid 关于终止线程的问题(急,在线。谢谢大家了) 求windows DNA方面的资料 用VS2005自带的部署工具进行大包(Form应用),安装.Net framework2.0速度特别慢,为何?
using System.Collections.Generic;
using System.Windows.Forms;
using System.Threading;namespace WindowsApplication35
{
static class Program
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
bool vExists;
Mutex vMutex = new Mutex(false, "WindowsApplication35", out vExists);
if (!vExists)
{
MessageBox.Show("程序已经启动!");
return;
}
else
{
vMutex.WaitOne();
}
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
}
}
{
string procName = System.Diagnostics.Process.GetCurrentProcess().ProcessName;
if (System.Diagnostics.Process.GetProcessesByName(procName).GetUpperBound(0) > 0)
{
return true;
}
else
{
return false;
}
}返回true就是已经运行了
我的意思是如果有这么一个进程就用这个进程来打开文件,说简单一点就是像用VS打开CS文件一样,不管双击多个CS文件,始终只有一个VS程序启动
你的方法倒是可以改进一下,如果有进程在运行,则往xml里面写入双击的文件所在的路径,进程每隔一定时间扫描一下这个xml,然后把文件打开,呵呵,还有更好的方法吗
{
string procName = System.Diagnostics.Process.GetCurrentProcess().ProcessName;
if (System.Diagnostics.Process.GetProcessesByName(procName).GetUpperBound(0) > 0)
{
return true;
}
else
{
return false;
}
}返回true就是已经运行了这个方法就可以了
在程序运行过程中,每一时间段扫描一下XML文件,如果存在文件路径,则打开。但是运行效率好像有点低...等待...
lz的要求还要用已经在运行的实例打开文件。
可以用System.Diagnostics.Process.GetProcessesByName找到正在运行的进程,进程得到了那么窗口也就有了,然后用SendMessage发出打开文件的消息,当然你的程序要能响应你自己定义的打开文件的消息。
具体怎么实现就自己找下吧,资料太多了。
注意如果是发送字符串这样的不定长数据
需要用WM_COPYDATA消息处理跨进程结构传递