Programm nur einmal öffnen

Hello @ all,
die Überschrift ist nicht ganz passend.
Ich hab mir ein Programm geschrieben das startet wenn ich eine E-Mail bekomme, aber das Problem ist wenn ich mehere E-Mails bekomme, öffnet sich das Programm auch mehr mals. Wie kann ich das Programmieren das das Programm schaut ob es schon geöffnet ist?

Wer an meinen Qellcode interessiert ist:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;

public class E_Mail extends JFrame {
// Anfang Attribute
public static int a=0;
private JButton j = new JButton();
private JLabel bild = new JLabel();
// Ende Attribute
public E_Mail(String title) {
// Frame-Initialisierung
super(„E-Mail“);
setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
int frameWidth = 200;
int frameHeight = 150;
setSize(frameWidth, frameHeight);
Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
int x = (d.width - getSize().width) / 2;
int y = (d.height - getSize().height) / 2;
setLocation(x, y);
Container cp = getContentPane();
cp.setLayout(null);
// Anfangonenten
cp.add(j);

bild.setBounds(10, 10, 173, 103);
bild.setIcon(new ImageIcon(this.getClass().getResource(„brief.png“)));
bild.addMouseListener( new MouseAdapter() {
@Override public void mouseClicked( MouseEvent e ) {
if ( e.getClickCount() == 1 ){
System.exit(0);
}
}
} );
cp.add(bild);

// Ende Komponenten
addWindowListener(new WindowAdapter(){
public void windowIconified(WindowEvent e){
setExtendedState(NORMAL);
}
});
setResizable(false);
setVisible(true);
setAlwaysOnTop(true);
}
public static void main(String[] args) {
new E_Mail(„E_Mail“);
}
}

LG Dennis

Du musst die Prozesse auslesen und dort dann nach deinem Progg suchen.

Wenn der Prozess z.B. Mail_Proggi genannt wird musst du folgendes einsetzen:

Runtime.getRuntime().exec("Pfad\\zur\\Taskliste.exe\\ \> Prozessdatei.txt");

Taskliste.exe > Prozessdatei.txt erzeugt eine txt mit allen Laufenden Prozessen.

In dieser txt kannst du zeilenweise nach deinem Prozess suchen. Ist er nicht aufgelistet, darf das Programm starten. Wenn nicht System.exit(0) oder so.

Musste noch nen wenig dran feilen aber der Grundstein sollte gelegt sein.

LG

Ich sollte vilt. noch erwähnen das dies nur unter Windows so geht. Ansonsten musst du unter Linux den top befehl nutzen.

Wie das geht kannste ja googlen.

LG

Ja, danke für die schnell antwort,
nutze Windows und diese Programm wird auch nur auf meinem Rechner laufen. Wie kann ich heraus finden wie der Prozess genant wird? Und was ist der Pfad zur Taskliste? Benutze Windows 7 und habe so etwas noch nie gehört. Wo muss ich das den in den Quellcode packen?
LG Dennis

Hi, C:\Windows\System32\tasklist.exe meinst du dies?
Eine Batch mit folgendem Inhalt:
echo.%date%.>>.prozessliste.txt
echo.%time%.>>.prozessliste.txt
tasklist.exe>>.prozessliste.txt
echo.-----.>>.prozessliste.txt
erzeugt z.B. eine Prozessliste! Der Prozess ist eig. javaw.exe
Könnte ich es auch so machen das wenn das Programm startet eine Batch startet die javaw.exe Prozess killt? Weil mit suchen und so ist’s ziemlich kompliziert
LG Dennis

Versuch es, scheint mir aber der Unsichere/Kompliziertere weg zu sein. Nen FileReader zu schreiben dauert doch keine 10min ^^

Und ja, ich meinte es so wie du es aufgefasst hast :wink:

Erst Filereader, dann checken ob dar Prozess gestartet ist und wenn ja töten. Wenn nein dann weiter ausführen. Kurz gesagt, den ganzen Quatsch ganz am anfang.

Hi danke für die Hilfe:smiley:
hab aber keine Ahnung wie ich einen Feilreader mache? Ich hab taskkill inerhalb von 1 sek geschrieben nur beim ausführen haberts. An welche stelle muss ich den
Runtime.getRuntime().exec(„kill.bat“);
setzen?
Lg denni

Hi Denni,

ich würde es ganz anders als dir hier bereits geraten wurde

Wenn deine APP startet, erstellt sie eine Datei, die einen freien Port enthält. Auf diesen Port (begrenzt auf 127.0.0.1) verbindet sich die App. Dann macht sie, was sie will. Ist diese Datei schon vorhanden, weiss die App, dass sie bereits vorher gestartet wurde. Sie kann dann den Port auslesen und prüfen, ob die App wirklich noch läuft (oder vielleicht abgestürzt ist). Je nach dem, was du möchtest, hast du dann mehrere Möglichkeiten:

  1. Die neu gestartete App beendet sich und die vorher gestartete läuft weiter.
  2. Warten, bis der Port frei wird, dann ist die vorher gestartete App fertig.
  3. Der vorher gestarteten App auf diesem Port den Befehl zum Beenden senden. Diese sollte natürlich darauf hören.

Alles andere mit „tasklist.exe“ etc. ist in meinen Augen nur „gefrickel“. Was, wenn Microsoft in einem Update die Syntax ändert oder das Format der Ausgabe? Was, wenn du die App unter einem anderen OS einsetzen möchtest? Mit obiger Variante bist du nicht von anderen Anwendungen abhängig und sie ist auch vom Betriebssystem unabhängig.

Gruss
McPringle

Hi,

Wenn deine APP startet, erstellt sie eine Datei, die einen
freien Port enthält.

Ich habe eig. ein JFrame erstellt ich möchte ja nicht das der Browser sich öffnet!:smiley:

Auf diesen Port (begrenzt auf 127.0.0.1)
verbindet sich die App. Dann macht sie, was sie will. Ist
diese Datei schon vorhanden, weiss die App, dass sie bereits
vorher gestartet wurde. Sie kann dann den Port auslesen und
prüfen, ob die App wirklich noch läuft (oder vielleicht
abgestürzt ist). Je nach dem, was du möchtest, hast du dann
mehrere Möglichkeiten:

  1. Die neu gestartete App beendet sich und die vorher
    gestartete läuft weiter.

Das wäre die beste Variante.

  1. Warten, bis der Port frei wird, dann ist die vorher
    gestartete App fertig.
  2. Der vorher gestarteten App auf diesem Port den Befehl zum
    Beenden senden. Diese sollte natürlich darauf hören.

Alles andere mit „tasklist.exe“ etc. ist in meinen Augen nur
„gefrickel“. Was, wenn Microsoft in einem Update die Syntax
ändert oder das Format der Ausgabe? Was, wenn du die App unter
einem anderen OS einsetzen möchtest? Mit obiger Variante bist
du nicht von anderen Anwendungen abhängig und sie ist auch vom
Betriebssystem unabhängig.

Ich möchte wie du sicher schon gelesen hast, mein Java Programm nur auf meinem Windows benutzen und wenn die Syntax verändert wird änder ich meine kill.bat auch. Es gibt nur ein Problem das Programm startet und beim starten wird auch gleichzeitig der eigene Prozess gekillt:smiley:
Das heist es ist nur 1sek offen. Die Variante mit dem durchsuchen kann ich von alleine nicht umsetzen.
Naja wir werden ne lösung finden. App und JFrame sind ja ziemlich ähnlich.

Lg Dennis

Das muss aufgerufen werden wenn dein Check der Prozessliste Positiv verläuft.

ProzzesIstGestartet == true --> killbat

ProzzesIstGestartet == false --> Weiter ausführen

Beispiele für einen FileReader findest du zuhauf im Internet.

LG

Ich hab ne idee, ich starte einfach nicht mein Java Programm sondern eine Batch die erst den Prozess killt und dann mein Programm startet :smiley:
Lg Dennis

is ne idee aber so lernst du ja nix xD