Fenster von anderen Prozess ansprechen



  • Hallo,

    über ein 'Process'- Objekt habe ich Zugriff auf die 'MainWindowHandle' - Property. Wie kann ich damit
    das Fenster ansprechen ? Was ein Fensterhandel ist, ist mir
    klar, aber nicht, wie ich es in C# verwenden kann.

    Gruß und Danke



  • Um das zu konkretisieren:

    Es läuft bereits eine Instanz von Programm X.
    Eine weitere Instanz von Programm X wird gestartet.
    Die neu gestartete Instanz prüft, ob bereits eine Instanz gestartet wurde ( via "Process.GetProcesses()" ). Soweit klappt auch alles.

    Nun soll das Hauptfenster der zuerst gestarteten Instanz in den Vordergrund treten. Wie kann die später gestartete Instanz eine Nachricht an die andere Instanz senden ?.

    Lösungen ala "FileSystemWatcher" und "MessageQueue" möchte ich nicht verwenden.

    Gruß



  • Ich weiss nicht ob das machbar ist aber es gibt doch 'ne WinApi-Funktion namens FindWindow(Ex) ... vielleicht gehts ja?



  • @CengizS

    So eine Funktion scheints unter .Net leider nicht zu geben 😞



  • Okies, hat jetzt geklappt



  • Vielleicht wäre es gut wenn Du hier Deine Lösung posten würdest ... evtl. benötigt diese Information noch eine andere Person?



  • Hier ist meine Lösung (für eine Formularanwendung):

    folgenden Namespace einbinden:
    using System.Runtime.InteropServices;

    Innerhalb der Formularklasse eine Klasse definieren um Win-API-Funktionen
    zu importieren:

    public class WinAPI 
            {
                [DllImport("user32.dll", CharSet=CharSet.Auto)]
                public static extern int 
                    FindWindow( string strClassName, string strWindowName );
    
                [DllImport("user32.dll", CharSet=CharSet.Auto)]
                public static extern int 
                    SetForegroundWindow( int iHwnd );
            }
    

    Die Main-Funktion sollte in etwa so aussehen:

    static void Main() 
            {
                int iHwnd =
                    WinAPI.FindWindow( "EineFensterKlasse", "EinFensterTitel" );
    
                if ( iHwnd != 0 )
                {
                    WinAPI.SetForegroundWindow( iHwnd );
                    Application.Exit();
                    return;
                }
    
                Application.Run( new MyForm() );        
            }
    

    Die Fensterklasse läßt sich z.B. gut über das "Spy"-Tool ermitteln.

    Gruß
    Grunzer


Log in to reply