none
Process Maximieren RRS feed

  • Frage

  • Hallo

    Ich Überprüfe ob eine Software schon gestartet ist. das habe ich so gelöst.

                Process[] processes = Process.GetProcessesByName("Outlook");
                if (processes.Length == 0)
                {
                    MessageBox.Show("Not running");
                    Process.Start("Outlook");
                }
                else
                {
                    MessageBox.Show("Running");
                }
     

    Nun hätte ich gerne wenn die Software schon gestartet ist das mir die Software im Vordergrund kommt.

    Wie kann man sowas lösen?

    Gruß

    Mezzo

    Mittwoch, 10. August 2022 10:50

Antworten

  • Hast Du ein oder 2 Monitore? Wenn Du 2 hast dann verschiebe Outlook auf den Monitor auf dem weder Visual Studio noch deine App ist. Sonst kann es sein das durch die Aktivitäten wie z.B. ein Breakpoint ein anderes Fenster Focus bekommt.

    Vielleicht liegt es an Win 11. Ich habe hier keine Win 11 und kann es nicht testen


    Gruß Thomas
    Github

    Mittwoch, 10. August 2022 14:18
  • Noch besser ist natürlich so:

    Process[] processes = Process.GetProcessesByName("Outlook");
    if (processes.Any())
    {
        ConsoleApp2.ToFront.BringToFront(processes[0]);
    }

    namespace ConsoleApp2
    {
        internal class ToFront
        {
            [DllImport("USER32.DLL", CharSet = CharSet.Unicode)]
            public static extern IntPtr FindWindow(String lpClassName, String lpWindowName);
    
            [DllImport("USER32.DLL")]
            public static extern bool SetForegroundWindow(IntPtr hWnd);
    
            [DllImport("User32.dll")]
            private static extern bool ShowWindow(IntPtr handle, int nCmdShow);
            [DllImport("User32.dll")]
            private static extern bool IsIconic(IntPtr handle);
    
            public static void BringToFront(System.Diagnostics.Process p)
            {
                // Get a handle to the Calculator application.
                IntPtr handle = p.MainWindowHandle;
    
                // Verify that Calculator is a running process.
                if (handle == IntPtr.Zero)
                {
                    return;
                }
    
                if (IsIconic(handle))
                {
                    ShowWindow(handle, 9);
                }
    
                // Make Calculator the foreground application
                SetForegroundWindow(handle);
            }
        }
    }


    Gruß Thomas
    Github

    Mittwoch, 10. August 2022 14:07
  • Das ist kein großes Problem sondern betrifft nur die Schreibweise die so nur in C# Version 9.0 verfügbar ist.

    Erstelle ein neues Projekt .NET Framework z.B. ein Consolen Projekt

    internal class Program
    {
        [DllImport("USER32.DLL")]
        static extern bool SetForegroundWindow(IntPtr hWnd);
    
        [DllImport("User32.dll")]
        static extern bool ShowWindow(IntPtr handle, int nCmdShow);
        [DllImport("User32.dll")]
        static extern bool IsIconic(IntPtr handle);
    
        static void Main(string[] args)
        {
            Process[] processes = Process.GetProcessesByName("Outlook");
            if (processes.Any())
            {
                IntPtr handle = processes[0].MainWindowHandle;
    
                // Verify that Calculator is a running process.
                if (handle == IntPtr.Zero)
                {
                    return;
                }
    
                if (IsIconic(handle))
                {
                    Console.WriteLine("Process is Iconic");
                    ShowWindow(handle, 9);
                    Console.WriteLine($"Error after ShowWindow {Marshal.GetLastWin32Error()}");
                }
    
                // Make Calculator the foreground application
                SetForegroundWindow(handle);
                Console.WriteLine($"Error after SetForegroundWindow {Marshal.GetLastWin32Error()}");
            }
        }
    }


    Gruß Thomas
    Github

    • Als Antwort markiert Mezzo80 Freitag, 23. September 2022 19:11
    Montag, 12. September 2022 14:53

Alle Antworten

  • Hallo Mezzo,

    das könntest Du versuchen:

    Bring another processes Window to foreground


    Gruß Thomas
    Github

    Mittwoch, 10. August 2022 12:36
  • Danke für deine Antwort

    Ich habe nun das in mein Programm mit eingefügt

            public static void BringProcessToFront(Process process)
            {
                IntPtr handle = process.MainWindowHandle;
                if (IsIconic(handle))
                {
                    ShowWindow(handle, SW_RESTORE);
                }
    
                SetForegroundWindow(handle);
            }
    
            const int SW_RESTORE = 9;
    
            [System.Runtime.InteropServices.DllImport("User32.dll")]
            private static extern bool SetForegroundWindow(IntPtr handle);
            [System.Runtime.InteropServices.DllImport("User32.dll")]
            private static extern bool ShowWindow(IntPtr handle, int nCmdShow);
            [System.Runtime.InteropServices.DllImport("User32.dll")]
            private static extern bool IsIconic(IntPtr handle);


    und dann in mein Funktion

                Process[] processes = Process.GetProcessesByName("Outlook");
                if (processes.Length == 0)
                {
                    MessageBox.Show("Not running");
                    Process.Start("Outlook");
                }
                else
                { 
                    BringProcessToFront("Outlook");
                    MessageBox.Show("Running");
                }

    Aber leider kann ich das so nicht starten, weil bei BringProcessToFront kein string ist. Es wird mit Outlook rot unterstrichen.

    Gruß

    Mezzo

    Mittwoch, 10. August 2022 13:01
  • Wenn Du nur ein String übergeben willst, scroll in dem Link oben weiter runter. Dort ist ein anderes Beispiel.

    Sonst musst Du den Prozess übergeben.

    var p = System.Diagnostics.Process.GetProcessesByName("Outlook");
    if (p.Any())
    {
        BringProcessToFront(p[0]);
    }



    Gruß Thomas
    Github


    Mittwoch, 10. August 2022 13:05
  • Ich finde oben in den Link nur 2 Beispiele und ich hab schon das 2. Beispiel genommen.

    Hab es Probiert wie du es geschrieben hast aber leider bringt er mir die Software nicht im Vordergrund.

    Irgendwas mach ich falsch

    anbei nochmal das komplette

            public static void BringProcessToFront(Process process)
            {
                IntPtr handle = process.MainWindowHandle;
                if (IsIconic(handle))
                {
                    ShowWindow(handle, SW_RESTORE);
                }
    
                SetForegroundWindow(handle);
            }
    
            const int SW_RESTORE = 9;
    
            [System.Runtime.InteropServices.DllImport("User32.dll")]
            private static extern bool SetForegroundWindow(IntPtr handle);
            [System.Runtime.InteropServices.DllImport("User32.dll")]
            private static extern bool ShowWindow(IntPtr handle, int nCmdShow);
            [System.Runtime.InteropServices.DllImport("User32.dll")]
            private static extern bool IsIconic(IntPtr handle);
    
    
           private void toolStripButton1_Click(object sender, EventArgs e)
            {
               
                Process[] processes = Process.GetProcessesByName("Outlook");
                if (processes.Length == 0)
                {
                    Process.Start("Outlook");
                    MessageBox.Show("Not running");
                }
                else
                {
                        BringProcessToFront(processes[0]);
                   
                    MessageBox.Show("running");
                }
            }

    Gruß

    Mezzo


    • Bearbeitet Mezzo80 Mittwoch, 10. August 2022 13:48
    Mittwoch, 10. August 2022 13:40
  • Bei mir klappt das so:

    Process[] processes = Process.GetProcessesByName("Outlook");
    if (processes.Any())
    {
        ConsoleApp2.ToFront.BringToFront(processes[0].MainWindowTitle);
    }

    namespace ConsoleApp2
    {
        internal class ToFront
        {
            [DllImport("USER32.DLL", CharSet = CharSet.Unicode)]
            public static extern IntPtr FindWindow(String lpClassName, String lpWindowName);
    
            [DllImport("USER32.DLL")]
            public static extern bool SetForegroundWindow(IntPtr hWnd);
    
            [DllImport("User32.dll")]
            private static extern bool ShowWindow(IntPtr handle, int nCmdShow);
            [DllImport("User32.dll")]
            private static extern bool IsIconic(IntPtr handle);
    
            public static void BringToFront(string title)
            {
                // Get a handle to the Calculator application.
                IntPtr handle = FindWindow(null, title);
    
                // Verify that Calculator is a running process.
                if (handle == IntPtr.Zero)
                {
                    return;
                }
    
                if (IsIconic(handle))
                {
                    ShowWindow(handle, 9);
                }
    
                // Make Calculator the foreground application
                SetForegroundWindow(handle);
            }
        }
    }


    Gruß Thomas
    Github

    Mittwoch, 10. August 2022 13:56
  • Danke

    Ich hab genau dein Code genommen.

    Aber es bringt mir die Software nicht im Vordergrund.

    Liegt das an Windows 11?

    Gruß

    Mezzo

    Mittwoch, 10. August 2022 14:07
  • Noch besser ist natürlich so:

    Process[] processes = Process.GetProcessesByName("Outlook");
    if (processes.Any())
    {
        ConsoleApp2.ToFront.BringToFront(processes[0]);
    }

    namespace ConsoleApp2
    {
        internal class ToFront
        {
            [DllImport("USER32.DLL", CharSet = CharSet.Unicode)]
            public static extern IntPtr FindWindow(String lpClassName, String lpWindowName);
    
            [DllImport("USER32.DLL")]
            public static extern bool SetForegroundWindow(IntPtr hWnd);
    
            [DllImport("User32.dll")]
            private static extern bool ShowWindow(IntPtr handle, int nCmdShow);
            [DllImport("User32.dll")]
            private static extern bool IsIconic(IntPtr handle);
    
            public static void BringToFront(System.Diagnostics.Process p)
            {
                // Get a handle to the Calculator application.
                IntPtr handle = p.MainWindowHandle;
    
                // Verify that Calculator is a running process.
                if (handle == IntPtr.Zero)
                {
                    return;
                }
    
                if (IsIconic(handle))
                {
                    ShowWindow(handle, 9);
                }
    
                // Make Calculator the foreground application
                SetForegroundWindow(handle);
            }
        }
    }


    Gruß Thomas
    Github

    Mittwoch, 10. August 2022 14:07
  • Funktioniert immer noch nicht. 

    Es will mir einfach die Software nicht im Vordergrund bringen

    Mittwoch, 10. August 2022 14:12
  • Hast Du ein oder 2 Monitore? Wenn Du 2 hast dann verschiebe Outlook auf den Monitor auf dem weder Visual Studio noch deine App ist. Sonst kann es sein das durch die Aktivitäten wie z.B. ein Breakpoint ein anderes Fenster Focus bekommt.

    Vielleicht liegt es an Win 11. Ich habe hier keine Win 11 und kann es nicht testen


    Gruß Thomas
    Github

    Mittwoch, 10. August 2022 14:18
  • Danke es liegt an die 2 Monitore. Jetzt hat es funktioniert.

    Aber wenn ich die Software Minimiere dann kommt es nicht mehr in den Vordergrund.

    Wie kann man es machen das die Software auch im Vordergrund kommt wenn es Minimiert ist.

    Gruß

    Mezzo

    Mittwoch, 10. August 2022 14:24
  • Für das minimierte Fenster ist die Funktion verantwortlich

    if (IsIconic(handle))
    {
        ShowWindow(handle, 9);
    }


    Gruß Thomas
    Github

    Mittwoch, 10. August 2022 14:28
  • ich habe die Liste angeschaut

    https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-showwindow

    Egal ob ich die Nummer, 3,5 oder 9 nehme es ist immer so wenn die Software Minimiert ist dann kommt es nicht in den Vordergrund.

    Gibt es dafür auch eine Lösung?

    Gruß

    Mezzo

    Mittwoch, 10. August 2022 15:31
  • Keine Ahnung warum das bei dir nicht geht. Bei mir funktioniert es wie es soll.

    Ich habe auch keine Infos gefunden das es unter Win 11 anders funktioniert.

    Versuch dir den letzten Fehler geben zu lassen WinApi - GetLastError vs. Marshal.GetLastWin32Error


    Gruß Thomas
    Github

    Mittwoch, 10. August 2022 15:42
  • du meinst es so oder?

    [DllImport("USER32.DLL", CharSet = CharSet.Unicode)]
            public static extern IntPtr FindWindow(String lpClassName, String lpWindowName);
    
            [DllImport("USER32.DLL", SetLastError =true)]
            public static extern bool SetForegroundWindow(IntPtr hWnd);
    
            [DllImport("User32.dll", SetLastError = true)]
            private static extern bool ShowWindow(IntPtr handle, int nCmdShow);
            [DllImport("User32.dll")]

    aber wie kann ich das Marshal.GetLastWin32Error in den MessagerBox anzeigen lassen? da es kein String ist.

    so funktioniert es nicht oder es ist kein Fehler vorhanden da der MessageBox leer ist.

                Console.WriteLine(Marshal.GetLastWin32Error);
                string error01 = Console.ReadLine();
                MessageBox.Show(error01);

    Gruß

    Mezzo


    • Bearbeitet Mezzo80 Mittwoch, 10. August 2022 17:38
    Mittwoch, 10. August 2022 17:37
  • Weißt Du nicht was Breakpoints sind? Damit kannst Du im Programm anhalten und die die Wert anschauen.


    Gruß Thomas
    Github

    Mittwoch, 10. August 2022 20:00

  •             Console.WriteLine(Marshal.GetLastWin32Error);
                string error01 = Console.ReadLine();
                MessageBox.Show(error01);

    Das was Du hier machst kann nicht funktionieren. Mit ReadLine liest man das ein was was nach dem Aufruf eingegeben wurde. Die Eingaben davor spielen keine Rolle.  Die Eingabe dauert zudem solange bis der Benutzer die Entertaste benutzt hat.

    Jedes Objekt in .NET kann man in einen String umwandeln. Dazu muss man die ToString() Methode aufrufen.

    Marshal.GetLastWin32Error() gibt einen Int zurück also eine Zahl. Mit Marshal.GetLastWin32Error().ToSting() eine Zeichenkette


    Gruß Thomas
    Github

    Mittwoch, 10. August 2022 20:12
  • Hallo Mezzo80,

    Ich gehe davon aus, dass Du mit dem Beispielcode und den Hinweisen von Thomas weitergekommen bist. Solltest Du noch Rückfragen haben, gib bitte Bescheid.

    Gruß,
    Dimitar


    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Montag, 29. August 2022 09:37
    Moderator
  • Hallo

    Ich war Geschäftlich viel beschäftigt daher konnte ich nicht Antworten.

    Leider funktioniert das nicht richtig. 

    Wenn eine Software minimiert wird dann kann man es nicht mehr Maximieren.

    Gibt es auch eine andere Lösung?

    Gruß

    Mezzo

    Dienstag, 30. August 2022 12:31
  • Hallo,

    es funktioniert bei dir nicht richtig. Warum das nicht funktioniert muss Du schon selbst rausfinden. Wir haben keinen zugriff auf deinen PC.

    Wenn das Fenster minimiert ist, ist dann auch IsIconic(handle) == true und läuft in den if zweig rein?

    Du muss das Programm debuggen und uns mitteilen welche Fehler entstehen.


    Gruß Thomas
    Github

    Dienstag, 30. August 2022 13:09
  • Ich habe es in mein Code so eingefügt

     if (processes.Any())
                    {
                        ToFront.BringToFront(processes[0]);
    #pragma warning disable CS8974 // Die Methodengruppe wird in einen Nichtdelegattyp konvertiert.
                        Console.WriteLine(Marshal.GetLastWin32Error);
    #pragma warning restore CS8974 // Die Methodengruppe wird in einen Nichtdelegattyp konvertiert.
    #pragma warning disable CS8600 // Das NULL-Literal oder ein möglicher NULL-Wert wird in einen Non-Nullable-Typ konvertiert.
                        string error01 = Console.ReadLine();
    #pragma warning restore CS8600 // Das NULL-Literal oder ein möglicher NULL-Wert wird in einen Non-Nullable-Typ konvertiert.
                        MessageBox.Show(error01);
    
                        // MessageBox.Show("running ");
                    }

    auch wenn ich ein Stop einfüge.

    Ich habe kein Fehler oder eine nachricht das Marshel.GatLastWin32Error ist immer leer

    gruß

    Mezzo

    Dienstag, 30. August 2022 14:24
  • Was soll dein Code bewirken?

    Was versuchst Du mit Console.ReadLine auszulesen?


    Gruß Thomas
    Github

    Dienstag, 30. August 2022 14:29
  • ich will den fehler auslesen der dann entsteht.

    Gruß

    Mezzo

    Dienstag, 30. August 2022 14:33
  • und wieso schreibst Du das nicht in eine Variable?

    var err = Marshel.GatLastWin32Error();

    MessageBox.Show(err.ToString());



    Gruß Thomas
    Github

    Dienstag, 30. August 2022 14:40
  •    internal class ToFront
        {
            [DllImport("USER32.DLL", CharSet = CharSet.Unicode)]
            public static extern IntPtr FindWindow(String lpClassName, String lpWindowName);
    
            [DllImport("USER32.DLL", SetLastError =true)]
            public static extern bool SetForegroundWindow(IntPtr hWnd);
    
            [DllImport("User32.dll", SetLastError = true)]
            private static extern bool ShowWindow(IntPtr handle, int nCmdShow);
            [DllImport("User32.dll")]
            private static extern bool IsIconic(IntPtr handle);
    
            public static void BringToFront(System.Diagnostics.Process p)
            {
                // Get a handle to the Calculator application.
                IntPtr handle = p.MainWindowHandle;
    
                // Verify that Calculator is a running process.
                if (handle == IntPtr.Zero)
                {
                    return;
                }
    
                if (IsIconic(handle))
                {
                    ShowWindow(handle, 1);
                }
                // string error01 = Marshal.GetLastWin32Error();
                // Make Calculator the foreground application
                SetForegroundWindow(handle);
                var err = Marshel.GatLastWin32Error();
                MessageBox.Show(err.ToString());
               // MessageBox.Show(error01);
    
            }
        }

    Jetzt wird mir das Marshel rot unterstrichen und kommt die Meldung das der Name nicht vorhanden ist.

    Gruß

    Mezzo

    Dienstag, 30. August 2022 14:47
  • Mein Fehler es muss Get und nicht Gat heißen

    Marshal.GetLastWin32Error Method


    Gruß Thomas
    Github

    Dienstag, 30. August 2022 14:54
  • Fehlernummer ist 0

    anbei das bild

    Dienstag, 30. August 2022 15:04
  • An dem Punkt des Breakpoints ist die Variable natürlich 0 da die Methode Marshal.GetLastWin32Error noch nicht aufgerufen wurde. Was passiert den wenn Du an dieser Position die Taste F10 drückst?

    Zudem setze mal bitte einen Breakpoint innerhalb des if bei ShowWindow(handle, 1);. Der Wert 1 ist auch hier nicht richtig. Hält das Programm bei ShowWindow(handle, 1); an?


    Gruß Thomas
    Github

    Dienstag, 30. August 2022 21:19
  • Danke für den Tipp

    Ich habe jetzt den Stop bei ShowWindow(handle,1); gemacht und musste feststellen das es gar nicht ausgeführt wird.

                if (IsIconic(handle))
                {
                    ShowWindow(handle, 3);
                }

    Dann habe ich den Stop bei SetForegroundWindow(handle); gemacht. dieser Befehl wird ausgeführt. Wenn das Programm nicht Minimiert ist sondern nur im Hintergrund dann kommt das Programm im Vordergrund aber wenn das Programm Minimiert ist dann nicht.

    Gruß

    Mezzo

     
    Mittwoch, 31. August 2022 07:28
  • Hallo

    Ich habe die IF Schleife rausgemacht und nun wird das ShowWindow auch ausgeführt und ich habe nun eine Fehlermeldung.

    Fehlermeldung ist 1300 wo liegt jetzt das Problem? was muss ich ändern?

    1300 (0x514)
    Not all privileges or groups referenced are assigned to the caller.

    Siehe Bild

    Gruß

    Mezzo



    • Bearbeitet Mezzo80 Mittwoch, 31. August 2022 13:20
    Mittwoch, 31. August 2022 13:11
  • Jetzt bekomme ich die Fehlermeldung Nummer 5

    Mittwoch, 31. August 2022 15:54
  • Ich werde mir am WE einen Win 11 installieren und den Code testen. Melde mich

    Gruß Thomas
    Github

    Donnerstag, 1. September 2022 09:22
  • Super danke
    Donnerstag, 1. September 2022 14:07
  • Auf Win 11 hatte ich auch keine Fehler.

    • Erstelle mal bitte ein Konsolen Projekt .NET 6 und kopiere den Code reich.
    • Minimiere Outlook.
    • Starte das Projekt über das Menu oben Debug -> Starten ohne Debugging oder mit der Tastenkombination Strg+F5
    using System.Diagnostics;
    using System.Runtime.InteropServices;
    
    Process[] processes = Process.GetProcessesByName("Outlook");
    if (processes.Any())
    {
        IntPtr handle = processes[0].MainWindowHandle;
    
        // Verify that Calculator is a running process.
        if (handle == IntPtr.Zero)
        {
            return;
        }
    
        if (IsIconic(handle))
        {
            Console.WriteLine("Process is Iconic");
            ShowWindow(handle, 9);
            Console.WriteLine($"Error after ShowWindow {Marshal.GetLastWin32Error()}");
        }
    
        // Make Calculator the foreground application
        SetForegroundWindow(handle);
        Console.WriteLine($"Error after SetForegroundWindow {Marshal.GetLastWin32Error()}");
    }
    
    [DllImport("USER32.DLL")]
    static extern bool SetForegroundWindow(IntPtr hWnd);
    
    [DllImport("User32.dll")]
    static extern bool ShowWindow(IntPtr handle, int nCmdShow);
    [DllImport("User32.dll")]
    static extern bool IsIconic(IntPtr handle);


    Gruß Thomas
    Github

    Sonntag, 4. September 2022 22:01
  • Hallo

    In der Konsole funktioniert das super.

    Gruß

    Mezzo

    Montag, 5. September 2022 08:44
  • Hallo

    Also in der Konsole funktioniert das super aber wenn ich das in der Click Funktion in Button einfüge dann funktioniert das nicht mehr. nur wenn die Software nicht Minimiert ist.

            private void toolStripButton1_Click(object sender, EventArgs e)
            {
              Process[] processes = Process.GetProcessesByName(Properties.Settings.Default.Button01_SoftwareName);
                if (processes.Any())
                {
                    IntPtr handle = processes[0].MainWindowHandle;
    
                    // Verify that Calculator is a running process.
                    if (handle == IntPtr.Zero)
                    {
                        return;
                    }
    
                    if (IsIconic(handle))
                    {
                     //   Console.WriteLine("Process is Iconic");
                        ShowWindow(handle, 9);
                      //  Console.WriteLine($"Error after ShowWindow {Marshal.GetLastWin32Error()}");
                    }
    
                    // Make Calculator the foreground application
                    SetForegroundWindow(handle);
                  //  Console.WriteLine($"Error after SetForegroundWindow {Marshal.GetLastWin32Error()}");
                }
    
                [DllImport("USER32.DLL")]
                static extern bool SetForegroundWindow(IntPtr hWnd);
    
                [DllImport("User32.dll")]
                static extern bool ShowWindow(IntPtr handle, int nCmdShow);
                [DllImport("User32.dll")]
                static extern bool IsIconic(IntPtr handle);
            }

    Was mach ich da falsch?

    Gruß

    Mezzo

    Montag, 5. September 2022 13:46
  • Bei mir Funktioniert das auch in eine WPF und WinForms Anwendung. Keine Ahnung was Du falsch machst.

    Wenn Du mir die Anwendung zur Verfügung stellst schaue ich sie mir mal an


    Gruß Thomas
    Github

    Montag, 5. September 2022 23:56
  • Hallo

    Ich glaube ich habe das Problem gefunden.

    Das war mein Fehler, Ich habe es nicht mit Outlook oder andere Software getestet sondern nur mit dem CAD Software. 

    Ich habe es nun mit Outlook und PSPad getestet und damit funktioniert das sehr gut.

    Nur mit dem CAD Software funktioniert das nicht richtig, nur wenn die Software in Hintergrund ist und nicht minimiert ist. Sobald die CAD Software minimiert ist lässt sich das nicht mehr öffnen.

    Ich habe erfahren das die CAD Software mit Delphi Red Studio programmiert worden ist. Könnte es daran liegen?

    Mittwoch, 7. September 2022 07:10
  • Mit dem Shell32 kann das nicht gelöst werden?

    Gruß

    Mezzo

    Mittwoch, 7. September 2022 10:29
  • Über CMD/Batch ist mir keine Befehl bekannt. PowerShell nutzt wiederum die user32.dll.


    Gruß Thomas
    Github

    Donnerstag, 8. September 2022 00:20
  • Hallo

    Jetzt habe ich ein großes Problem

    Ich kann nicht in .Net 6.0 die Software erstellen.

    Ich muss das mit .NET Framework 4.5 oder Maximal 4.8 machen.

    Wenn ich auf meiner Maschine die .NET Framework 6.0 installiere kommt es zu Probleme der Steuerung.

    NET Framework 4.5 bis 4.8 ist bereits installiert.

    Wenn ich das [DllImport("USER32.DLL")] bei 4.8 mache kommt die Meldung das es mit C# 7.3 nicht möglich ist. Ich soll die Version 9.0 oder höher benutzen.

    Wie kann ich das lösen? oder gibt da was in NuGet?

    Gruß

    Mezzo

    Montag, 12. September 2022 14:03
  • Das ist kein großes Problem sondern betrifft nur die Schreibweise die so nur in C# Version 9.0 verfügbar ist.

    Erstelle ein neues Projekt .NET Framework z.B. ein Consolen Projekt

    internal class Program
    {
        [DllImport("USER32.DLL")]
        static extern bool SetForegroundWindow(IntPtr hWnd);
    
        [DllImport("User32.dll")]
        static extern bool ShowWindow(IntPtr handle, int nCmdShow);
        [DllImport("User32.dll")]
        static extern bool IsIconic(IntPtr handle);
    
        static void Main(string[] args)
        {
            Process[] processes = Process.GetProcessesByName("Outlook");
            if (processes.Any())
            {
                IntPtr handle = processes[0].MainWindowHandle;
    
                // Verify that Calculator is a running process.
                if (handle == IntPtr.Zero)
                {
                    return;
                }
    
                if (IsIconic(handle))
                {
                    Console.WriteLine("Process is Iconic");
                    ShowWindow(handle, 9);
                    Console.WriteLine($"Error after ShowWindow {Marshal.GetLastWin32Error()}");
                }
    
                // Make Calculator the foreground application
                SetForegroundWindow(handle);
                Console.WriteLine($"Error after SetForegroundWindow {Marshal.GetLastWin32Error()}");
            }
        }
    }


    Gruß Thomas
    Github

    • Als Antwort markiert Mezzo80 Freitag, 23. September 2022 19:11
    Montag, 12. September 2022 14:53