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
    }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM