Laden...

Anderen Process maximieren / Wiederherstellen / in der Vordergrund bringen

Erstellt von LosWochos vor 18 Jahren Letzter Beitrag vor 18 Jahren 10.860 Views
L
LosWochos Themenstarter:in
14 Beiträge seit 2005
vor 18 Jahren
Anderen Process maximieren / Wiederherstellen / in der Vordergrund bringen

Moin,

Ich suche eine Möglichkeit einen anderen Prozess von meinem Programm aus zu Maximieren (Restoren, in den Vordergrund bringen).

Ganz konkret handelt es sich dabei um einen weitren Prozess meines eigenen Programmes. Momentan checke ich nur Ob es schon läuft mittels

System.Diagnostics.Process.GetProcessesByName(System.Diagnostics.Process.GetCurrentProcess().ProcessName).Length > 1)
{
}

Und gebe dann eine Meldung aus "Das Programm läuft schon". Was ich aber eigentlich lieber hätte ist die Möglichkeit den anderen Prozess statt dessen an zu zeigen. Nach dem Motto:

System.Diagnostics.Process.GetProcessesByName(System.Diagnostics.Process.GetCurrentProcess().ProcessName).Length > 1)
{
   System.Diagnostics.Process.GetProcessesByName(System.Diagnostics.Process.GetCurrentProcess().ProcessName)[0].SHOW();
}

So rein prinzipiell. Beenden klappt so ja auch, über CloseMainWindow(), nur für Show gibt es natürlich nix.

Gruß,
Florian

X
2.051 Beiträge seit 2004
vor 18 Jahren

als idee:


Form.FromHandle(
   Process.GetProcessesByName(Process.GetCurrentProcess().ProcessName).MainWindowHandle).Show();

bzw .BringtToFront()

nicht getestet

6.862 Beiträge seit 2003
vor 18 Jahren

Soll der Sinn sein das du nur eine Instanz deines Programms erlauben möchtest? Da gibts andere Möglichkeiten wie ein benanntes Mutex zum Beispiel.

Baka wa shinanakya naoranai.

Mein XING Profil.

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo talla,

nicht nur andere, sondern bessere. Die Mutex-Lösung ist nicht nur anders, sondern besser.

Hallo LosWochos,

siehe Programm on Top , wobei die entscheidende Frage dort leider auch nicht gelöst ist.

herbivore

L
LosWochos Themenstarter:in
14 Beiträge seit 2005
vor 18 Jahren

Moin,

@Xqgene:
Danke für den Code. Klappt leider nicht, beim Aufruf von Start() gibts eine Exception weil nicht auf eine Objektinstanz verwiesen wurde. Man kann wohl nicht einfach eine Form aus einem "programm-fremden" WindowHandle casten.

@herbivore:
Vielen Dank für den Verweis, der Code dort sieht recht interessant aus, dass muss ich mir mal ein einer ruhigen Minute genauer zu Gemüte führen.
Interessant wird, wie Terminal Server tauglich die Sache ist. Ich kenne Mutex-Funktionen in C# noch nicht, weiß aber aus Delphi das man da mit Mutexen auf Terminal Servern manchmal "lustige" Effekte gehabt.

Derzeit habe ich auf Terminal-Servern einfach den "Vorteil" dass der Code schlichtweg wegen fehlender Permissions nicht läuft und somit der Anwender einfach das Programm hat ein zweites mal starten kann.

Gruß,
Florian

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo LosWochos,

wenn du einen WindowHandle hast, kannst du aber die Win32-Funktionen benutzen. Da müsste es auch was geben, um das Fenster anzuzeigen.

herbivore

I
1.739 Beiträge seit 2005
vor 18 Jahren

Geht ungefähr so(ungetestet):



    [DllImport("user32", SetLastError = true)]
    private static extern int SetForegroundWindow(IntPtr hwnd);
    
    [DllImport("user32", SetLastError = true)]
    private static extern int IsIconic(IntPtr hwnd);
      
    [DllImport("user32", SetLastError = true)]
    private static extern int OpenIcon(IntPtr hwnd);
    
    public static void ActivateApp(Process p)
    {
      if((int)p.MainWindowHandle != 0)
      {
        if(OpenIcon(p.MainWindowHandle) == 0)
          throw new Exception("Problem with recover minimized MainWindow");
        if(SetForegroundWindow(p.MainWindowHandle) == 0)
          throw new Exception("Problem with bring to front the MainWindow");
      }
      else
        throw new Exception("Process without MainWindow");
    }