如何编写c#代码,让程序只运行一个实例,如果程序已经存在则显示该程序
基本要求:1.程序只能运行一个实例。2.如果程序已经存在,且最小化,则还原那个程序。3.如果程序已经存在,且不是最小化(最大化或正常状态),则显示(注意:不是还原!)那个...
基本要求:
1.程序只能运行一个实例。
2.如果程序已经存在,且最小化,则还原那个程序。
3.如果程序已经存在,且不是最小化(最大化或正常状态),则显示(注意:不是还原!)那个程序。
4.最好不要使用win32的API。
5.可以使用注册表或者xml纪录状态。
尝试过的方法:
1.互斥法:使用mutex貌似无法实现上面2和3两条要求
2.进程法:虽然可以使用Win32的API中的
ShowWindowAsync(InPtr Process,1)
来显示,但是,如果原窗口最大化,则会还原窗口而非仅仅显示 展开
1.程序只能运行一个实例。
2.如果程序已经存在,且最小化,则还原那个程序。
3.如果程序已经存在,且不是最小化(最大化或正常状态),则显示(注意:不是还原!)那个程序。
4.最好不要使用win32的API。
5.可以使用注册表或者xml纪录状态。
尝试过的方法:
1.互斥法:使用mutex貌似无法实现上面2和3两条要求
2.进程法:虽然可以使用Win32的API中的
ShowWindowAsync(InPtr Process,1)
来显示,但是,如果原窗口最大化,则会还原窗口而非仅仅显示 展开
6个回答
展开全部
[DllImport("user32.dll")]
private static extern bool SetForegroundWindow(IntPtr hWnd);
[DllImport("user32.dll")]
private static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow);
[DllImport("user32.dll")]
private static extern bool IsIconic(IntPtr hWnd);
private const int SW_RESTORE = 9;
public void RaiseOtherProcess()
{
Process proc = Process.GetCurrentProcess();
Process.GetProcesses();
foreach (Process otherProc in
Process.GetProcessesByName(Process.GetCurrentProcess().ProcessName))
{
//ignore "this" process
if (proc.Id != otherProc.Id)
{
// Found a "same named process".
// Assume it is the one we want brought to the foreground.
// Use the Win32 API to bring it to the foreground.
IntPtr hWnd = otherProc.MainWindowHandle;
if (IsIconic(hWnd))
{
ShowWindowAsync(hWnd, 9);
}
SetForegroundWindow(hWnd);
break;
}
}
}
还是用mutex实现互斥。
当互斥发生时调用以上代码,实现:
2.如果程序已经存在,且最小化,则还原那个程序。
3.如果程序已经存在,且不是最小化(最大化或正常状态),则显示(注意:不是还原!)那个程序。
其实你主要是不知道可以用这个方法:SetForegroundWindow(hWnd);
来显示程序。
private static extern bool SetForegroundWindow(IntPtr hWnd);
[DllImport("user32.dll")]
private static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow);
[DllImport("user32.dll")]
private static extern bool IsIconic(IntPtr hWnd);
private const int SW_RESTORE = 9;
public void RaiseOtherProcess()
{
Process proc = Process.GetCurrentProcess();
Process.GetProcesses();
foreach (Process otherProc in
Process.GetProcessesByName(Process.GetCurrentProcess().ProcessName))
{
//ignore "this" process
if (proc.Id != otherProc.Id)
{
// Found a "same named process".
// Assume it is the one we want brought to the foreground.
// Use the Win32 API to bring it to the foreground.
IntPtr hWnd = otherProc.MainWindowHandle;
if (IsIconic(hWnd))
{
ShowWindowAsync(hWnd, 9);
}
SetForegroundWindow(hWnd);
break;
}
}
}
还是用mutex实现互斥。
当互斥发生时调用以上代码,实现:
2.如果程序已经存在,且最小化,则还原那个程序。
3.如果程序已经存在,且不是最小化(最大化或正常状态),则显示(注意:不是还原!)那个程序。
其实你主要是不知道可以用这个方法:SetForegroundWindow(hWnd);
来显示程序。
展开全部
就是千千静听那个效果?
虽然没做过有个思路 不过要用api就是了 参考下:
先用互斥法 如果程序以运行 则用sendmessage给程序发个消息 前提要在程序中重写 wndpro方法 在此方法中作出判断 并执行(也就是你说的第二三个条件) sendmessage中的句柄可以用
System.Diagnostics.Process.GetProcessesByName(进程名)[0].MainWindowHandle获得。
用注册表和xml 不知道会不会出错,记录数据准确性没保证 人家直接把你线程给结束掉 你奈他何(个人意见,高手请无视)。
虽然没做过有个思路 不过要用api就是了 参考下:
先用互斥法 如果程序以运行 则用sendmessage给程序发个消息 前提要在程序中重写 wndpro方法 在此方法中作出判断 并执行(也就是你说的第二三个条件) sendmessage中的句柄可以用
System.Diagnostics.Process.GetProcessesByName(进程名)[0].MainWindowHandle获得。
用注册表和xml 不知道会不会出错,记录数据准确性没保证 人家直接把你线程给结束掉 你奈他何(个人意见,高手请无视)。
参考资料: 原创回答
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
貌似很麻烦,顶一下……
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
听起来很有深度!学习下!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
有深度。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这个,,, 真不会!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询