当程序有一个实例运行后,如果再次运行此程序,则调用原选创建的程序,且将参数传递给原先的程序,有什么方法吗?google了一下午,终究没有找到.
static class Program
{
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool SetForegroundWindow(IntPtr hWnd);
[STAThread]
static void Main(string[] path)
{
Process anotherProcess = RuningInstance();
if (anotherProcess != null)
{
System.Windows.Forms.MessageBox.Show("己有实例在运行!");
//此处调用己运行的程序,且将path传递给它.
Application.Exit();
}
else
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
MainFrm1 mf1 = new MainFrm1();
mainFrm mf = new mainFrm();
if (path.Length != 0)
mf1._TxtFilePath = path[0];
Application.Run(mf1);
}
} static Process RuningInstance()
{
Process current = Process.GetCurrentProcess();
Process[] processes = Process.GetProcessesByName(current.ProcessName);
foreach (Process p in processes)
{
if (p.Id != current.Id)
{
//确认相同进程的程序运行位置是否一样.
if (System.Reflection.Assembly.GetExecutingAssembly().Location.Replace("/", "\\") == current.MainModule.FileName)
{
//Return the other process instance.
return p;
}
}
}
//No other instance was found, return null.
return null;
}
}
static class Program
{
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool SetForegroundWindow(IntPtr hWnd);
[STAThread]
static void Main(string[] path)
{
Process anotherProcess = RuningInstance();
if (anotherProcess != null)
{
System.Windows.Forms.MessageBox.Show("己有实例在运行!");
//此处调用己运行的程序,且将path传递给它.
Application.Exit();
}
else
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
MainFrm1 mf1 = new MainFrm1();
mainFrm mf = new mainFrm();
if (path.Length != 0)
mf1._TxtFilePath = path[0];
Application.Run(mf1);
}
} static Process RuningInstance()
{
Process current = Process.GetCurrentProcess();
Process[] processes = Process.GetProcessesByName(current.ProcessName);
foreach (Process p in processes)
{
if (p.Id != current.Id)
{
//确认相同进程的程序运行位置是否一样.
if (System.Reflection.Assembly.GetExecutingAssembly().Location.Replace("/", "\\") == current.MainModule.FileName)
{
//Return the other process instance.
return p;
}
}
}
//No other instance was found, return null.
return null;
}
}
Mutex可以实现单一实例
想要把那个参数传递过去,还要多费点脑筋
///应用程序的主入口点。
///</summary>
[STAThread]
staticvoid Main()
{
//防止程序多次运行
if(!OneInstance.IsFirst("GetPayInfo"))
{
MessageBox.Show ("警告:程序正在运行中! 请不要重复打开程序!可在右下角系统栏找到!","程序错误提示:",MessageBoxButtons.OK,MessageBoxIcon.Stop);
return;
}
Application.Run(new Form1());
}
// ******************* 防止程序多次执行 **************************
publicabstractclass OneInstance
{
///<summary>
///判断程序是否正在运行
///</summary>
///<param name="appId">程序名称</param>
///<returns>如果程序是第一次运行返回True,否则返回False</returns>
publicstaticbool IsFirst(string appId)
{
bool ret=false;
if(OpenMutex(0x1F0001,0,appId)==IntPtr.Zero)
{
CreateMutex(IntPtr.Zero,0,appId);
ret=true;
}
return ret;
}
[DllImport("Kernel32.dll",CharSet=CharSet.Auto)]
privatestaticextern IntPtr OpenMutex(
uint dwDesiredAccess, // access
int bInheritHandle, // inheritance option
string lpName // object name
);
[DllImport("Kernel32.dll",CharSet=CharSet.Auto)]
privatestaticextern IntPtr CreateMutex(
IntPtr lpMutexAttributes, // SD
int bInitialOwner, // initial owner
string lpName // object name
);
}
Program.cs
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool SetForegroundWindow(IntPtr hWnd);
[STAThread]
static void Main(string[] path)
{
Process anotherProcess = RuningInstance();
if (anotherProcess != null&&path.Length!=0)
{
//System.Windows.Forms.MessageBox.Show("己有实例在运行!");
string formName = anotherProcess.MainWindowTitle;
SendMessage(formName, path);
Application.Exit();
}
else
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
MainFrm1 mf1 = new MainFrm1();
mainFrm mf = new mainFrm();
if (path.Length != 0)
mf1._TxtFilePath = path[0];
Application.Run(mf1);
}
} static void SendMessage(string formName,string[] args )
{
int hPdf = IPCTool.FindWindow(null, @formName);
if (hPdf != 0)
{
IPCTool.COPYDATASTRUCT cds;
cds.dwData = (IntPtr)256;
cds.lpData = args[0];
cds.cbData = 256;
IPCTool.SendMessage(hPdf, 0x004A, 0, ref cds);
}
/*
LRESULT SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM IParam);
* hWnd:其窗口程序将接收消息的窗口的句柄。如果此参数为HWND_BROADCAST,则消息将被发送到系统中所有顶层窗口,包括无效或不可见的非自身拥有的窗口、被覆盖的窗口和弹出式窗口,但消息不被发送到子窗口。
* Msg:指定被发送的消息。
* wParam:指定附加的消息指定信息。
* IParam:指定附加的消息指定信息。
* 返回值:返回值指定消息处理的结果,依赖于所发送的消息。
* 备注:需要用HWND_BROADCAST通信的应用程序应当使用函数RegisterWindowMessage来为应用程序间的通信取得一个唯一的消息。
*/
} static Process RuningInstance()
{
Process current = Process.GetCurrentProcess();
Process[] processes = Process.GetProcessesByName(current.ProcessName);
foreach (Process p in processes)
{
if (p.Id != current.Id)
{
//确认相同进程的程序运行位置是否一样.
if (System.Reflection.Assembly.GetExecutingAssembly().Location.Replace("/", "\\") == current.MainModule.FileName)
{
//Return the other process instance.
return p;
}
}
}
//No other instance was found, return null.
return null;
} }
IPCTool.cs
public struct COPYDATASTRUCT
{
public IntPtr dwData;
public int cbData;
[MarshalAs(UnmanagedType.LPStr)]
public string lpData;
} [DllImport("User32.dll", EntryPoint = "SendMessage")]
public static extern int SendMessage(
int hWnd, //目标窗口的handle
int Msg, // 消息
int wParam, // 第一个消息参数
ref COPYDATASTRUCT lParam // 第二个消息参数
); [DllImport("User32.dll", EntryPoint = "FindWindow")]
public static extern int FindWindow(string lpClassName, string
lpWindowName); const int WM_COPYDATA = 0x004A;