MSDN.WhiteKnight - Stack Overflow answers
Ответ на "Передача сигнала запущенному приложению при старте нового экземпляра"
Answer 936446
Можно использовать сообщение WM_COPYDATA:
using System; using System.Collections.Generic; using System.Text; using System.Linq; using System.Windows; using System.Windows.Controls; using System.Runtime.InteropServices; using System.Windows.Interop; namespace WpfApplication { public partial class MainWindow : Window { [DllImport("user32.dll")] public static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, ref COPYDATASTRUCT lParam); [StructLayout(LayoutKind.Sequential)] public struct COPYDATASTRUCT { public IntPtr dwData; public int cbData; public IntPtr lpData; } const uint WM_COPYDATA = 0x004A; //обработчик сообщений для окна private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled) { if (msg == WM_COPYDATA) { COPYDATASTRUCT data = new COPYDATASTRUCT(); data = (COPYDATASTRUCT)Marshal.PtrToStructure(lParam, data.GetType()); MessageBox.Show("Received command: "+Marshal.PtrToStringUni(data.lpData)); } return IntPtr.Zero; } public MainWindow() { InitializeComponent(); Process this_process = Process.GetCurrentProcess(); //найти все процессы с таким же именем Process[] other_processes = Process.GetProcessesByName(this_process.ProcessName).Where(pr => pr.Id != this_process.Id).ToArray(); foreach (var pr in other_processes) { pr.WaitForInputIdle(1000); //на случай, если процесс еще не загрузился //берем первый процесс с окном IntPtr hWnd = pr.MainWindowHandle; if (hWnd == IntPtr.Zero) continue; //отправляем команду string command = "Hello"; var cds = new COPYDATASTRUCT(); cds.dwData = (IntPtr)1; cds.cbData = (command.Length + 1) * 2; cds.lpData = Marshal.StringToHGlobalUni(command); SendMessage(hWnd, WM_COPYDATA, IntPtr.Zero, ref cds); Marshal.FreeHGlobal(cds.lpData); //завершаем работу Environment.Exit(0); } //если ничего не найдено, продолжаем работу } private void Window_Loaded(object sender, RoutedEventArgs e) { WindowInteropHelper h = new WindowInteropHelper(this); HwndSource source = HwndSource.FromHwnd(h.Handle); source.AddHook(new HwndSourceHook(WndProc));//регистрируем обработчик сообщений } } }
Content is retrieved from StackExchange API.
Auto-generated by ruso-archive tools.