在同一时间同一台电脑上,如何使程序只可以运行一个实体,

pengfangxu8 2009-12-14 04:34:33
在同一时间同一台电脑上,程序只可以运行一个实体,当用户企图再打开第二次的时候,禁止用户再打开第二次,并将正在运行的显示出来. 请问该如何实现呢?
...全文
468 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
ckl881003 2010-02-22
  • 打赏
  • 举报
回复
有很多方法可以绕过。。既然可以绕过。。你就做个最简单的判断下有没有相同的进程名就可以了
代码用10楼的就可以了,不用太复杂,关键是提示用户别开多个就好
xiaoyaowp 2010-02-22
  • 打赏
  • 举报
回复
学习了
江南小鱼 2010-02-22
  • 打赏
  • 举报
回复
关注帮顶
风之影子 2010-02-22
  • 打赏
  • 举报
回复

using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Diagnostics;

namespace jamonitor
{
static class Program
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
int iProcessNum = 0;

foreach (Process singleProc in Process.GetProcesses())
{
if (singleProc.ProcessName == Process.GetCurrentProcess().ProcessName)
{
iProcessNum += 1;
}
}
if (iProcessNum == 2)
{
MessageBox.Show("【系统提示】:程序已经在运行中……", "单点登陆", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
else if (iProcessNum > 2)
{
return;
}
else
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new fmLogin());
}
}
}
}
s000rd 2010-02-22
  • 打赏
  • 举报
回复
不错,帮顶了
_捕风捉影_ 2010-02-22
  • 打赏
  • 举报
回复
接分接分接分接分接分接分接分接分接分
wangxianshou 2010-02-07
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 coral_jiang 的回复:]
Mutex mutex = new Mutex(false, "ThisShouldOnlyRunOnce");
            //判斷互斥體是否存在。 
            bool Running = !mutex.WaitOne(0, false);
           
            if (!Running)
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);

                //默認開啟頁面
               
                Application.Run(new frmMain());
            }
            else
            {

                MessageBox.Show("應用程序已啟動!");
            }
[/Quote]
顶这个
Baesky 2010-02-07
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 pengfangxu8 的回复:]
当已经有运行的时候,我能判断出现,但是要调出已运行的窗口,我不会呀,还麻烦各位大侠,谢谢了
[/Quote]
if 出现
returen;
else
正常启动。。
chenxu4277 2010-02-07
  • 打赏
  • 举报
回复
http://www.cnblogs.com/houleixx/archive/2008/04/15/StartOnly.html




1using System;
2using System.Collections.Generic;
3using System.Windows.Forms;
4using System.Diagnostics;
5using System.Runtime.InteropServices;
6
7namespace WindowsApplication2
8{
9 static class Program
10 {
11 /**//// <summary>
12 /// 应用程序的主入口点。
13 /// </summary>
14
15 [DllImport("User32.dll")]
16 private static extern bool ShowWindowAsync(IntPtr hWnd, int cmdShow);
17 [DllImport("User32.dll")]
18 private static extern bool SetForegroundWindow(IntPtr hWnd);
19 private const int WS_SHOWNORMAL = 1;
20
21 [STAThread]
22 static void Main()
23 {
24 //得到正在运行的例程
25 Process instance = RunningInstance();
26 if (instance == null)
27 {
28 //如果没有其它例程,就新建一个窗体
29 Application.EnableVisualStyles();
30 Application.SetCompatibleTextRenderingDefault(false);
31 Application.Run(new Form1());
32 }
33 else
34 {
35 //处理发现的例程
36 HandleRunningInstance(instance);
37 }
38 }
39 /**//// <summary>
40 /// 得到正在运行的进程
41 /// </summary>
42 /// <returns></returns>
43 public static Process RunningInstance()
44 {
45 Process current = Process.GetCurrentProcess();
46 Process[] processes = Process.GetProcessesByName(current.ProcessName);
47
48 //遍历正在有相同名字运行的进程
49 foreach (Process process in processes)
50 {
51 //忽略现有的进程
52 if (process.Id != current.Id)
53 {
54 //确保进程从EXE文件运行
55 if (process.MainModule.FileName == current.MainModule.FileName)
56 {
57 // 返回另一个进程实例
58 return process;
59 }
60 }
61 }
62 //没有其它的进程,返回Null
63 return null;
64 }
65 /**//// <summary>
66 /// 处理正在运行的进程,也就是将其激活
67 /// </summary>
68 /// <param name="instance">要处理的进程</param>
69 public static void HandleRunningInstance(Process instance)
70 {
71 //确保窗口没有被最小化或最大化
72 ShowWindowAsync(instance.MainWindowHandle, WS_SHOWNORMAL);
73 //设置真实进程为foreground window
74 SetForegroundWindow(instance.MainWindowHandle);
75 }
76 }
77}
pengfangxu8 2010-02-07
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 guochangshan 的回复:]
C# code
当 process.start("DoctorManage .exe");的时候
判断启动的线程 是否被调用过
如果已经存在 将已经存在的线程调出 最大或最小using System;using System.Collections.Generic;using System.Windows.Forms;using System.Runtime.InteropServices;us?-
[/Quote]

这段代码达不到我说的那种效果,连判断都会都是错的
ctwei86 2010-02-07
  • 打赏
  • 举报
回复
貌似好像是单例???
龟仙 2009-12-28
  • 打赏
  • 举报
回复

当 process.start("DoctorManage .exe");的时候
判断启动的线程 是否被调用过
如果已经存在 将已经存在的线程调出 最大或最小

using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Diagnostics;
namespace DoctorManage
{
static class Program
{
private const int WS_SHOWNORMAL = 1;
[DllImport("User32.dll")]
private static extern bool ShowWindowAsync(IntPtr hWnd, int cmdShow);
[DllImport("User32.dll")]
private static extern bool SetForegroundWindow(IntPtr hWnd);
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
Process instance = GetRunningInstance();
if (instance == null)
{
Application.Run(new MianFrm());
}
else
{
HandleRunningInstance(instance);
}

}
/// <summary>
/// 获取应用程序的实例,没有其它的例程,返回Null
/// </summary>
/// <returns>返回当前Process实例</returns>
public static Process GetRunningInstance()
{
//获取当前进程
Process currentProcess = Process.GetCurrentProcess();
string currentFileName = currentProcess.MainModule.FileName;
//创建新的 Process 组件的数组,并将它们与本地计算机上共享指定的进程名称的所有进程资源关联。
Process[] processes = Process.GetProcessesByName(currentProcess.ProcessName);
//遍历正在有相同名字运行的进程
foreach (Process process in processes)
{
if (process.MainModule.FileName == currentFileName)
{
if (process.Id != currentProcess.Id)//排除当前的进程
return process;//返回已启动的进程实例
}
}
return null;
}
/// <summary>
/// 获取窗口句柄
/// </summary>
/// <param name="instance">Process进程实例</param>
public static void HandleRunningInstance(Process instance)
{
//确保窗口没有被最小化或最大化
ShowWindowAsync(instance.MainWindowHandle, WS_SHOWNORMAL);
//设置真实例程为foreground window
SetForegroundWindow(instance.MainWindowHandle);
}
}
}
pengfangxu8 2009-12-28
  • 打赏
  • 举报
回复
说具体点,谢谢你,能不能给我例子呢?谢谢了
ginpq 2009-12-28
  • 打赏
  • 举报
回复
标记
pengfangxu8 2009-12-28
  • 打赏
  • 举报
回复
我能判断,但是我不能把已经运行的窗口调出来,还麻烦各位,谢谢了
sosoyiyi 2009-12-17
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 caymanyang 的回复:]
这个网上说的很多,不需要这么多代码,几行就可以了:

禁止生成多个程序实例:
在Program.cs中添加如下代码:
          Boolean createdNew; //返回是否赋予了使用线程的互斥体初始所属权
            System.Threading.Mutex instance = new System.Threading.Mutex(true, "MutexName", out createdNew); //同步基元变量
            if (createdNew) //赋予了线程初始所属权,也就是首次使用互斥体
            {
                Application.Run(new Form1()); /s/这句是系统自动写的
                instance.ReleaseMutex();
            }
            else
            {
                MessageBox.Show("已经启动了一个程序,请先退出!","系统提示",MessageBoxButtons.OK,MessageBoxIcon.Error);
                Application.Exit();
            }

[/Quote]
对喽,参见《C#高级编程》线程这一节关于互斥体这部分。
影子_爱人 2009-12-17
  • 打赏
  • 举报
回复
这个 以前做过 的 忘记 了 来学习学习
kook_tian 2009-12-17
  • 打赏
  • 举报
回复
去看看 单例模式
zl194 2009-12-17
  • 打赏
  • 举报
回复
学习
caymanyang 2009-12-17
  • 打赏
  • 举报
回复
这个网上说的很多,不需要这么多代码,几行就可以了:

禁止生成多个程序实例:
在Program.cs中添加如下代码:
Boolean createdNew; //返回是否赋予了使用线程的互斥体初始所属权
System.Threading.Mutex instance = new System.Threading.Mutex(true, "MutexName", out createdNew); //同步基元变量
if (createdNew) //赋予了线程初始所属权,也就是首次使用互斥体
{
Application.Run(new Form1()); /s/这句是系统自动写的
instance.ReleaseMutex();
}
else
{
MessageBox.Show("已经启动了一个程序,请先退出!","系统提示",MessageBoxButtons.OK,MessageBoxIcon.Error);
Application.Exit();
}
加载更多回复(10)

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧