使用方法在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);
}
}
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/zgke/archive/2009/07/29/4390545.aspx