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
    }

 

转载于:https://www.cnblogs.com/fujinliang/archive/2012/09/13/2684165.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值