Hallo zusammen,
Mein
M233.Kill();
M233.WaitForExit();
funktioniert nicht, da ich M233 in einem If-Block generiert habe. Es kommt die Meldung:
Der Name M233 ist im aktuellen Kontext nicht vorhanden.
Wie mache ich M233 den außerhalb des If-Blocks bekannt?
Gruß, Wolle
private void tWindowCheck_Tick(object sender, EventArgs e)
{
//enumerate thru Windows collection
Windows wndList = new Windows(InvisibleBox.Checked,NoTitleBox.Checked);
foreach (Window wnd in wndList)
{
if (CutLongString(wnd.Title, 11) == "Futurehouse")
{
Globals.HSGestartet = true;
break;
}
}
if (Globals.HSGestartet == true)
{
if (Globals.M233Gestartet == false)
{
Process M233 = Process.Start(@"C:\Test.exe");
Globals.M233Gestartet = true;
Globals.M233killed = false;
}
}
else
{
if (Globals.M233killed == false)
{
M233.Kill();
M233.WaitForExit();
Globals.M233killed = true;
Globals.M233Gestartet = false;
}
}
Globals.HSGestartet = false;
}
Hallo Ledge,
indem du das Objekt einfach vor dem If-Block erzeugst.
Process M233;
if (Globals.HSGestartet)
{
...
Du solltest dir auch das hier anschauen: [Tipp] Anfängerfehler == true / == false.
Hallo,
genauer gesagt indem Du die Variable M233, die eine Referenz auf ein Objekt der Process-Klasse aufnehmen kannst, vor dem if-Block deklarierst.
Die eigentliche Erzeugung des Objekts findet aber erst mit dem Process.Start-Aufruf statt, der Dir ein entsprechendes Objekt zurückliefert.
Deshalb solltest Du dann wenn Du den Prozess beenden willst, vorher prüfen ob überhaupt ein Prozess erstellt wurde.
Bitte beachte auch [Hinweis] Wie poste ich richtig? Punkt 1.1.1, denn hierbei handelt es sich um elementare Grundlagen, die wir als bekannt voraussetzen.
Gruß, MarsStein
Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca
Danke erstmal für die Hilfe, aber leider klappt es nocht nicht.
Habe folgende Änderung gemacht, aber nun bekomme ich den Fehler:
Verwendung der nicht zugewiesenen lokalen Variable "M233"
Was mach ich falsch?
private void tWindowCheck_Tick(object sender, EventArgs e)
{
//enumerate thru Windows collection
Windows wndList = new Windows(InvisibleBox.Checked,NoTitleBox.Checked);
foreach (Window wnd in wndList)
{
if (CutLongString(wnd.Title, 11) == "Futurehouse")
{
Globals.HSGestartet = true;
break;
}
}
Process M233;
if (Globals.HSGestartet == true)
{
if (Globals.M233Gestartet == false)
{
M233 = Process.Start(@"C:\Test.exe");
Globals.M233Gestartet = true;
Globals.M233killed = false;
}
}
else
{
if (Globals.M233killed == false)
{
M233.Kill();
M233.WaitForExit();
Globals.M233killed = true;
Globals.M233Gestartet = false;
}
}
Globals.HSGestartet = false;
}
Hallo,
Was mach ich falsch? Du initialisierst die Variable nicht:
Process M233 = null;
sollte helfen.
Dann vor der Benutzung beim Kill-Aufruf
if(M233 != null)
nicht vergessen.
Bitte lies Dir den Hinweis aus meinem vorherigen Post durch, und befasse Dich mit den Grundlagen.
Gruß, MarsStein
Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca
Solang M233 lokal deklariert bleibt, wird sie beim M233.Kill() auch nie definiert sein...
Hallo,
@Kileak: auch wieder wahr... hatte gar nicht gesehen daß das scheinbar in einem Timer aufgerufen wird.
@Ledge: Für diesen Fall brauchst Du eine Membervariable (Feld) für den Prozess in der Klasse die die tWindowCheck_Tick-Methode enthält.
Gruß, MarsStein
Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca
Würde sogar behaupten dass das vom Timer unabhängig ist.
Wenn die Variable im if Block deklariert wird und im zugehörigen else Block gekillt wird, davor aber immer wieder mit null initialisiert wird, macht das irgendwie alles nicht wirklich Sinn 🤔
Hallo,
Würde sogar behaupten dass das vom Timer unabhängig ist.
Völlig richtig, das ist natürlich unabhängig vom Timer.
Entscheidend ist lediglich, daß die Methode bei einem Durchlauf nur entweder den Prozess erzeugt oder ihn killt (diesen Umstand hatte ich anfangs übersehen).
Deshalb wird eine Membervariable gebraucht, um in jedem Durchlauf der Methode auf die Variable zuzugreifen -> diese darf dann natürlich nicht innerhalb der Methode mit null initialisiert werden, das darf nur im Konstruktor und nach dem Kill-Aufruf geschehen.
Gruß, MarsStein
Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca
Danke Euch für die Antworten, damit konnte ich mir was basteln.
Mit den Grundlagen werde ich mich in jedem Falle beschäftigen.
Ich habe leider nur im Moment bissle Zeitdruck. Ich muss eine Anwendung die ich vor Jahren in VB 6 erstellt habe in c#.net portieren, vb war kein Prob, aber c# bin ich wie Du gemerkt hast noch ziemlicher Anfänger.
Vielen Dank noch für die schnelle Reaktion, habe mir Die Tips auch schon zu gemüte geführt.
Habe jetzt m233 in Globals mit
public static Process M233 = null;
initialisiert und damit geht es wunderbar.
Und duck ^^ jetzt nicht über mich herfallen 😉, ist bestimmt nicht das gelbe vom Ei aber für den Fall tut es ganau das was ich damit erzielen möchte.
Falls es da eine Möglichkeit gibt wie man das selbe erreicht aber es prinzipiel deutlich besser oder auch stilechter ist bin ich ganz Ohr.
Brauche auch nur Stichwörter, wonach ich Googlen soll.
Grüße und Ihr seid super, Wolle
Hallo Ledge,
Ich habe leider nur im Moment bissle Zeitdruck.
deinen Zeitdruck kannst da aber bitte nicht auf das Forum abwälzen und er ist keine Rechtfertigung für Regelverstöße.
aber c# bin ich wie Du gemerkt hast noch ziemlicher Anfänger.
Um so wichtiger ist es, dass du [Hinweis] Wie poste ich richtig? Punkt 1.1.1 liest und beherzigst.
Siehe auch [Hinweis] Syntaxfehler selbst lösen (Compilerfehlermeldungen).
herbivore