Envoyer un message à un processus de Windows (et pas de ses de la fenêtre principale)

J'ai une application sur un début détecte si il y a un processus avec le même nom existe déjà en cours d'exécution et, le cas échéant, active l'application en cours d'exécution de la fenêtre, puis se ferme.

Le problème est que la fenêtre principale peut être cachée (seulement une icône de zone de notification visible), donc me laissant sans la poignée de la fenêtre.

Au démarrage, l'instance précédente de MainWindowHandle propriété est 0, donc je ne peux pas envoyer ShowWindow ou PostMessage.

Est il possible que je peux envoyer un message qui peut être intercepté par l'application en cours d'exécution, ce qui lui permet d'afficher sa fenêtre principale?

L'application est écrite en C#, le code que j'utilise pour réaliser ce ci-dessous.

[STAThread]
static void Main()
{
    bool createdNew = true;
    using (Mutex mutex = new Mutex(true, "MyMutexName", out createdNew))
    {
        if (createdNew)
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new MainForm());
        }
        else
        {
            Process current = Process.GetCurrentProcess();
            foreach (Process process in Process.GetProcessesByName(current.ProcessName))
            {
                if (process.Id != current.Id)
                {
                    Interop.WINDOWINFO pwi = new Interop.WINDOWINFO();
                    IntPtr handle = process.MainWindowHandle;
                    var isVisible = Interop.GetWindowInfo(handle, ref pwi);
                    if (!isVisible)
                    {
                        MessageBox.Show(Constants.APP_NAME + " is already running, check the notification area (near the clock).", 
                                        Constants.APP_NAME, MessageBoxButtons.OK, MessageBoxIcon.Information);//temporary message, until I find the solution
                        //Interop.ShowWindow(handle, Interop.WindowShowStyle.ShowNormal);
                        //Interop.PostMessage(handle, Interop.WM_CUSTOM_ACTIVATEAPP, IntPtr.Zero, IntPtr.Zero);
                    }
                    else
                        Interop.SetForegroundWindow(handle);//this works when the window is visible
                        break;
                    }
                }
            }
        }
    }
}

OriginalL'auteur chitza | 2009-11-22