【发布时间】:2013-11-13 20:27:42
【问题描述】:
我有一个没有参数或标志的 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。似乎没有任何效果。
此外,我希望不仅能够指定特定消息,还希望能够指定其他动态详细信息,例如用户名和一些消息文本。
【问题讨论】:
标签: c# .net ipc native wndproc