YoghurtMedlem sedan dec. 200512 inlägg Hej,
Har lite problem med en funktion i ett program som jag i dagsläget håller på att programmera i VB.NET..
Vad jag vill åstadkomma är att man genom att kunna klicka på en länk på vår hemsida (T.ex program1:order:20383) så ska vårt program startas och öppna en order med nummer 20383 helt enkelt. Hit är det inga problem.
Det blir dock problem om programmet redan är startat och kunden klickar på länken för då öppnas programmet på nytt vilket inte är något vidare om man ska använda funktionen 50-80 gånger per dag..
Som jag har försökt med nu så låter jag programmet starta en extra instans, men jag har även en funktion som kontrollerar om programmet redan är öppnat.
Om det redan är öppnad så stängs det nuvarande programmet.
Men så som jag vill att det ska fungera så ska programmet dels trigga en funktion i den första instansen som ska användas och även sätta fokus på fönstret.
Har ni några förslag på hur detta kan lösas?
Känns som att jag har försökt med allting i princip men jag lyckas helt enkelt inte, även med en massa hjälp av Google.
GladhMedlem sedan maj 20012 812 inlägg
yoghurt skrev:
Men så som jag vill att det ska fungera så ska programmet dels trigga en funktion i den första instansen som ska användas och även sätta fokus på fönstret.
Har du inte möjligheten i System.Diagnostik att få en referens till en redan befintlig instans. För om du kan få det så borde det ju inte vara så svårt att lösa.
En betydligt mer komplex väg är att använda sig av Remoting/WCF för att anropa den befintliga instansen, men det känns lite som overkill, även om det är fullt möjligt att göra det du vill med en sådan lösning.
- M
YoghurtMedlem sedan dec. 200512 inlägg
Gladh skrev:
yoghurt skrev:
Men så som jag vill att det ska fungera så ska programmet dels trigga en funktion i den första instansen som ska användas och även sätta fokus på fönstret.
Har du inte möjligheten i System.Diagnostik att få en referens till en redan befintlig instans. För om du kan få det så borde det ju inte vara så svårt att lösa.
En betydligt mer komplex väg är att använda sig av Remoting/WCF för att anropa den befintliga instansen, men det känns lite som overkill, även om det är fullt möjligt att göra det du vill med en sådan lösning.
- M
Tyvärr verkar det inte gå med System.Diagnostik (Har iaf inte hittat någon information om någon sådan funktion) och Remoting känns som sagt lite overkill.
Har dock lyckat köra med en "fullösning" genom att den andra instansen av programmet skapar en textfil med ordernumret i programmappen som jag sedan övervakar med FileSystemWatcher. När textfilen ändras så öppnar programmet ordersidan och sätter fokus.
Engine^Medlem sedan dec. 20003 887 inlägg Jag funderar på om kanske denna tråd kan hjälpa dig...
http://dotnetperls.com/Content/Single-Instance-Windows-Form.aspx
Känns som att det är mer "rätt" väg att gå.
Yoghurt skrev:
Tyvärr verkar det inte gå med System.Diagnostik (Har iaf inte hittat någon information om någon sådan funktion) och Remoting känns som sagt lite overkill.
Har dock lyckat köra med en "fullösning" genom att den andra instansen av programmet skapar en textfil med ordernumret i programmappen som jag sedan övervakar med FileSystemWatcher. När textfilen ändras så öppnar programmet ordersidan och sätter fokus.
Tänk på att alla användare inte har skrivrättigheter i programmappen.
YoghurtMedlem sedan dec. 200512 inlägg
Engine^ skrev:
Jag funderar på om kanske denna tråd kan hjälpa dig...
http://dotnetperls.com/Content/Single-Instance-Windows-Form.aspx
Känns som att det är mer "rätt" väg att gå.
Tyvärr så verkar det inte att gå att köra en viss function eller sub genom den metoden, vilket krävs för min applikation.
Nickemannen skrev:
Tänk på att alla användare inte har skrivrättigheter i programmappen.
Blir troligtvis så att textfilen placeras i Mina Dokument för användaren som är inloggad. Detta borde fungera?
Yoghurt skrev:
Tyvärr så verkar det inte att gå att köra en viss function eller sub genom den metoden, vilket krävs för min applikation.
Blir troligtvis så att textfilen placeras i Mina Dokument för användaren som är inloggad. Detta borde fungera?
Alltså jag tycker det du gör är ett riktigt fulhack, jag hade röstat för Remoting alla gånger.
Vad händer om ditt program kraschar under just detta förfarandet då kommer dina program få felaktig information.
YoghurtMedlem sedan dec. 200512 inlägg Har nu kommit på en lösning på detta problem som kräver några få rader kod bara.
Det fungerar dock bara i VB.NET.
1. Gå in till inställningarna för projektet och klicka i rutan "Make singel instance application".
2. Lägg till denna kod i ApplicationEvent.vb, ändra dock "Login" på alla ställen till den Form som är din Mainform.
Private Sub MyApplication_StartupNextInstance(ByVal sender As Object, ByVal e As Microsoft.VisualBasic.ApplicationServices.StartupNextInstanceEventArgs) Handles Me.StartupNextInstance
If TypeOf Me.MainForm Is Login Then
DirectCast(Me.MainForm, Login).InstanceActivate(e)
End If
End Sub
3. Lägg in denna kod i din MainForm. Det är denna Sub som körs varje gång användaren försöker köra en extra kopia av ditt program.
Friend Sub InstanceActivate(ByVal e As Microsoft.VisualBasic.ApplicationServices.StartupNextInstanceEventArgs)
Dim strArgs = ""
If e.CommandLine.Count > 0 Then
For Each arg As String In e.CommandLine
strArgs = strArgs & arg
Next
End If
End Sub
Har du skickat med något argument när du startade den andra instansen så hamnar dom i variablen strArgs.