WPF-禁止二次启动

App.xaml.cs

 1         protected override void OnStartup(StartupEventArgs e)
 2         {
 3             //禁止二次启动
 4             this.Startup += new StartupEventHandler(App_Startup);
 5             base.OnStartup(e);
 6         }
 7         #region 禁止二次启动
 8         // 用于激活已打开的窗体
 9         [DllImport("user32.dll")]
10         public static extern void SetForegroundWindow(IntPtr hwnd);
11         //操作当前窗体
12         //nCmdShow: 0关闭窗口/1正常大小显示窗口/2最小化窗口/3最大化窗口
13         [DllImport("user32.dll")]
14         public static extern int ShowWindow(IntPtr hwnd, int nCmdShow);
15
16         System.Threading.Mutex mutex;
17         void App_Startup(object sender, StartupEventArgs e)
18         {
19             bool ret;
20             mutex = new System.Threading.Mutex(true, "WpfDemo", out ret);
21             if (!ret)
22             {
23                 System.Diagnostics.Process[] proc = System.Diagnostics.Process.GetProcessesByName("WpfDemo");
24                 foreach (System.Diagnostics.Process p in proc)
25                 {
26                     SetForegroundWindow(p.MainWindowHandle);
27                     ShowWindow(p.MainWindowHandle, 1);
28                     NoSecond.SendMessage(p.MainWindowHandle);
29                 }
30                 Environment.Exit(0);
31             }
32         }
33         #endregion

Window.cs

        #region 禁止二次启动
        private void Window_SourceInitialized(object sender, EventArgs e)
        {
            HwndSource source = HwndSource.FromHwnd(new WindowInteropHelper(this).Handle);
            if (source == null) { throw new Exception("Cannot get HwndSource instance."); }
            source.AddHook(new HwndSourceHook(this.WndProc));
        }
        private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
        {
            try
            {
                switch (msg)
                {
                    case NoSecond.NoSecond_DATA:
                        this.Show();
                        break;
                }
            }
            catch (Exception) { }
            return IntPtr.Zero;
        }
        #endregion

NoSecond.cs

 1 #region 禁止二次启动程序
 2 public class NoSecond
 3 {
 4     public const int NoSecond_DATA = 0x004A;
 5     [DllImport("User32.dll", EntryPoint = "SendMessage")]
 6     private static extern int SendMessage
 7     (
 8             IntPtr hWnd,                   //目标窗体句柄
 9             int Msg,                       //WM_COPYDATA
10             int wParam,                                             //自定义数值
11             ref  CopyDataStruct lParam             //结构体
12     );
13     [StructLayout(LayoutKind.Sequential)]
14     public struct CopyDataStruct
15     {
16         public IntPtr dwData;
17         public int cbData;//字符串长度
18         [MarshalAs(UnmanagedType.LPStr)]
19         public string lpData;//字符串
20     }
21
22     public static void SendMessage(IntPtr thisIntPtr)
23     {
24         IntPtr xmlIntPt = new IntPtr(GetIntPtr());
25         if (xmlIntPt != IntPtr.Zero || thisIntPtr != IntPtr.Zero)
26         {
27             CopyDataStruct cds;
28             cds.dwData = IntPtr.Zero;
29             cds.lpData = "0123";
30             cds.cbData = 4;//注意:长度为字节数
31             int fromWindowHandler = 0;// 消息来源窗体
32             SendMessage(thisIntPtr.ToInt32() == 0 ? xmlIntPt : thisIntPtr, NoSecond_DATA, fromWindowHandler, ref  cds);
33         }
34     }
35
36     #region 获取窗体句柄指针
37     static string _IntPtrData = AppDomain.CurrentDomain.BaseDirectory + "/XML/Data.xml";
38     static int GetIntPtr()
39     {
40         if (!System.IO.File.Exists(_IntPtrData))
41         {
42             if (!Directory.Exists(AppDomain.CurrentDomain.BaseDirectory + "/XML/")) { Directory.CreateDirectory(AppDomain.CurrentDomain.BaseDirectory + "/XML/"); }
43             XmlDocument doc = new XmlDocument();
44             doc.AppendChild(doc.CreateXmlDeclaration("1.0", "utf-8", ""));
45             XmlElement root = doc.CreateElement("Root");
46             root.InnerText = "0";
47             doc.AppendChild(root);
48             doc.Save(_IntPtrData);
49         }
50         XDocument xml = XDocument.Load(_IntPtrData);
51         XElement xmlRoot = xml.Root;
52         return Convert.ToInt32(xmlRoot.Value);
53     }
54     #endregion
55 }
56 #endregion
时间: 2024-12-28 23:42:19

WPF-禁止二次启动的相关文章

从PRISM开始学WPF(二)Prism?

原文:从PRISM开始学WPF(二)Prism? 目录: 从PRISM开始学WPF(一)WPF? 从PRISM开始学WPF(二)Prism? 从PRISM开始学WPF(三)Prism-Region? 从PRISM开始学WPF(四)Prism-Module? 从PRISM开始学WPF(五)MVVM(一)ViewModel? 从PRISM开始学WPF(六)MVVM(二)Command? 从PRISM开始学WPF(七)MVVM(三)事件聚合器EventAggregator? 0x1 PRISM? PR

问题-[delphi2007、2010]无法二次启动,报EditorLineEnds.ttr被占用,进程一直有bds.exe?

问题现象:delphi2007.2010无法二次启动,报EditorLineEnds.ttr被占用,而且进程中一直有bds.exe的进程? 问题原因:问题处理:方法一:可能是系统更新的东东造在的.KB2970228和KB2982791.KB2970228和KB2976897.KB2993651. 方法二:实在没法了,就用批处理吧.@echo offset NewFileName="%TEMP%\%date:~0,4%%date:~5,2%%date:~8,2%%time:~0,2%%time:~

Python+selenium+eclipse执行web自动化(二)启动浏览器

一.浏览器兼容性 当前selenium 2.0支持的浏览器 从selenium的__init__文件中可以查看到,我当前使用的selenium版本是2.53.2 从selenium的Webdriver模块查看__init__文件,可以看到以下代码: from .firefox.webdriver import WebDriver as Firefoxfrom .firefox.firefox_profile import FirefoxProfilefrom .chrome.webdriver

自动更新.检测外部程序版本号.管理员权限.禁止多次启动.代码混淆

自动更新.启动a程序.检测b程序版本号.然后在服务器上上传下载.由于要控制别人程序.所以还要检测别人程序的版本号.不一致会发短信到开发人员 ICSharpCode.SharpZipLib.dll 解压缩工具 private string GetRequestDownFile(string url, string path)//HTTP下载 { try { // 设置参数 HttpWebRequest request = WebRequest.Create(url) as HttpWebReque

C#多线程开发9:使用Mutex类禁止应用程序启动两次

使用Mutex类可以创建有名称的互斥,而系统可以识别有名称的互斥,因此可以使用Mutex类禁止应用程序启动两次. 下面是此种场景的演示代码. using System; using System.Threading; namespace Run1InstanceExample { class Program { [STAThread] static void Main(string[] args) { bool createdNew; var mutex = new Mutex(false, "

WPF属性(二)附加属性

原文:WPF属性(二)附加属性 附加属性是说一个属性本来不属于某个对象,但由于某种需求而被后来附加上,也就是把对象放入一个特定环境后对象才具有的属性就称为附加属性,附加属性的作用就是将属性与数据类型解耦,让数据类型的设计更加灵活,举例,一个TextBox被放在不同的布局容器中时就会有不同的布局属性,这些属性就是由布局容器为TextBox附加上的,附加属性的本质就是依赖属性,二者仅仅在注册和包装器上有一点区别 小技巧,在VS中输入propa后,连按两次tab键,可以添加好一个附加属性的框架,继续按

WPF 开发自动开机启动程序

原文:WPF 开发自动开机启动程序 本文告诉大家如何在 WPF 开发一个可以自动启动的程序 本文使用的自动开机启动方法是通过快捷方式放在启动文件夹的方式. 创建快捷方式 /// <summary> /// 为本程序创建一个快捷方式. /// </summary> /// <param name="lnkFilePath">快捷方式的完全限定路径.</param> /// <param name="args">

Caddy源码阅读(二)启动流程与 Event 事件通知

Caddy源码阅读(二)启动流程与 Event 事件通知 Preface Caddy 是 Go 语言构建的轻量配置化服务器.https://github.com/caddyserver/caddy Caddy 整个软件可以说是由不同的 插件 堆砌起来的.自己本身仅提供 Plugin 的注册运行逻辑和 Server 的监听服务功能. 学习 caddy 的源码,实际上是学习 如何构建一个 松耦合的 抽象 Plugin 设计,即模块化插拔的做法. 所以我们的源码阅读,围绕 Caddy 为 Plugin

WPF 操作二维码(二)

上一篇文章中讲述了使用C#生成二维码的操作,接下来进一步添加功能. 1. 将生成的二维码保存成本地图片 该操作的关键是如何读取Image控件中资源,并保存到本地. 1.1 创建一个BitmapSource的对象,表示具有特定大小和分辨率的单个不变的像素集. 1.2 创建一个BitmapEncoder的对象,将BitmapFram对象的集合编码为图像流. 1.3 使用BitmapFrame.Create方法,从给定的BitmapSource创建新的BitmapSource 1.4 FileStre