C# 让程序只保证一个进程的类
来源:互联网 发布:古北水镇 知乎 编辑:程序博客网 时间:2024/05/17 03:34
不多说了
使用方法在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>
/// 只能运行一个的程序
/// zgke@sina.com
/// 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);
}
}
- C# 让程序只保证一个进程的类
- C# 让程序只保证一个进程的类
- 保证系统中只运行当前程序的一个进程
- C#程序多用户只启动一个进程的方法[转载]
- 保证C#程序只运行一次
- 程序运行初期检查是否已经有一个自身的进程在运行,保证一台PC机器只运行一个程序
- 保证程序只运行一个实例(delphi)
- 让C#程序只运行一个实例,显示已经运行的界面
- C#只启动一个进程
- C#只启动一个进程
- 保证一个程序在同一台PC中只运行一个实例的两种方法
- Delphi中保证程序只运行一个实例的方法总结
- 让程序只运行一个实例的方法
- 让程序只运行一个实例的方法总结[转]
- 让程序只运行一个实例的方法总结
- 让程序只运行一个实例的四种方法
- VC让程序只运行一个实例的方法
- 让程序只运行一个实例的四种方法
- 国家一级B选择题答案
- 王小二切饼
- java.lang.ClassNotFoundException: com.microsoft.jdbc.sqlserver.SQLServerDriver
- Code Coverage for C++
- before 2009.7.16
- C# 让程序只保证一个进程的类
- 【转】谈谈使用VFW在windows下编程控制摄像头(一)。 【孙涛】
- 什么是CS和BS结构,两种结构的区别
- Sql Server 2005 和Eclipse连接的注意事项
- 图像锐化 边缘检测的一些基础知识
- 应用创新,贵在坚持
- 总结: 重复提交、重复刷新、防止后退的问题以及处理方式
- 博客开张!
- java笔试题