WINCE程序只运行一个,防止多重运行。

在 winform中,程序只运行一个,防止多重运行,很容易。如用FindWindow、Mutex和C#直接Process遍历,都可以实现。

但是,到了WINCE 系统中,要么方法不存在,即使引入CreateMutex,也是白搭。根本无效。

从网上找到一篇通过系统快照方式的方案。不过,大侠们写的都不完整,我特地贡献一个可以直接使用的类:

using System.IO;

using System.Runtime.InteropServices;

//可能还缺其他using,,,,没仔细看。

public class MyProcess

{

#region //导入dll中函数

[DllImport("Toolhelp.dll")]

private static extern IntPtr CreateToolhelp32Snapshot(uint flags, uint processid);

[DllImport("Toolhelp.dll")]

private static extern int CloseToolhelp32Snapshot(IntPtr handle);

[DllImport("Toolhelp.dll")]

private static extern int Process32First(IntPtr handle, ref PROCESSENTRY32 pe);

[DllImport("Toolhelp.dll")]

private static extern int Process32Next(IntPtr handle, ref PROCESSENTRY32 pe);

#endregion

#region //定义信息结构体

[StructLayout(LayoutKind.Sequential)]

private struct PROCESSENTRY32

{

public uint dwSize;

public uint cntUsage;

public uint th32ProcessID;

public IntPtr th32DefaultHeapID;

public uint th32ModuleID;

public uint cntThreads;

public uint th32ParentProcessID;

public int pcPriClassBase;

public uint dwFlags;

[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]//注意,此处为宽字符

public string szExeFile;

public uint th32MemoryBase;

public uint th32AccessKey;

}

private enum SnapShotFlags : uint

{

TH32CS_SNAPHEAPLIST = 0x00000001,

TH32CS_SNAPPROCESS = 0x00000002,

TH32CS_SNAPTHREAD = 0x00000004,

TH32CS_SNAPMODULE = 0x00000008,

TH32CS_SNAPALL = (TH32CS_SNAPHEAPLIST | TH32CS_SNAPPROCESS | TH32CS_SNAPTHREAD | TH32CS_SNAPMODULE),

TH32CS_GETALLMODS = 0x80000000

}

#endregion

public static bool CheckIsRunning()

{

bool IsRunning = false;

int nCount=0;

string AppName = System.IO.Path.GetFileName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase).ToLower();

//获取当前程序名称,有个缺陷,运行一次后,修改程序名称,可以再次运行,函数却检测不到。哪位大小有更好的检测项目??

IntPtr handle = CreateToolhelp32Snapshot((uint)SnapShotFlags.TH32CS_SNAPPROCESS, 0);//获取所有进程快照,包括自己。

if ((int)handle != -1)

{

PROCESSENTRY32 pe32 = new PROCESSENTRY32();

pe32.dwSize = (uint)Marshal.SizeOf(typeof(PROCESSENTRY32));

int bMore = Process32First(handle, ref pe32);//遍历进程快照,获取每个进程的信息

//PROCESSENTRY32 pe;

while (bMore == 1)

{

//IntPtr temp = Marshal.AllocHGlobal((int)pe32.dwSize);//非托管,分配内存

//Marshal.StructureToPtr(pe32, temp, true);//将进程结构信息,传送到非托管内存块temp。

//pe = (PROCESSENTRY32)Marshal.PtrToStructure(temp, typeof(PROCESSENTRY32));

//Marshal.FreeHGlobal(temp);/////////////////////////////将分配的内存释放

//MessageBox.Show(pe32.szExeFile); //以上语句怎么都没想明白到底用来干啥????有啥用?那位大侠解释一下!

if (pe32.szExeFile.ToString().ToLower() == AppName)

{

nCount++;//因为包括自己,所以必须设计计数器。

if (nCount > 1)

{

IsRunning = true;

break;

}

}

bMore = Process32Next(handle, ref pe32);//遍历进程快照,获取下一个进程的信息

}

}

//CloseHandle(handle);//winCE 中,这个函数关闭快照无效,

CloseToolhelp32Snapshot(handle);//wince 中,必须用这个函数才能关闭快照。

return IsRunning;

}

}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-11 05:53:11

WINCE程序只运行一个,防止多重运行。的相关文章

程序只启动一个实例的几种方法

我们在使用<金山词霸>时发现,在<金山词霸>已经运行了的情况下,再次点击<金山词霸>的图标,那么它不会再运行另外一个<金山词霸>,而是将已有的<金山词霸>给激活,始终只能运行一个<金山词霸>的实例. 在我们的程序当中如果要实现类似<金山词霸>的功能,就要解决两个问题,首先是要判断该程序已有一个实例在运行,其次是要将已运行的应用程序实例激活,同时退出第二个应用程序实例.  对于第一个问题,我们可以通过设置命名互斥对象或命名信

同一个应用程序只开启一个的方法

关键点——密封类Mutex MSDN中Mutex类中是这样解释的:一个同步基元,也可用于进程间同步.其实个人感觉更容易理解的解释是: 互斥锁(Mutex) 互斥锁是一个互斥的同步对象,意味着同一时间有且仅有一个线程可以获取它. 互斥锁可适用于一个共享资源每次只能被一个线程访问的情况. 如果要获取一个互斥锁.应调用互斥锁上的WaitOne()方法,该方法继承于Thread.WaitHandle类. 它处于等到状态直至所调用互斥锁可以被获取,因此该方法将组织住主调线程直到指定的互斥锁可用,如果不需要

C#如何判断我的程序已经有一个实例正在运行

1 static class Program 2 { 3 private static Mutex mutex; 4 /// <summary> 5 /// 应用程序的主入口点. 6 /// </summary> 7 [STAThread] 8 static void Main() 9 { 10 Application.EnableVisualStyles(); 11 Application.SetCompatibleTextRenderingDefault(false); 12

让程序只启动一个实例

在应用程序的InitInstance方法中,添加如下几行代码: CreateMutex(NULL,true,m_pszAppName); if(GetLastError() == ERROR_ALREADY_EXISTS) { AfxMessageBox(_T("程序已启动"),MB_OK | MB_APPLMODAL | MB_ICONSTOP); return false; }

[VC]在VC++中实现让程序只运行一个实例的方法且实现该实例

方法一: 有时候在开发应用程序时,希望控制程序运行唯一的实例.例如,最常用的mp3播放软 件Winamp,由于它需要独占计算机中的音频设备,因此该程序只允许自身运行唯一的一个例程.在Visual C++的开发实践中,对于16位的Windows系统,应用程序的hPrevInstance句柄保存了应用程序上一个运行的实例,可以用该值来检查是否 有实例运行:然而在32位Windows系统下,这个值总是NULL,所以无法利用该值来实现程序运行唯一实例.本实例给出了解决这个问题的简单办法,只 要将程序中稍

C#应用程序只允许运行一个实例,多次运行的时候激活当前实例,显示其界面

很多时候,我们开发的程序,需要单例运行的的功能,即整个应用程序只允许同时运行最多一个实例,重复运行的时候,激活当前实力,显示其界面. 在C#程序中,其解决方案有多重,可以参照Charles Chen 的C#程序只允许运行一个实例的解决方案一文. 参照其文章,我决定使用调用Windows Api的方法,大致如下: namespace BarCodeSystem { public static class Program { /// <summary> /// Application Entry

C# WinForm 判断程序是否已经在运行,且只允许运行一个实例

static class Program {   /// <summary>   /// 应用程序的主入口点.   /// </summary>   [STAThread]   static void Main()   {     Application.EnableVisualStyles();     Application.SetCompatibleTextRenderingDefault(false);     //1.这里判定是否已经有实例在运行     //只运行一个实

【转】delphi程序只允许运行一个实例的三种方法:

一.        创建互斥对象 在工程project1.dpr中创建互斥对象 Program project1 Uses Windows,Form, FrmMain in 'FrmMain.pas' {MainForm}; {$R *.res} var hAppMutex: THandle; //声明互斥变量 begin hAppMutex := CreateMutex(nil, false,’projectname’); //创建互斥对象projectname工程名称 if ( (hAppM

多次单击快捷方式,只运行一个程序实例

在应用程序安装之后,单击一次快捷方式,就运行一个程序实例,对于资源独占型程序来说,这样是不可以的,比如该程序使用了当前系统的某个端口,当同样的程序再次运行,再次试图占用同一个端口次,会提示"端口已经被占用的"异常.如此,必须在启动应用程序时,必须判断该程序是否已经有一个实例在运行.下面这个类中先判断该程序的实例有没有在运行,使用线程同步类EventWaitHandle(Boolean, EventResetMode, String)及注册正在等待 WaitHandle 的委托方法Reg