WPF single instance
转自:http://www.cnblogs.com/z_lb/archive/2012/09/16/2687487.html public partial class App : Application
{
private static Semaphore singleInstanceWatcher;
private static bool createdNew;
static App()
{
// Ensure other instances of this application are not running.
singleInstanceWatcher = new Semaphore(
0, // Initial count.
1, // Maximum count.
Assembly.GetExecutingAssembly().GetName().Name,
out createdNew);
if (createdNew)
{
// This thread created the kernel object so no other instance
// of this application must be running.
//Application currApp = Application.Current;
//currApp.StartupUri = new Uri("MainWindow.xaml", UriKind.RelativeOrAbsolute);
MainWindow win = new MainWindow();
win.Show();
}
else
{
// This thread opened an existing kernel object with the same
// string name; another instance of this app must be running now.
// Gets a new System.Diagnostics.Process component and the
// associates it with currently active process.
Process current = Process.GetCurrentProcess();
// Enumerate through all the process resources on the share
// local computer that the specified process name.
foreach (Process process in
Process.GetProcessesByName(current.ProcessName))
{
if (process.Id != current.Id)
{
NativeMethods.SetForegroundWindow(
process.MainWindowHandle);
NativeMethods.ShowWindow(process.MainWindowHandle,
WindowShowStyle.Restore);
break;
}
}
// Terminate this process and gives the underlying operating
// system the specified exit code.
Environment.Exit(-2);
}
// 如果代码在Application_Startup中 如下
// private Semaphore singleInstanceWatcher;
// private bool createdNew;
//private void Application_Startup(object sender, StartupEventArgs e)
//{
// singleInstanceWatcher = new Semaphore(
// 0, // Initial count.
// 1, // Maximum count.
// Assembly.GetExecutingAssembly().GetName().Name,
// out createdNew);
// if (createdNew)
// {
// // This thread created the kernel object so no other instance
// // of this application must be running.
// Application currApp = Application.Current;
// currApp.StartupUri = new Uri("MainWindow.xaml", UriKind.RelativeOrAbsolute);
// }
// else
// {
// //MessageBox.Show("系统已经运行");
// Process current = Process.GetCurrentProcess();
// foreach (Process process in
// Process.GetProcessesByName(current.ProcessName))
// {
// if (process.Id != current.Id)
// {
// NativeMethods.SetForegroundWindow(
// process.MainWindowHandle);
// NativeMethods.ShowWindow(process.MainWindowHandle,
// WindowShowStyle.Restore);
// break;
// }
// }
// Environment.Exit(-2);
// }
}
}
internal enum WindowShowStyle : uint
{
/// <summary>Hides the window and activates another window.</summary>
/// <remarks>See SW_HIDE</remarks>
Hide = 0,
/// <summary>Activates and displays a window. If the window ..
/// or maximized, the system restores it to its original size and
/// position. An application should specify this flag when displaying
/// the window for the first time.</summary>
/// <remarks>See SW_SHOWNORMAL</remarks>
ShowNormal = 1,
/// <summary>Activates the window and displays it ..</summary>
/// <remarks>See SW_SHOWMINIMIZED</remarks>
ShowMinimized = 2,
/// <summary>Activates the window and displays it ..</summary>
/// <remarks>See SW_SHOWMAXIMIZED</remarks>
ShowMaximized = 3,
/// <summary>Maximizes the specified window.</summary>
/// <remarks>See SW_MAXIMIZE</remarks>
Maximize = 3,
/// <summary>Displays a window in its most recent size and position.
/// This value is similar to "ShowNormal", except the window is not
/// actived.</summary>
/// <remarks>See SW_SHOWNOACTIVATE</remarks>
ShowNormalNoActivate = 4,
/// <summary>Activates the window and displays it in its current size
/// and position.</summary>
/// <remarks>See SW_SHOW</remarks>
Show = 5,
/// <summary>Minimizes the specified window and activates the next
/// top-level window in the Z order.</summary>
/// <remarks>See SW_MINIMIZE</remarks>
Minimize = 6,
/// <summary>Displays the window as a minimized window. This value is
/// similar to "ShowMinimized", except the window ..</summary>
/// <remarks>See SW_SHOWMINNOACTIVE</remarks>
ShowMinNoActivate = 7,
/// <summary>Displays the window in its current size and position. This
/// value is similar to "Show", except the window ..</summary>
/// <remarks>See SW_SHOWNA</remarks>
ShowNoActivate = 8,
/// <summary>Activates and displays the window. If the window is
/// minimized or maximized, the system restores it to its original size
/// and position. An application should specify this flag ..
/// a minimized window.</summary>
/// <remarks>See SW_RESTORE</remarks>
Restore = 9,
/// <summary>Sets the show state based on the SW_ value specified ..
/// STARTUPINFO structure passed to the CreateProcess function by the
/// program that started the application.</summary>
/// <remarks>See SW_SHOWDEFAULT</remarks>
ShowDefault = 10,
/// <summary>Windows 2000/XP: Minimizes a window, even if the thread
/// that owns the window is hung. This flag should only be used when
/// minimizing windows from a different thread.</summary>
/// <remarks>See SW_FORCEMINIMIZE</remarks>
ForceMinimized = 11
}
static class NativeMethods
{
/// <summary>
/// Brings the thread that created the specified window into the
/// foreground and activates the window. Keyboard input is directed
/// to the window, and various visual cues are changed for the user.
/// The system assigns a slightly higher priority to the thread that
/// created the foreground window than it does to other threads.
/// </summary>
/// <param name="hWnd">A handle to the window that should be
/// activated and brought to the foreground.
/// </param>
/// <returns>If the window was brought to the foreground, the
/// return value is nonzero. </returns>
[DllImport("user32.dll")]
internal static extern bool SetForegroundWindow(IntPtr hWnd);
/// <summary>Shows a Window</summary>
/// <remarks>
/// <para>To perform certain special effects when showing or hiding a
/// window, use AnimateWindow.</para>
/// <para>The first time an application calls ShowWindow, it should use
/// the WinMain function's nCmdShow parameter as its nCmdShow ..
/// Subsequent calls to ShowWindow must use one of the values in the
/// given list, instead of the one specified by the WinMain function's
/// nCmdShow parameter.</para>
/// <para>As noted in the discussion of the nCmdShow parameter, the
/// nCmdShow value is ignored in the first call to ShowWindow if the
/// program that launched the application specifies startup information
/// in the structure. In this case, ShowWindow uses the information
/// specified in the STARTUPINFO structure to show the window. On
/// subsequent calls, the application must call ShowWindow with ..
/// set to SW_SHOWDEFAULT to use the startup information provided by ..
/// program that launched the application. This behavior is designed ..
/// the following situations: </para>
/// <list type="">
/// <item>Applications create their main window by calling ..
/// with the WS_VISIBLE flag set. </item>
/// <item>Applications create their main window by calling ..
/// with the WS_VISIBLE flag cleared, and later call ShowWindow ..
/// SW_SHOW flag set to make it visible.</item>
/// </list></remarks>
/// <param name="hWnd">Handle to the window.</param>
/// <param name="nCmdShow">Specifies how the window is to be shown.
/// This parameter is ignored the first time an application calls
/// ShowWindow, if the program that launched the application provides a
/// STARTUPINFO structure. Otherwise, the first time ShowWindow .. ,
/// the value should be the value obtained by the WinMain function ..
/// nCmdShow parameter. In subsequent calls, this parameter ..
/// the WindowShowStyle members.</param>
/// <returns>
/// If the window was previously visible, the return value is nonzero.
/// If the window was previously hidden, the return value is zero.
/// </returns>
[DllImport("user32.dll")]
internal static extern bool ShowWindow(IntPtr hWnd,
WindowShowStyle nCmdShow);
}
WPF single instance的更多相关文章
- WPF:如何实现单实例的应用程序(Single Instance)
原文:WPF:如何实现单实例的应用程序(Single Instance) 好吧,这是我将WPF与Windows Forms进行比较的系列文章的第四篇,讨论一下如何实现单实例(single instan ...
- (转)Single Instance Form in a MDI application
private void OpenForm<T>() where T : Form, new() { T frm = (T)new List<Form>(this.MdiChi ...
- Multiple websites on single instance of IIS
序幕 通常需要在单个IIS实例上托管多个网站,主要在开发环境中,而不是在生产服务器上.我相信它在生产服务器上不是一个首选解决方案,但这至少是一个可能的实现. Web服务器单实例上的多个网站的好处是: ...
- Three ways to do WCF instance management
Three ways to do WCF instance management (Per call, Per session, and Single). IntroductionVery often ...
- Writing a Reusable Custom Control in WPF
In my previous post, I have already defined how you can inherit from an existing control and define ...
- 关于WPF你应该知道的2000件事
原文 关于WPF你应该知道的2000件事 以下列出了迄今为止为WPF博客所知的2,000件事所创建的所有帖子. 帖子总数= 1,201 动画 #7 - 基于属性的动画 #686 - 使用动画制作图像脉 ...
- Server-Side UI Automation Provider - WPF Sample
Server-Side UI Automation Provider - WPF Sample 2014-09-14 引用程序集 自动化对等类 WPF Sample 参考 引用程序集 返回 UIAut ...
- WCF Concurrency (Single, Multiple, and Reentrant) and Throttling
http://www.codeproject.com/Articles/89858/WCF-Concurrency-Single-Multiple-and-Reentrant-and Introduc ...
- WPF实现只打开一个窗口,并且重复打开时已经打开的窗口置顶
内容来自:https://codereview.stackexchange.com/questions/20871/single-instance-wpf-application 第一步:添加Syst ...
随机推荐
- MOGRE学习笔记(3)--MOGRE小项目练习
学习OGRE有一段时间了,领导为了检测学习效果,根据已有C++项目,弄一个类似的用c#语言编写的小项目. 配置:win7,DirectX2009,vs2010. 项目要求: 1.有Ogre窗口(尺寸1 ...
- 串口通信类,WPF
参考之前的资料,写了一个自己常用的串口类, 字符串发送类型用了两种方式,char[] 和byte[] : 数据接收也是采用两种 char[] 和byte[] 两种. 类代码贴出来: public cl ...
- [NetTopologySuite](1)线面相交
用DotSpatial.Topology进行的测试,即使有NetTopologySuite类库进行测试: Polygon inputGeometry = null; LineString analys ...
- crsctl stat res -t 和 crsctl stat res -init -t
11.2.0.2的grid infrastructure中crsctl stat res命令不再显示如ora.cssd.ora.ctssd.ora.diskmon等基础资源的信息.但是查看这些基础资源 ...
- R语言putty中直接使用X11(Xming)绘图
1.下载Xming地址 http://pan.baidu.com/s/1o6ilisU,安装,推荐默认安装在C盘,推荐快捷方式放在与putty快捷方式同一个文件夹: 2.打开putty,在SSH的X1 ...
- Linux内核源码分析方法
一.内核源码之我见 Linux内核代码的庞大令不少人“望而生畏”,也正因为如此,使得人们对Linux的了解仅处于泛泛的层次.如果想透析Linux,深入操作系统的本质,阅读内核源码是最有效的途径.我们都 ...
- .vimrc文件配置及航意
1. vimrc文件常见语句释义 设定 tab 的位置 :set tabstop=4 输入 tab 时自动将其转化为空格 :set expandtab ...
- JetBrains公司介绍(Java、Python、PHP、Ruby、前端和代码测试与重构的IDE)
JetBrains JetBrains是一家捷克的软件开发公司,该公司位于捷克的布拉格,并在俄国的圣彼得堡及美国麻州波士顿都设有办公室,该公司最为人所熟知的产品是Java编程语言开发撰写时所用的集成开 ...
- 变形--旋转 rotate()
旋转rotate()函数通过指定的角度参数使元素相对原点进行旋转.它主要在二维空间内进行操作,设置一个角度值,用来指定旋转的幅度.如果这个值为正值,元素相对原点中心顺时针旋转:如果这个值为负值,元素相 ...
- CCF真题之相反数
201403-1 问题描述 有 N 个非零且各不相同的整数.请你编一个程序求出它们中有多少对相反数(a 和 -a 为一对相反数). 输入格式 第一行包含一个正整数 N.(1 ≤ N ≤ 500). ...