码迷,mamicode.com
首页 > Windows程序 > 详细

WPF-禁止二次启动

时间:2016-02-17 15:56:14      阅读:1462      评论:0      收藏:0      [点我收藏+]

标签:

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

 

WPF-禁止二次启动

标签:

原文地址:http://www.cnblogs.com/liuph/p/5195556.html

(0)
(2)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!