wince c# 程式只能運行一次

來源:互聯網
上載者:User

第一種方法 (建議用這個,我已經測試)  代碼如下

【1.】

using System;using System.Collections.Generic;using System.Windows.Forms;//using RFIDWareHouse.View;using System.Runtime.InteropServices;namespace Phone{    static class Program    {        [DllImport("coredll.Dll")]        private static extern int GetLastError();        [DllImport("coredll.Dll")]        private static extern int ReleaseMutex(IntPtr hMutex);        [DllImport("coredll.Dll")]        private static extern IntPtr CreateMutex(SECURITY_ATTRIBUTES lpMutexAttributes, bool bInitialOwner, string lpName);        private const int ERROR_ALREADY_EXISTS = 0183;        [StructLayout(LayoutKind.Sequential)]        public class SECURITY_ATTRIBUTES { public int nLength; public int lpSecurityDescriptor; public int bInheritHandle;    }        /// <summary>        /// 應用程式的主進入點。        /// </summary>        [MTAThread]        static void Main()        {           // Application.Run(new frMain());            IntPtr hMutex = CreateMutex(null, false, "Futureproduct");            if (GetLastError() != ERROR_ALREADY_EXISTS)            {                System.Windows.Forms.Application.Run(new frMain());                return;            }            else            {                MessageBox.Show("程式已經啟動.");                ReleaseMutex(hMutex);                return;            }        }    }}

【2】
第二種方法:

public class Mutex{[DllImport("coredll.dll", EntryPoint = "CreateMutex", SetLastError = true)]public static extern IntPtr CreateMutex(IntPtr lpMutexAttributes,bool InitialOwner,string MutexName);[DllImport("coredll.dll", EntryPoint = "ReleaseMutex", SetLastError = true)]public static extern bool ReleaseMutex(IntPtr hMutex);private const int ERROR_ALREADY_EXISTS = 0183;/// <summary>/// 判斷程式是否已經運行/// </summary>/// <returns>/// true: 程式已運行,則什麼都不做/// false: 程式未運行,則啟動程式/// </returns>public static bool IsExist(){string strAppName = System.Reflection.Assembly.GetExecutingAssembly().GetName().Name;IntPtr hMutex = CreateMutex(IntPtr.Zero, true, strAppName);if (hMutex == IntPtr.Zero)throw new ApplicationException("Failure creating mutex: "+ Marshal.GetLastWin32Error().ToString("X"));if (Marshal.GetLastWin32Error() == ERROR_ALREADY_EXISTS){ReleaseMutex(hMutex);return true;}return false;}}

 

【3.】

讓程式只啟動一次
-- Mutex有時在開發程式的時候, 有時需要只能同時運行一個執行個體.

Mutex 類, 稱為互拆體, 是一個同步基元, 它只向一個線程授予對共用資源的獨佔訪問權。

當兩個或更多線程需要同時訪問一個共用資源時,系統需要使用同步機制來確保一次只有一個線程使用該資源。

如果一個線程擷取了互斥體,則要擷取該互斥體的第二個線程將被掛起,直到第一個線程釋放該互斥體。


下面示範 Mutex 類來保證應用程式只有唯一執行個體
using System;using System.Collections.Generic;using System.Linq;using System.Windows.Forms;namespace 讓程式只啟動一次{    static class Program    {        /// <summary>        /// 應用程式的主進入點。        /// </summary>        [STAThread]        static void Main()        {            Application.EnableVisualStyles();            Application.SetCompatibleTextRenderingDefault(false);            bool bCreate;            System.Threading.Mutex mutex = new System.Threading.Mutex(false, "SINGILE_INSTANCE_MUTEX", out bCreate);            if (bCreate)            {                Application.Run(new Form1());            }            else            {                MessageBox.Show("程式已經啟動");                Application.Exit();            }        }    }}

我之前 也很苦惱 有的程式可以 只能開啟程式一次 

但是 有的程式為什麼不行啊 代碼都一樣,你有沒有發現 這是什麼問題??

 如果 上面的方法 都不起作用 嘗試下面的這個方法

【4。】

using System;using System.Linq;using System.Collections.Generic;using System.Windows.Forms;using System.Runtime.InteropServices;namespace PDAapplication{    static class Program    {        /// <summary>        /// 應用程式的主進入點。        /// </summary>        [MTAThread]        static void Main()        {            //Application.Run(new forApplicatinesMan());            IntPtr hDlg=IntPtr.Zero;            hDlg = FindWindow(null, "ThisWindows");//ThisWindows:應用程式主表單          if (hDlg != IntPtr.Zero)          {              SetForegroundWindow(hDlg);          }          else          {              Application.Run(new forApplicatinesMan());          }        }        [DllImport("coredll.Dll")]        public static extern IntPtr FindWindow(String classname, String title);        [DllImport("coredll.Dll")]        public static extern void SetForegroundWindow(IntPtr hwnd);    }}

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.