Winform and WPF 第二遍双击快捷方式或应用程序打开原来的应用程序而不新建一个实例[进程通信 1]

Posted 蝸小牛

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Winform and WPF 第二遍双击快捷方式或应用程序打开原来的应用程序而不新建一个实例[进程通信 1]相关的知识,希望对你有一定的参考价值。

 private void Window_Loaded(object sender, RoutedEventArgs e)

        {
            Process[] pro = Process.GetProcesses();
            int n = pro.Where(p => p.ProcessName.Equals("进程名称")).Count();
            if (n > 1)
            {
                Application.Current.Shutdown();
                return;
            }
        }
 
转载自:http://blog.csdn.net/wzhiu/article/details/7676702
技术分享分类:

今天工作忙完之余,总结一些Winform WPF应用程序,第二遍双击快捷方式或应用程序打开原来的应用程序而不新建一个实例。 下面两个例子分别用了两种不同的方式实现了进程间的通信。

 

---------------------------------------------------------------------------WinformStart---------------------------------------------------------------------

File 1:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using System.Diagnostics;
using System.Reflection;
using XXXSDK;
using System.IO;
 
namespace Server
{
    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
 
            Process instance = RunningInstance();
            if (instance == null)
            {
                Application.Run(new Form1());
            }
            else
            {
                HandleRunningInstance();
            }
        }
 
        private static Process RunningInstance()
        {
            Process current = Process.GetCurrentProcess();
            Process[] processes = Process.GetProcessesByName(current.ProcessName);
            foreach (Process process in processes)
            {
                if (process.Id == current.Id)
                {
                    continue;
                }
 
                // Get first start-up application.
                if (Assembly.GetExecutingAssembly().Location.Replace("/", "\\") == current.MainModule.FileName)
                {
                    return process;
                }
            }
 
            return null;
        }
 
        private static void HandleRunningInstance()
        {
            IntPtr hWnd = NativeMethodsExtensibility.FindWindow(null, "Form1");
            if (hWnd != IntPtr.Zero)
            {
                NativeMethodsExtensibility.ShowWindowAsync(hWnd, NativeMethodsExtensibility.SW_SHOWNORMAL);
                NativeMethodsExtensibility.SetForegroundWindow(hWnd);
            }
            else
            {
 
            }
        }
 
    }
}
File 2: 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
 
namespace XXXSDK
{
    /// <summary>
    /// DllImport Win32API
    /// </summary>
    public static partial class NativeMethodsExtensibility
    {
        #region DllImport
 
        [DllImport("User32.dll", EntryPoint = "SendMessage")]
        internal static extern int SendMessage
        (
        IntPtr hWnd,                   // Get target handle
        int Msg,                       // WM_COPYDATA
        int wParam,                    // Customized data
        ref  COPYDATASTRUCT lParam     // Struct
        );
 
        [DllImport("User32.dll", EntryPoint = "SendMessage")]
        internal static extern int SendMessage(
         int hWnd,                      // Get target handle
         int Msg,                       // WM_COPYDATA
         int wParam,                    // Customized data
         ref COPYDATASTRUCT lParam      // Struct
         );
 
        [DllImport("user32.dll")]
        internal static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);
 
        [DllImport("User32.dll", EntryPoint = "FindWindow")]
        public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
 
        [DllImport("user32.dll", EntryPoint = "SetForegroundWindow")]
        public static extern bool SetForegroundWindow(IntPtr hWnd);
 
        [DllImport("user32.dll", EntryPoint = "ShowWindowAsync")]
        public static extern bool ShowWindowAsync(IntPtr hWnd, int cmdShow);
 
        [DllImport("user32.dll")]
        internal static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
 
        [DllImport("user32.dll")]
        internal static extern bool SetCursorPos(int X, int Y);
 
        [DllImport("user32.dll")]
        internal static extern void mouse_event(int dwFlags, int dx, int dy, int dwData, int dwExtraInfo);
 
        [DllImport("user32.dll")]
        internal static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, uint dwExtraInfo);
 
        [DllImport("user32.dll")]
        internal static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndlnsertAfter, int X, int Y, int cx, int cy, uint Flags);
 
        [DllImport("user32")]
        internal static extern int EnumWindows(CallBack x, int y);
 
        [DllImport("user32.dll")]
        internal static extern int GetWindowTextW(IntPtr hWnd, [MarshalAs(UnmanagedType.LPWStr)]StringBuilder lpString, int nMaxCount);
 
        [DllImport("user32.dll")]
        internal static extern int GetClassNameW(IntPtr hWnd, [MarshalAs(UnmanagedType.LPWStr)]StringBuilder lpString, int nMaxCount);
 
        //ShowWindow参数
        public const int SW_SHOWNORMAL = 1;
        public const int SW_MAXIMIZE = 3;
        public const int SW_RESTORE = 9;
        public const int SW_SHOWNOACTIVATE = 4;
        //SendMessage参数
        public const int WM_KEYDOWN = 0X100;
        public const int WM_KEYUP = 0X101;
        public const int WM_SYSCHAR = 0X106;
        public const int WM_SYSKEYUP = 0X105;
        public const int WM_SYSKEYDOWN = 0X104;
        public const int WM_CHAR = 0X102;
 
        internal delegate bool CallBack(int hwnd, int lParam);
 
        #endregion
 
        #region Native Values
 
        [StructLayout(LayoutKind.Sequential)]
        public struct COPYDATASTRUCT
        {
            public IntPtr dwData;
            public int cbData;
            [MarshalAs(UnmanagedType.LPStr)]
            public string lpData;
        }
 
        public const int WM_COPYDATA = 0x004A;
        #endregion
 
    }
}

---------------------------------------------------------------------------WinformEnd---------------------------------------------------------------------

 
 

---------------------------------------------------------------------------WPFStart-------------------------------------------------------------------------

 
using System;
using System.Diagnostics;
using System.Reflection;
using System.Windows;
using PTMC.SDK;
 
namespace Microsoft.Protocols.TestSuiteStudio
{
    /// <summary>
    /// Interaction logic for App.xaml
    /// </summary>
    public partial class App : System.Windows.Application
    {
        public App()
        {
            bool createNew;
 
            string targetExeName = System.Reflection.Assembly.GetExecutingAssembly().Location;
            string productName = System.IO.Path.GetFileName(System.Reflection.Assembly.GetEntryAssembly().GetName().Name);
 
            using (System.Threading.Mutex mutex = new System.Threading.Mutex(true, productName, out createNew))
            {
                if (createNew)
                {
                    //MainWindow.xaml
                    StartupUri = new System.Uri("MainWindow.xaml", UriKind.Relative);
                    Run();
                }
                else
                {
                    PTMCWin32API.SendMessage(targetExeName, "Protocol Testing Management Console", "/v:true");
                    System.Environment.Exit(1);
                }
            }
        }
         }   
}

---------------------------------------------------------------------------WPFEnd---------------------------------------------------------------------------

以上是关于Winform and WPF 第二遍双击快捷方式或应用程序打开原来的应用程序而不新建一个实例[进程通信 1]的主要内容,如果未能解决你的问题,请参考以下文章

Winform,Wpf快捷键

我在wpf中使用了自定义的控件,请问如何为自定义控件中的一个按钮设置快捷键?

C#如何让listview可编辑 winform

C# winform 程序在后台运行 点击快捷键使程序做出相应反应。

WPF 设置窗体ALT 快捷键

winform、wpf蓝牙扫描的三种方式