Ich versuche gerade mit
Das mit der Einzelinstanz funktioniert zwar. Allerdings soll wenn eine 2. Instanz gestartet wird die Erste instanz in
den vordergrund geholt werden.
Ich habe dazu zwei Debuginstanzen gestartet, die erste verhielt sich wie gesollt, die zweite jedoch bleibt bei meiner
Da ich ratlos bin, und nich weis was ich tun soll wende ich mich nun an euch.
Hier ist dann mal der Quellcode der Startroutine:
Und die helferklassen:
Spoiler anzeigen
( Ja mein "Methoden-Beschreibungs-Englisch" ist nicht das beste)
Wäre "voll doll" wenn ihr mir sagen könntet was an diesem Code nicht stimmt.
Grüße,
Luca
Mutext
eine Einzelinstanzanwendung mit C# und WPF zu machen.Das mit der Einzelinstanz funktioniert zwar. Allerdings soll wenn eine 2. Instanz gestartet wird die Erste instanz in
den vordergrund geholt werden.
Ich habe dazu zwei Debuginstanzen gestartet, die erste verhielt sich wie gesollt, die zweite jedoch bleibt bei meiner
Send(String)
-methode in meiner KlassePipeConnection
stecken, der dortige erste Haltepunkt wird erreicht, der zweite aber nicht.Da ich ratlos bin, und nich weis was ich tun soll wende ich mich nun an euch.
Hier ist dann mal der Quellcode der Startroutine:
C#-Quellcode
- MUTEX = new Mutex(true, "PGMA", out bool IsNewInstance);
- if (!IsNewInstance)
- {
- PipeConnection pcon = new PipeConnection();
- if (pcon.Connect())
- {
- pcon.Send("pp:activate"); //Bis hierhin wird in der zweiten instanz ausgeführt.
- }
- else throw new Exception("KANN NICHT VERBINDEN");
- App.Current.Shutdown();
- return;
- }
- if(PipeServer.Start() != true)
- {
- MessageBox.Show("SCHWERWIEGENDER FEHLER!");
- }
Und die helferklassen:
C#-Quellcode
- public class PipeConnection
- {
- protected StreamReader READER { get; set; }
- protected StreamWriter WRITER { get; set; }
- protected NamedPipeClientStream STREAM { get; set; }
- protected bool RUNNING { get; set; } = false;
- public bool Connect()
- {
- try
- {
- NamedPipeClientStream str = new NamedPipeClientStream("PPCP");
- str.Connect(100);
- READER = new StreamReader(str);
- WRITER = new StreamWriter(str);
- return RUNNING = true;
- } catch
- {
- return RUNNING = false;
- }
- }
- public void Disconnect()
- {
- STREAM?.Close();
- STREAM?.Dispose();
- RUNNING = false;
- }
- public void Send(String data)
- {
- Debugger.Break();
- WRITER.WriteLine(data+"\n");
- WRITER.Flush();
- Debugger.Break();
- }
- }
C#-Quellcode
- public static class PipeServer
- {
- /// <summary>
- /// This is the Server itself.
- /// </summary>
- private static NamedPipeServerStream PIPE;
- private static StreamReader READER;
- private static StreamWriter WRITER;
- private static bool CONNECTED = false;
- /// <summary>
- /// Handler for internal commands like pp:version
- /// </summary>
- /// <returns>The answer or null if the command is not an internal one.</returns>
- private static String HandleInternal(String arrivedData)
- {
- switch(arrivedData)
- {
- // Returns the version
- case "pp:version":
- return Assembly.GetExecutingAssembly().GetName().Version.ToString();
- // Returns weather this build targets 'debug' or not.
- case "pp:isDebugBuild":
- #if DEBUG
- return "true";
- #else
- return "false";
- #endif
- //Pushes the window to foreground and returns 'ok'
- case "pp:activate":
- App.Current.MainWindow.Activate();
- return "ok";
- default:
- return null;
- }
- }
- public static bool Start()
- {
- if(!CONNECTED)
- {
- try
- {
- PIPE = new NamedPipeServerStream("PacksPlayCommunicationPipe");
- READER = new StreamReader(PIPE);
- WRITER = new StreamWriter(PIPE);
- CONNECTED = true;
- Task.Factory.StartNew(() =>
- {
- while(CONNECTED)
- {
- String arrived = READER.ReadLine();
- MessageBox.Show("Daten angekommen: " + arrived);
- String answer = null;
- if(arrived.StartsWith("pp:"))
- {
- answer = HandleInternal(arrived);
- }
- if(answer==null)
- {
- DataArrived(new PipeServerDataArrivedEventArgs(arrived, WRITER));
- } else
- {
- WRITER.Write(answer);
- }
- }
- });
- return true;
- } catch
- {
- return false;
- }
- }
- return true;
- }
- public delegate void PipeServerDataArrived(PipeServerDataArrivedEventArgs evtArgs);
- public static event PipeServerDataArrived DataArrived;
- }
- public class PipeServerDataArrivedEventArgs : EventArgs
- {
- public String ArrivedData { get; }
- public StreamWriter AnswerStream { get; }
- public PipeServerDataArrivedEventArgs(String DataArrived, StreamWriter Writer)
- {
- ArrivedData = DataArrived;
- AnswerStream = Writer;
- }
- }
- [/spoiler][spoiler]
( Ja mein "Methoden-Beschreibungs-Englisch" ist nicht das beste)
Wäre "voll doll" wenn ihr mir sagen könntet was an diesem Code nicht stimmt.
Grüße,
Luca
こんにちわ
Achte beim stellen von Fragen auf eine genaue Fragestellung, mir passiert das selbst häufig, andere können dir dann nicht so gut helfen.
Achte beim stellen von Fragen auf eine genaue Fragestellung, mir passiert das selbst häufig, andere können dir dann nicht so gut helfen.