Benutzer mit den meisten Antworten
Frage ... Einzelinstanz Anwendung mit Parameterübergabe

Frage
-
Ich habe eine Anwendung die als Einzelinstanze definiert ist. Ich habe die beiden Ereignisse "Startup" und "StartupNextInstance" definiert und mein Code eingefügt. Wenn ich meine Anwendung über einen Doppelklick auf die "exe" starte funktioniert alles problemlos. Nun ist es aber so das meine App normalerweise von einer anderen Anwendug aus aufgerufen wird. Diese andere Anwendung scheint aber nicht die "exe" nochmal aufzurufen, sondern scheint die laufenden Prozesse des Rechners zu durchsuchen und dann wenn mein App gefunden wurde, diese in den Vordergrund zu holen. Dabei sieht es so aus als ob das Ereignis "StartupNextInstance" ausgehebelt wurde, da es nicht zum tragen kommt und ich nicht mitbekomme welche neuen Komandozeilen-Paramter mir übergeben wurden.
Getestet habe ich das dahingehen, wenn ich dem anderen Programm den Vewrzeichnispfad + Dateiname der "exe" einstelle wird meine App nur in den Vordergrund geholt. Wenn ich dem Anderen Programm eine "cmd"-Datei angeben in der meine App gestartet wird dann wird das Ereignis "StartupNextInstance" ausgeführt.
Hat da jemand eine Idee wie ich das doch irgendwie herausbekomme wann meine App ein zweites mal aufgerufen wurde? Ein Ereignis wie "ChangeCommandLineParameters"
Gruß Thomas
Antworten
-
Hallo Thomas,
WM_COPYDATA ist eine Fire and Forget Meldung, da kommt nichts weiter.
Willst Du einen bidirektionalen Verkehr (vermutlich nicht),
so müsstest Du ein WM_COPYDATA zurückschicken.Gruß Elmar
- Als Antwort markiert tommytom73 Dienstag, 19. Juli 2011 05:11
-
Hallo Thomas,
schau Dir den Code an
How to migrate SendMessage with WM_COPYDATA to .Net Framework
der sieht stabiler aus (wenn auch nicht getestet).
Zurückgeben sollte die empfangende Anwendung 1 (TRUE), wenn sie was damit anfangen kann,
sonst 0 (FALSE), siehe WM_COPYDATAGruß Elmar
- Als Antwort markiert Thorsten DörflerModerator Dienstag, 19. Juli 2011 05:16
Alle Antworten
-
Hallo Thomas,
laut Deiner Beschreibung, solltest Du diese Frage dann eher an den Entwickler oder die Dokumentation des anderen Programms richten und ihn fragen, wie Deine Anwendung aufgerufen wird. Denkbar wären da einige Varianten.
Thorsten Dörfler
Microsoft MVP Visual Basic
vb-faq.de -
Hallo Thorsten
Gibt es eine Möglichkeit sowas in meinem Programm zu erkennen und gegebenfalls darauf reagieren? Ich werde sie mal fragen welche methode sie benutzen, ob sie das in absehbarer Zeit ändern können kann ich mir aber nicht denken.
Gruß Thomas
-
Hallo Thomas,
Du könntest beispielsweise mit dem Tool Spy++ schauen, ob irgendwelche Nachrichten an Dein Hauptfenster gesendet werden. WM_COPYDATA wird hierfür gerne verwendet. Aber dass dies einfach auf Verdacht geschieht, halte ich für unwahrscheinlich. DDE Kommandos wären ebenso eine Variante, die in Frage käme. Aber da gilt eigentlich das gleiche, man muss ja von einer Technik ausgehen, die von jeder Anwendung auch umgesetzt wird.
Ist es denn eine Standardsoftware oder eine spezielle Lösung?
Thorsten Dörfler
Microsoft MVP Visual Basic
vb-faq.de -
Hallo Thorsten
Mit Spy++ habe ich schon geschaut, DDE Message werden nicht gesendet, Das einzige was ich gesehen habe ist das die Message "WM_ACTIVATEAPP" gesendet wird, aber ich kann anhand der Nachricht nicht lokalisieren ob die Nachricht von einem Fremdprogramm kommt oder es von meiner App aus gesendet wird, da hWnd immer meiner eigenen App zugeordnet ist.
Ich habe mein Programm eine "Sub Main" spendiert, in welcher ich die Prozesse durchlaufe und wenn der Prozess da ist hole ich ihn in den Vordergrund. Und jetzt probiere ich gerade aus mit der SendMessage dem Aktiven Form eine Nachricht zu schicken aber da bin ich mir noch unschlüssig welche Nachricht dafür am besten geeignet ist. Getestet habe ich hierfür erstmal die "WM_SETTEXT" Nachricht an das MDI-Form und der Text ändert sich auch, aber der Weg wäre nicht optimal. Ich bräuchte eine eindeutige Meldung die ich mit "WinProc" abfangen kann die keine Seiteneffekte beinhaltet, die eine .NET-Form normaler Weise ignoriert oder nicht behandelt. da ich ja irgendwie die CommadLine Parameter von der 2.ten Instanz an die 1.te Instanz schicken muss. Ich schaue mir mal "WM_COPYDATA" an was die so macht.
Gruß Thomas
PS. Die Entwickler des anderen Programms sind im moment im Sommerurlaub deswegen konnte mir keiner sagen wie die den Aufruf gestallten.
-
Hallo Thorsten
Ich habe jetzt die "WM_COPYDATA" Struktur eingebaut, wenn jemand mal über die "WndProc" Methode drüber schaut ob die soweit okay ist oder ob ich da noch irgend etwas ändern sollte, den bei PInvoke schaue ich gerne zweimal drüber bevor ich dies so einsetze.
Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message) '// Dim tmpBolMessage As Boolean = False Dim tmpCopyData As Extras.WinAPI.COPYDATASTRUCT = Nothing Dim tmpStr As String = String.Empty '// If m.Msg = Extras.WinAPI.Konstanten.WM_COPYDATA Then tmpCopyData = DirectCast(m.GetLParam(GetType(Extras.WinAPI.COPYDATASTRUCT)), Extras.WinAPI.COPYDATASTRUCT) Dim tmpByteArr(tmpCopyData.cdData -1) As Byte System.Runtime.InteropServices.Marshal.Copy(tmpCopyData.lpData, tmpByteArr, 0, tmpCopyData.cdData) tmpStr = System.Text.Encoding.Unicode.GetString(tmpByteArr) tmpBolMessage = True End If '// MyBase.WndProc(m) '// If tmpBolMessage = True then RaiseEvent NewInstanceMessage(Me, New EventArgs) tmpBolMessage = False End If '// End Sub
Sollte mann die gefilterte Nachricht an die Basis weiterleiten oder sollte man die gefilterte Nachricht wegschmeißen?
Gruß Thomas
-
Hallo Thomas,
schau Dir den Code an
How to migrate SendMessage with WM_COPYDATA to .Net Framework
der sieht stabiler aus (wenn auch nicht getestet).
Zurückgeben sollte die empfangende Anwendung 1 (TRUE), wenn sie was damit anfangen kann,
sonst 0 (FALSE), siehe WM_COPYDATAGruß Elmar
- Als Antwort markiert Thorsten DörflerModerator Dienstag, 19. Juli 2011 05:16
-
Hallo Elmar
Ich habe die Nachricht "WM_COPYDATA" in der "WndProc" gefiltert und meine Informationen die ich brauche sind jetzt da.
Ich übergebe die Orginale Nachricht einfach der "WndProc"
MyBase.WndProc(m)
Muss ich der anderen Instanz die mir die Nachricht geschickt hat irgendwas zurücksenden, eigentlich nicht oder ? Das die Nachricht empfangen wurde müsste Windows doch für mich erledigen.Gruß Thomas
-
Hallo Thomas,
WM_COPYDATA ist eine Fire and Forget Meldung, da kommt nichts weiter.
Willst Du einen bidirektionalen Verkehr (vermutlich nicht),
so müsstest Du ein WM_COPYDATA zurückschicken.Gruß Elmar
- Als Antwort markiert tommytom73 Dienstag, 19. Juli 2011 05:11