转自: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的更多相关文章

  1. WPF:如何实现单实例的应用程序(Single Instance)

    原文:WPF:如何实现单实例的应用程序(Single Instance) 好吧,这是我将WPF与Windows Forms进行比较的系列文章的第四篇,讨论一下如何实现单实例(single instan ...

  2. (转)Single Instance Form in a MDI application

    private void OpenForm<T>() where T : Form, new() { T frm = (T)new List<Form>(this.MdiChi ...

  3. Multiple websites on single instance of IIS

    序幕 通常需要在单个IIS实例上托管多个网站,主要在开发环境中,而不是在生产服务器上.我相信它在生产服务器上不是一个首选解决方案,但这至少是一个可能的实现. Web服务器单实例上的多个网站的好处是: ...

  4. Three ways to do WCF instance management

    Three ways to do WCF instance management (Per call, Per session, and Single). IntroductionVery often ...

  5. 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 ...

  6. 关于WPF你应该知道的2000件事

    原文 关于WPF你应该知道的2000件事 以下列出了迄今为止为WPF博客所知的2,000件事所创建的所有帖子. 帖子总数= 1,201 动画 #7 - 基于属性的动画 #686 - 使用动画制作图像脉 ...

  7. Server-Side UI Automation Provider - WPF Sample

    Server-Side UI Automation Provider - WPF Sample 2014-09-14 引用程序集 自动化对等类 WPF Sample 参考 引用程序集 返回 UIAut ...

  8. WCF Concurrency (Single, Multiple, and Reentrant) and Throttling

    http://www.codeproject.com/Articles/89858/WCF-Concurrency-Single-Multiple-and-Reentrant-and Introduc ...

  9. WPF实现只打开一个窗口,并且重复打开时已经打开的窗口置顶

    内容来自:https://codereview.stackexchange.com/questions/20871/single-instance-wpf-application 第一步:添加Syst ...

随机推荐

  1. XUtils框架中HttpUtils使用Get请求时总是返回相同信息的问题解决,xutilshttputils

    如需转载请标明出处:http://blog.csdn.net/itas109 版本:Xutils 2014年11月11日 下载地址:https://github.com/wyouflf/xUtils ...

  2. oracle组建:ODAC112021Xcopy_x64,在开发机上,不用安装oracle的客户端等开发

    以下解决方案是为了连接远程服务器上的oracle 11g 的解决方案. 下载地址:http://www.oracle.com/technetwork/database/windows/download ...

  3. [翻译] java NIO 教程---介绍

    原文地址:http://tutorials.jenkov.com/java-nio/index.html Java NIO(new IO)是从java1.4之后的对IO API的另一种选择,即对标准j ...

  4. IntelliJ IDEA 编译方式介绍

    编译方式介绍 相比较于 Eclipse 的实时自动编译,IntelliJ IDEA 的编译更加手动化,虽然 IntelliJ IDEA 也支持通过设置开启实时编译,但是不建议,因为太占资源了.Inte ...

  5. JAVA开发Web Service几种框架介绍

    郑重声明:此文为转载来的,出处已不知了,侵告删. 在讲Web Service开发服务时,需要介绍一个目前开发Web Service的几个框架,分别为Axis,axis2,Xfire,CXF以及JWS( ...

  6. cpp quiz

    // ConsoleApplication1.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream&g ...

  7. HDU 4069 Squiggly Sudoku(DLX)(The 36th ACM/ICPC Asia Regional Fuzhou Site —— Online Contest)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4069 Problem Description Today we play a squiggly sud ...

  8. 1019: A+B和C比大小

    1019: A+B和C比大小 时间限制: 1 Sec  内存限制: 128 MB提交: 518  解决: 300[提交][状态][讨论版] 题目描述 给定区间[-231, 231]内的3个整数A.B和 ...

  9. CCF真题之图像旋转

    201503-1 问题描述 旋转是图像处理的基本操作,在这个问题中,你需要将一个图像逆时针旋转90度. 计算机中的图像表示可以用一个矩阵来表示,为了旋转一个图像,只需要将对应的矩阵旋转即可. 输入格式 ...

  10. explode and implode

    [PHP源码阅读]explode和implode函数   explode和implode函数主要用作字符串和数组间转换的操作,比如获取一段参数后根据某个字符分割字符串,或者将一个数组的结果使用一个字符 ...