我有一个没有参数或标志的 WPF 应用程序。在App.xaml.cs我添加了一个OnStartUp处理程序,该处理程序尝试对应用程序的另一个实例执行一些 IPC,如果它使用参数执行。例如,我的主应用程序可以通过简单地执行来启动mainApp,这将加载主窗口。然后我可能会稍后执行mainApp msg bob some_message它将传递条件OnStartUp并将“msg bob some_message”发送到启动并运行的应用程序以处理其WndProc覆盖。
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。似乎没有任何效果。
此外,我不仅希望能够指定特定消息,还希望能够指定其他动态详细信息,例如用户名和一些消息文本。