C# 讓程序只保證一個進程的類

不多說了

 

使用方法在Program.cs裏的Main裏調用就好了

LoadProcess.StarPoint()第1個參數是用來給已啓動的進程發送的消息..


         [STAThread] 
         static void Main(string[] args)
         {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            if (LoadProcess.StarPoint("哈哈", true))
            {
                Form2 _Form=new Form2();
                LoadProcess.LoadProcessMessage _Load = new LoadProcess.LoadProcessMessage(_Form.Handle);
                _Load.LoadMessage += new LoadProcess.LoadProcessMessage.GetMessage(_Load_LoadMessage);
                Application.Run(_Form);             
            }
            else
            {
               
            }
         }
         static void _Load_LoadMessage(string Text)
         {
            Application.OpenForms[0].Text = Text;
         }        

 

 

 下面是全部代碼

 

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using System.Windows.Forms;
using System.Diagnostics;

namespace Zgke.SysInfo
{
    /// <summary>
    /// 只能運行一個的程序
    /// [email protected]
    /// qq:116149
    /// </summary>
    public class LoadProcess
    {
       

        /// <summary>
        /// 檢查當前進程是否已存在 
        /// </summary>
        /// <param name="p_Message">發送進程消息</param>
        ///  <param name="p_IsPath">通過路徑判斷 false是通過進程名判斷</param>
        /// <returns>true不存在  false存在</returns>
        public static bool StarPoint(string p_Message, bool p_IsPath)
        {
            Process _Process = Process.GetCurrentProcess();
            Process[] _ProcessList = Process.GetProcessesByName(_Process.ProcessName);
            int _ProcessInst = 0;
            IntPtr _ProcessMainWindowHandle = IntPtr.Zero;
            if (p_IsPath)
            {
                for (int i = 0; i != _ProcessList.Length; i++)
                {
                    if (_ProcessList[i].MainModule.FileName == _Process.MainModule.FileName) _ProcessInst++;

                    if (_ProcessList[i].Id != _Process.Id) _ProcessMainWindowHandle = _ProcessList[i].MainWindowHandle;
                }
            }
            else
            {
                _ProcessInst = _ProcessList.Length;
            }
            if (_ProcessInst == 1)
            {
                return true;
            }
            else
            {
                if (p_Message != null) SendMessage(p_Message, _ProcessMainWindowHandle);
                return false;
            }
        }

        /// <summary>
        /// 發送消息
        /// </summary>
        /// <param name="Message">發送消息</param>
        /// <param name="p_MainIntPtr">主窗體</param>
        private static void SendMessage(string Message, IntPtr p_MainIntPtr)
        {
            byte[] _Bytes = System.Text.Encoding.Default.GetBytes(Message);
            COPYDATASTRUCT _Data = new COPYDATASTRUCT();
            _Data.dwData = new IntPtr(100);
            _Data.lpData = Message;
            _Data.cbData = _Bytes.Length + 1;
            SendMessage(p_MainIntPtr, 0x004A, 0, ref _Data);
        }

        /// <summary>
        /// 獲取消息
        /// </summary>
        public class LoadProcessMessage : NativeWindow
        {
            public LoadProcessMessage(IntPtr p_MainWindowHandle)
            {
                base.AssignHandle(p_MainWindowHandle);
            }
            public delegate void GetMessage(string Text);
            public event GetMessage LoadMessage;

            protected override void WndProc(ref Message m)
            {
                if (m.Msg == 0x004A)
                {
                    if (LoadMessage != null)
                    {
                        COPYDATASTRUCT _Data = new COPYDATASTRUCT();
                        Type _DataType = _Data.GetType();
                        _Data = (COPYDATASTRUCT)m.GetLParam(_DataType);
                        LoadMessage(_Data.lpData);
                    }

                }
                base.WndProc(ref m);
            }
        }

        /// <summary>
        /// 消息
        /// </summary>
        public struct COPYDATASTRUCT
        {
            /// <summary>
            /// 句柄 (IntPtr) 100
            /// </summary>
            public IntPtr dwData;
            /// <summary>
            /// 數據大小  是byte的大小
            /// </summary>
            public int cbData;
            /// <summary>
            /// 數據
            /// </summary>
            [MarshalAs(UnmanagedType.LPStr)]
            public string lpData;
        }

        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        public static extern int SendMessage(IntPtr hwnd, int wMsg, int wParam, ref COPYDATASTRUCT copyData);

    }
}

發佈了95 篇原創文章 · 獲贊 17 · 訪問量 56萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章