我有一个没有参数或标志的 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。似乎没有任何效果。
此外,我不仅希望能够指定特定消息,还希望能够指定其他动态详细信息,例如用户名和一些消息文本。