У меня есть приложение WPF, которое запускается без параметров или флагов. В App.xaml.cs
я добавил обработчик OnStartUp
, который пытается сделать несколько IPC для другого экземпляра приложения, если он выполняется с параметрами. Например, основное приложение можно запустить, просто выполнив mainApp
, который загрузит основные окна. Затем я мог бы позже выполнить mainApp msg bob some_message
, который передал бы условие в OnStartUp
и отправил «msg bob some_message» в запущенное приложение для обработки в своем WndProc
переопределении.Родной SendMessage с переопределением WndProc для IPC не работает
Код в App.xaml.cs:
private void OnStartUp(object sedner, StartupEventArgs e)
{
Process localProcess = Process.GetCurrentProcess();
foreach (Process process in Process.GetProcessesByName(localProcess.ProcessName))
{
if (process.Id != localProcess.Id)
{
NativeMethods.SendMessage(process.MainWindowHandle, NativeMethods.HWND_IPC, IntPtr.Zero, IntPtr.Zero);
Environment.Exit(0);
}
}
}
код в главном окне коде:
public IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr iParam, ref bool handled)
{
if (msg == NativeMethods.HWND_IPC)
{
MessageBox.Show("Message Received!");
}
return IntPtr.Zero;
}
internal class NativeMethods
{
public const int HWND_BROADCAST = 0xffff;
public const int HWND_IPC = 0xfffe;
public static readonly int WM_IPC = RegisterWindowMessage("WM_IPC");
public static readonly int WM_SHOWME = RegisterWindowMessage("WM_SHOWME");
[DllImport("user32")]
public static extern bool PostMessage(IntPtr hwnd, int msg, IntPtr wparam, IntPtr lparam);
[DllImport("user32.dll")]//, CharSet = CharSet.Auto, SetLastError = true)]
public static extern IntPtr SendMessage(IntPtr hwnd, uint Msg, IntPtr wParam, IntPtr lParam);
[DllImport("user32")]
public static extern int RegisterWindowMessage(string message);
}
Я попытался это со многими перестановкой с помощью PostMessage, SendMessage, только с помощью статического Int сообщений, фактически вызывающих RegisterWindowMessage. Ничто не работает.
Кроме того, я хотел бы не просто указать конкретное сообщение, но и дополнительные динамические данные, такие как имя пользователя и текст сообщения.
Возможный дубликат [Как обрабатывать сообщения WndProc в WPF?] (Http://stackoverflow.com/questions/624367/how-to-handle-wndproc-messages-in-wpf) – Stefan