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
    }

 

posted @ 2012-09-13 23:49  广拓小程序  阅读(2804)  评论(5编辑  收藏  举报