首先,要完成设置C#窗体程序只能启动一次的功能,我们可以采用互斥体(Mutex)的方式。互斥体是Windows中用来控制进程互斥访问共享资源的同步对象。通过创建某个名字的互斥体,再判断互斥体是否已经存在,即可达到防止多个实例同时运行的目的。
下面是实现过程:
1.在程序的Main函数中,使用互斥体判断程序是否已经启动过,代码如下:
static void Main()
{
bool createNew;
using (Mutex mutex = new Mutex(true, "MyApp", out createNew))
{
if (createNew)
{
Application.Run(new Form1());
}
else
{
MessageBox.Show("程序已在运行中!", "提示");
}
}
}
其中,Mutex的第一个参数为true,表示在创建互斥体时立即获取互斥体的所有权。第二个参数为"MyApp",是互斥体的名字,可以自行设置。第三个参数是一个布尔变量,表示互斥体是否已经存在。如果互斥体已经存在,说明程序已经启动过了,此时弹出一个提示框即可。
2.使用NamedPipe通信方式,把参数传递给已启动的程序。
首先,在Program.cs文件中引用命名空间System.IO.Pipes。
然后,在Main函数中加入以下代码:
// 为通信用的管道取个名字
string pipeName = "MyAppPipe";
NamedPipeServerStream pipeServer = null;
try
{
pipeServer = new NamedPipeServerStream(pipeName, PipeDirection.InOut, 1, PipeTransmissionMode.Message, PipeOptions.Asynchronous);
// 尝试连接管道
pipeServer.WaitForConnection();
// 读取传输的参数
using (StreamReader sr = new StreamReader(pipeServer))
{
string parameters = sr.ReadToEnd();
// 这里写接收到参数后要执行的代码逻辑
// ...
// 把结果写入管道返回给客户端
using (StreamWriter sw = new StreamWriter(pipeServer))
{
sw.Write("结果");
sw.Flush();
}
}
}
catch (Exception ex)
{
// 异常处理
}
finally
{
if (pipeServer != null)
{
pipeServer.Disconnect();
pipeServer.Dispose();
}
}
其中,NamedPipeServerStream用于创建一个命名管道服务器端,PipeDirection.InOut表示管道是双向的,1表示最多只能有一个客户端连接,PipeTransmissionMode.Message表示以消息方式传输,PipeOptions.Asynchronous表示异步模式。接着,等待客户端连接,一旦连接成功,就读取传输的参数并执行相应的代码逻辑,最后把执行结果写入管道返回给客户端。
同时,在已经运行的程序中加入以下代码:
string pipeName = "MyAppPipe";
string[] args = Environment.GetCommandLineArgs();
if (args.Length > 1)
{
// 发送参数到已经运行的程序
using (NamedPipeClientStream pipeClient = new NamedPipeClientStream(".", pipeName, PipeDirection.InOut))
{
pipeClient.Connect();
using (StreamWriter sw = new StreamWriter(pipeClient))
{
sw.Write(args[1]);
sw.Flush();
// 读取返回结果
using (StreamReader sr = new StreamReader(pipeClient))
{
string result = sr.ReadToEnd();
}
}
}
Application.Exit();
}
else
{
Application.Run(new Form1());
}
当程序已经启动时,读取命令行参数,连接到命名管道服务器端,并将参数传输给服务器端,读取服务器端返回的执行结果后即可退出程序。如果没有命令行参数,则正常启动程序。
以上是两种实现方法,可以根据自己的需要和实际情况选择一种使用。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:设置C#窗体程序只能启动一次 - Python技术站