Nachricht senden an ein Windows-Prozess (nicht das Hauptfenster)

Ich habe eine Anwendung, die auf einen weiteren start erkennt, ob ein Prozess mit demselben Namen bereits läuft und wenn ja, aktiviert das ausgeführte Programm-Fenster und dann beendet.

Das problem ist, dass das main-Fenster kann ausgeblendet werden (nur ein Infobereich-Symbol sichtbar), damit mir kein Fenster-handle.

Start der vorherigen Instanz MainWindowHandle Eigenschaft 0 ist, so kann ich nicht senden ShowWindow oder PostMessage.

Gibt es eine Möglichkeit, ich kann senden Sie eine Nachricht abgefangen werden können, die durch das ausgeführte Programm, so dass es für die Anzeige des Hauptfensters?

Die Anwendung ist in C# geschrieben, der code, den ich verwende um dies zu erreichen unten.

[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;
                    }
                }
            }
        }
    }
}
InformationsquelleAutor chitza | 2009-11-22
Schreibe einen Kommentar