现有一个程序,只能启动一个实例:启动时,如果检测到实例已启动,则激活并显示到最前端;否则启动一个新的实例:
为此可以通过事件实现。
// 判断是否已启动
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 { }
}
本文介绍了一种确保程序仅启动一个实例的方法。当尝试启动第二个实例时,将激活首个实例并将其置于前台。通过使用事件对象和后台线程来监测和激活已有实例。
640

被折叠的 条评论
为什么被折叠?



