wince只运行一次应用程序
在winform中阻止同一个程序运行多次有很多方式,如用FindWindow、Mutex和C#直接Process遍历,但在wince中上面的方法都行不通
FindWindow找不到对应的窗体句柄,CreateMutex创建的信号量总返回87(无论运行几个相同的应用程序),Process更是没有相关方法,通过
几个小时的摸索,在ce中可以用进程快照实现此功能,下面是我用C++和C#实现的遍历process的功能
C++控制台应用程序为
// Test2.cpp : 定义控制台应用程序的入口点。
//
#include "StdAfx.h"
#include <windows.h>
#include "tlhelp32.h"
#include "stdio.h"
#pragma comment(lib,"Toolhelp.lib")//ce系统类库
int _tmain(int argc, _TCHAR* argv[])
{
PROCESSENTRY32 pe32;
pe32.dwSize=sizeof(pe32);
HANDLE hProcessSnap=::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
if(hProcessSnap==INVALID_HANDLE_VALUE)
{
printf("CreateToolhelp32Snapshot 调用失败.\n");
return -1;
}
BOOL bMore=::Process32First(hProcessSnap,&pe32);
while(bMore)
{
printf("进程名称:%s\n",pe32.szExeFile);
printf("进程ID:%u\n\n",pe32.th32ProcessID);
bMore=::Process32Next(hProcessSnap,&pe32);
}
::CloseHandle(hProcessSnap);
return 0;
}
C#
namespace SmartDeviceProject1
{
static class Program
{
[DllImport("Toolhelp.dll")]
public static extern IntPtr CreateToolhelp32Snapshot(uint flags, uint processid);
[DllImport("Coredll.dll")]
public static extern int CloseHandle(IntPtr handle);
[DllImport("Toolhelp.dll")]
public static extern int Process32First(IntPtr handle,ref PROCESSENTRY32 pe);
[DllImport("Toolhelp.dll")]
public static extern int Process32Next(IntPtr handle,ref PROCESSENTRY32 pe);
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[MTAThread]
static void Main()
{
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);
pe = (PROCESSENTRY32)Marshal.PtrToStructure(temp, typeof(PROCESSENTRY32));
Marshal.FreeHGlobal(temp);
MessageBox.Show(pe32.szExeFile);
bMore = Process32Next(handle, ref pe32);
}
}
CloseHandle(handle);
Application.Run(new Form1());
}
}
[StructLayout(LayoutKind.Sequential)]
public 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;
}
public 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
}
}