现有一个程序,只能启动一个实例:启动时,如果检测到实例已启动,则激活并显示到最前端;否则启动一个新的实例:
为此可以通过事件实现。
// 判断是否已启动
bool IsFormExists(Form frmOwner_, string strEvent_)
{
EventWaitHandle eHandle;
try
{
eHandle = EventWaitHandle.OpenExisting(strEvent_);
// Form has start, close it
eHandle.Set(); // 设定为有信号,已激活Restore线程
eHandle.Close();
frmOwner_.Close();
return true;
}
catch (WaitHandleCannotBeOpenedException)
{
}
// 第一个实例,创建事件,并启动线程
eHandle = new EventWaitHandle(false, EventResetMode.ManualReset, strEvent_);
Thread thrRestore = new Thread(new ParameterizedThreadStart(RestoreForm));
thrRestore.IsBackground = true;
FormParam stParam = new FormParam();
stParam.frmOwner = frmOwner_;
stParam.eHandle = eHandle;
thrRestore.Start(stParam);
return false;
}
delegate void DelNonParam();
void RestoreForm(object oParam_)
{
FormParam stParam = (FormParam)oParam_;
try
{
while (true)
{
stParam.eHandle.WaitOne();
stParam.eHandle.Reset();
stParam.frmOwner.Invoke(new DelNonParam(delegate()
{ // 激活实例,并显示到最前端
if (stParam.frmOwner.WindowState == FormWindowState.Minimized)
stParam.frmOwner.WindowState = FormWindowState.Normal;
stParam.frmOwner.BringToFront();
stParam.frmOwner.Activate();
})
);
}
}
catch { }
}
为此可以通过事件实现。
// 判断是否已启动
bool IsFormExists(Form frmOwner_, string strEvent_)
{
EventWaitHandle eHandle;
try
{
eHandle = EventWaitHandle.OpenExisting(strEvent_);
// Form has start, close it
eHandle.Set(); // 设定为有信号,已激活Restore线程
eHandle.Close();
frmOwner_.Close();
return true;
}
catch (WaitHandleCannotBeOpenedException)
{
}
// 第一个实例,创建事件,并启动线程
eHandle = new EventWaitHandle(false, EventResetMode.ManualReset, strEvent_);
Thread thrRestore = new Thread(new ParameterizedThreadStart(RestoreForm));
thrRestore.IsBackground = true;
FormParam stParam = new FormParam();
stParam.frmOwner = frmOwner_;
stParam.eHandle = eHandle;
thrRestore.Start(stParam);
return false;
}
delegate void DelNonParam();
void RestoreForm(object oParam_)
{
FormParam stParam = (FormParam)oParam_;
try
{
while (true)
{
stParam.eHandle.WaitOne();
stParam.eHandle.Reset();
stParam.frmOwner.Invoke(new DelNonParam(delegate()
{ // 激活实例,并显示到最前端
if (stParam.frmOwner.WindowState == FormWindowState.Minimized)
stParam.frmOwner.WindowState = FormWindowState.Normal;
stParam.frmOwner.BringToFront();
stParam.frmOwner.Activate();
})
);
}
}
catch { }
}