C#实现让程序只能打开一个实例(总结3方法)
用c#开发应用程序.有时候只需要让程序打开后不能被再次打开..只能打开一次... V o; J: j5 t H7 L- g
总结出有3个方法可实现..如果还有什么好的方法请大家一起来讨论下..( _9 {, z6 n2 [, c
复制内容到剪贴板代码:; O( G H4 D/ i
//=====创建互斥体法:=====
/ ?9 H; f2 f; C" w" h- ^9 H; ^ s //bool blnIsRunning;
3 L) c# P8 Z/ i4 k, b) B# e/ ~! / //Mutex mutexApp = new Mutex(false, Assembly.GetExecutingAssembly().FullName, out blnIsRunning);% C0 ~# {7 X% N, S; o5 U3 [
//if (!blnIsRunning)4 F( i7 e! r1 k! @
//{
% }5 N: y& q" r/ Q! B- n1 p // MessageBox.Show("程序已经运行!", "提示",) g) m/ ?% R; `$ F0 A
// MessageBoxButtons.OK, MessageBoxIcon.Exclamation);5 S# D. x1 H$ {( a, W( n
// return;
8 x& I2 e" Q9 f; Q) K //}
% K# u9 U i; F$ y2 ]& v7 |. q3 [2 H复制内容到剪贴板代码:* y5 t, x* f7 z& v# h
//保证同时只有一个客户端在运行
/ ~) q) Y( _+ F2 ^3 x1 z* b //System.Threading.Mutex mutexMyapplication = new System.Threading.Mutex(false, "OnePorcess.exe");
. m) W: U7 ^1 ^; v //if (!mutexMyapplication.WaitOne(100, false))6 K4 e/ e ]9 P% i; U6 j: w- ~$ @1 R
//{
9 A9 b6 o( T& Z9 a0 X // MessageBox.Show("程序" + Application.ProductName + "已经运行!", Application.ProductName,9 p/ `$ J5 p- O& X /
// MessageBoxButtons.OK, MessageBoxIcon.Error);5 Q0 X! ^% ~; u, U) N8 ?
// return;
/ Q) i, K) W* K1 s1 Z# z //}
; q. v: `( d2 o' ?: c复制内容到剪贴板代码:: [! V+ h0 E3 `2 H' z; m
//=====判断进程法:(修改程序名字后依然能执行)=====
: [& x' {3 U8 Y //Process current = Process.GetCurrentProcess();
5 m# t" G2 ]9 j$ {% @( B! h T2 G //Process[] processes = Process.GetProcessesByName(current.ProcessName);8 e0 B0 P4 y" R6 m* ]
//foreach (Process process in processes)& k; ~' P) A. f1 ]7 p
//{
: F& O7 B7 B; c) H8 W0 n // if (process.Id != current.Id)1 h# G, c0 s, D& E9 V t
// {
, W6 o- T5 Q2 A5 f0 v // if (process.MainModule.FileName
9 Z( _% D" R! _! Y, I // == current.MainModule.FileName)/ k) ?& E8 c( H/ L! O
// {/ k1 E- F) x8 B* ^ `
// MessageBox.Show("程序已经运行!", Application.ProductName,0 a) [2 ~! J+ D5 _: G. H: q7 H
// MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
0 r- J2 ?( U% b" d3 u4 M5 `: x // return;
( |7 Y# ^0 o0 C2 B7 P* @6 G+ g1 C, h // }
# c4 I$ y! H& L7 H6 N // }; @* i8 ?5 u8 y) l) N& d5 L
//}
$ c( w3 Y# G! ]: J1 o只需要把需要的方法代码放在Void Main()方法中就可以实现..
总结出有3个方法可实现..如果还有什么好的方法请大家一起来讨论下..( _9 {, z6 n2 [, c
复制内容到剪贴板代码:; O( G H4 D/ i
//=====创建互斥体法:=====
/ ?9 H; f2 f; C" w" h- ^9 H; ^ s //bool blnIsRunning;
3 L) c# P8 Z/ i4 k, b) B# e/ ~! / //Mutex mutexApp = new Mutex(false, Assembly.GetExecutingAssembly().FullName, out blnIsRunning);% C0 ~# {7 X% N, S; o5 U3 [
//if (!blnIsRunning)4 F( i7 e! r1 k! @
//{
% }5 N: y& q" r/ Q! B- n1 p // MessageBox.Show("程序已经运行!", "提示",) g) m/ ?% R; `$ F0 A
// MessageBoxButtons.OK, MessageBoxIcon.Exclamation);5 S# D. x1 H$ {( a, W( n
// return;
8 x& I2 e" Q9 f; Q) K //}
% K# u9 U i; F$ y2 ]& v7 |. q3 [2 H复制内容到剪贴板代码:* y5 t, x* f7 z& v# h
//保证同时只有一个客户端在运行
/ ~) q) Y( _+ F2 ^3 x1 z* b //System.Threading.Mutex mutexMyapplication = new System.Threading.Mutex(false, "OnePorcess.exe");
. m) W: U7 ^1 ^; v //if (!mutexMyapplication.WaitOne(100, false))6 K4 e/ e ]9 P% i; U6 j: w- ~$ @1 R
//{
9 A9 b6 o( T& Z9 a0 X // MessageBox.Show("程序" + Application.ProductName + "已经运行!", Application.ProductName,9 p/ `$ J5 p- O& X /
// MessageBoxButtons.OK, MessageBoxIcon.Error);5 Q0 X! ^% ~; u, U) N8 ?
// return;
/ Q) i, K) W* K1 s1 Z# z //}
; q. v: `( d2 o' ?: c复制内容到剪贴板代码:: [! V+ h0 E3 `2 H' z; m
//=====判断进程法:(修改程序名字后依然能执行)=====
: [& x' {3 U8 Y //Process current = Process.GetCurrentProcess();
5 m# t" G2 ]9 j$ {% @( B! h T2 G //Process[] processes = Process.GetProcessesByName(current.ProcessName);8 e0 B0 P4 y" R6 m* ]
//foreach (Process process in processes)& k; ~' P) A. f1 ]7 p
//{
: F& O7 B7 B; c) H8 W0 n // if (process.Id != current.Id)1 h# G, c0 s, D& E9 V t
// {
, W6 o- T5 Q2 A5 f0 v // if (process.MainModule.FileName
9 Z( _% D" R! _! Y, I // == current.MainModule.FileName)/ k) ?& E8 c( H/ L! O
// {/ k1 E- F) x8 B* ^ `
// MessageBox.Show("程序已经运行!", Application.ProductName,0 a) [2 ~! J+ D5 _: G. H: q7 H
// MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
0 r- J2 ?( U% b" d3 u4 M5 `: x // return;
( |7 Y# ^0 o0 C2 B7 P* @6 G+ g1 C, h // }
# c4 I$ y! H& L7 H6 N // }; @* i8 ?5 u8 y) l) N& d5 L
//}
$ c( w3 Y# G! ]: J1 o只需要把需要的方法代码放在Void Main()方法中就可以实现..
本文总结了使用C#语言确保应用程序只能打开一个实例的三种常见方法,涵盖了进程检查、Mutex同步以及NamedPipe通信等技术,旨在帮助开发者实现更稳定的单实例程序控制。
1632

被折叠的 条评论
为什么被折叠?



