关于怎么在winform里增加登录窗体或者如何让winform程序单实例运行网上都很多例子。

然而两者结合起来呢?

//Program.cs

  static class Program
{
public static EventWaitHandle ProgramStarted; /// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
bool createNew;
ProgramStarted = new EventWaitHandle(false, EventResetMode.AutoReset, "MSFTD_SERVICE", out createNew); if (!createNew)
{
ProgramStarted.Set();
return;
} Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false); AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException); try
{
LoginForm LoginForm = new LoginForm();
if (LoginForm.ShowDialog() == DialogResult.OK)
{
Application.Run(new MainForm());
}
}
catch (Exception ex)
{
//TODO
}
} static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
//TODO
} static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
{
//TODO
}
}

//LoginForm.cs

public partial class LoginForm : Form
{
RegisteredWaitHandle handle; public LoginForm()
{
InitializeComponent();
handle = ThreadPool.RegisterWaitForSingleObject(Program.ProgramStarted, OnProgramStarted, null, -, false);
} void OnProgramStarted(object state, bool timeout)
{
this.Invoke((MethodInvoker)delegate
{
this.Show();
this.WindowState = FormWindowState.Normal;
this.Activate();
});
}      private void btn_Login_Click(object sender, EventArgs e)
{
       handle.Unregister(null);
  
       this.DialogResult = DialogResult.OK; }
    }

//MainForm.cs

public partial class MainForm : Form
{
#region init method, when user try to run two exe at the same time, show tips
public MainForm()
{
InitializeComponent(); this.SizeChanged += OnSizeChanged;
ThreadPool.RegisterWaitForSingleObject(Program.ProgramStarted, OnProgramStarted, null, -, false);
this.WindowState = FormWindowState.Normal;
} void OnSizeChanged(object sender, EventArgs e)
{
if (this.WindowState == FormWindowState.Minimized)
{
this.notifyIcon.ShowBalloonTip(, "MSFTD Service", "MSFTD Service is running.", ToolTipIcon.Info);
this.Visible = false;
}
} private void notifyIcon_MouseDoubleClick(object sender, MouseEventArgs e)
{
this.Visible = true;
this.WindowState = FormWindowState.Normal;
} void OnProgramStarted(object state, bool timeout)
{
this.Invoke((MethodInvoker)delegate
{
this.notifyIcon.ShowBalloonTip(, "MSFTD Service", "MSFTD Service is running.", ToolTipIcon.Info);
this.Show();
this.WindowState = FormWindowState.Normal;
this.Activate();
});
}
#endregion
}

WinForm 登录窗体 + 单实例运行的更多相关文章

  1. C# WinForm API 改进单实例运行

    在普通的单实例中,第二次点击软件快捷方式的时候,往往简单提示"系统已经运行",而不是把第一次打开的软件主窗体显示出来,下面演示如果主窗体已经打开则把第一次打开的主窗体放置到最前面; ...

  2. DevExpress Winform使用单例运行程序方法和非DevExpress使用Mutex实现程序单实例运行且运行则激活窗体的方法

    原文:DevExpress Winform使用单例运行程序方法和非DevExpress使用Mutex实现程序单实例运行且运行则激活窗体的方法 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA ...

  3. Winform 单实例运行

    Winform 单实例运行 前言 前两天在博客园看到<如何防止程序多次运行>,文章写的很好,最后还留下一个问题给我们思考.关于Winform的防止多次运行,曾经也想研究过,但是后来工作上没 ...

  4. C#实现单实例运行

    C#实现单实例运行的方法,也有多种,比如利用 Process 查找进程的方式,利用 API findwindow 查找窗体的方式,还有就是 利用 Mutex 原子操作,上面几种方法中, 综合考虑利用 ...

  5. Qt实现应用程序单实例运行--LocalServer方式

    使Qt应用程序能够单实例运行的典型实现方法是使用共享内存实现.该方法实现简单,代码简洁. 但有一个致命缺陷:共享内存(QSharedMemory)实现的单程序运行,当运行环境是UNIX时,并且程序不幸 ...

  6. C++实现程序单实例运行的两种方式

    简介 在我们编写程序的时候,经常会注意到的一个问题就是如何能够让程序只运行一个实例,确保不会让同一个程序多次运行,从而产生诸多相同进程,给我们的带来不便呢?那么常用的有以下四种方法,第一种方法是通过扫 ...

  7. Windows进程单实例运行

    场景         Windows进程单实例运行,如果有进程没有退出,继续等待,直到进程完全退出,才会进入下一个实例 HANDLE pHandle = NULL; do  {  pHandle = ...

  8. c#设计应用程序单实例运行

    利用WindowsFormsApplicationBase的IsSingleInstance来控制应用程序只能单实例运行. [DllImport("user32.dll", Ent ...

  9. c# 单实例运行

    /// <summary> /// 单实例运行程序 /// </summary> static void SingleInstanceRun() { bool isAppRun ...

随机推荐

  1. Advapi32.dll 函数接口说明

    Advapi32.dll 函数接口说明             函数原型                               说明    AbortSystemShutDown         ...

  2. setprecision、fixed、showpoint的用法总结(经典!!超经典!!)【转】

    本文转载自:http://blog.csdn.net/u011321546/article/details/9293547 首先要加头文件:iomanip 一:setprecision 作用:控制输出 ...

  3. Android系统升级那些事儿【转】

    本文转载自:http://blog.csdn.net/chenyufei1013/article/details/12705719 版权声明:本文为博主原创文章,未经博主允许不得转载.   目录(?) ...

  4. 到底什么是nandflash,norflash,sdram,emmc,rom,ram【转】

    本文转载自:http://blog.sina.com.cn/s/blog_6dd8f2b70101le26.html 最近被nandflash,norflash,sdram,emmc,rom,ram搞 ...

  5. Elasticsearch源码分析—线程池(十一) ——就是从队列里处理请求

    Elasticsearch源码分析—线程池(十一) 转自:https://www.felayman.com/articles/2017/11/10/1510291570687.html 线程池 每个节 ...

  6. ortp库使用入门

    我们知道, RTP(Real-timeTransportProtocol)是用于Internet上针对多媒体数据流的一种传输协议,做流媒体传输方面的应用离不开RTP协议的实现及使用,为了更加快速地在项 ...

  7. wireshark解析rtp协议,流媒体中的AMR/H263/H264包的方法

    抓到完整的流媒体包之后,用wireshark打开,其中的包可能不会自动映射成RTP+AMR/H263/H264的包,做如下修改操作即可:1.  把UDP 包解析成RTP/RTCP包.选中UDP包,右键 ...

  8. [Apple开发者帐户帮助]六、配置应用服务(2)创建DeviceCheck私钥

    要验证与DeviceCheck服务的通信,您将使用启用了DeviceCheck的私钥. 首先创建并下载启用了DeviceCheck 的私钥.然后获取密钥标识符(kid)以创建JSON Web令牌(JW ...

  9. POJ 2823 线段树 Or 单调队列

    时限12s! 所以我用了线段树的黑暗做法,其实正解是用单调队列来做的. //By SiriusRen #include <cstdio> #include <cstring> ...

  10. SQLServer 在存储过程里使用事务控制的简单小例子

    alter proc sp_test(     @name varchar(50))asbegin    --开始事务   begin transaction   --设置一个存储报错代码的变量   ...