StartupNextInstance aus ApplicationEvents (Anwendungsereignisse) ohne Namespace "Microsoft.VisualBasic" möglich?

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    StartupNextInstance aus ApplicationEvents (Anwendungsereignisse) ohne Namespace "Microsoft.VisualBasic" möglich?

    Ich habe in den Projekteinstellungen auf "Anwendungsereignisse" geklickt und in der erzeugten Datei "ApplicationEvents.vb" das Ereignis "MyApplication_StartupNextInstance" erstellt.

    Mein Ziel ist es, bei meiner Einzelinstanzanwendung bei einem erneuten Start den alten Prozess zu aktivieren (in den Vordergrund zu holen).

    Nun hat das genannte Ereignis allerdings den Parameter "e" vom Typ "StartupNextInstanceEventArgs", der sich in "Microsoft.VisualBasic.ApplicationServices" befindet. Da ich gelernt habe, dass ich diesen Namespace nicht verwenden soll, frage ich mich nun, wie ich mein Ziel erreichen kann. Oder soll ich nur nicht verwenden, was sich direkt in "Microsoft.VisualBasic" befindet?
    Besucht auch mein anderes Forum:
    Das Amateurfilm-Forum

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    @'Marcus Das ist ja fast tricky.
    • Einzelinstanzanwendung aktivieren
      und
    • VB.NET-Quellcode

      1. Private Sub MyApplication_StartupNextInstance(sender As Object, e As ApplicationServices.StartupNextInstanceEventArgs) Handles Me.StartupNextInstance
      2. e.BringToForeground = True
      3. End Sub

    Starte Die Anwendung, sorge dafür, dass sie was anzeigt, minimiere das Fenster und starte die Anwendung erneut.
    Bilder
    • Next.png

      14,7 kB, 1.133×191, 62 mal angesehen
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Danke, allerdings ist das nur indirekt eine Antwort auf meine Frage. Du hast aus StartupNextInstanceEventArgs nun ApplicationServices.StartupNextInstanceEventArgs gemacht. Allerdings ist ApplicationServices doch trotzdem innerhalb von Microsoft.VisualBasic. Ist es also in dem Fall OK, den Namespace zu verwenden?
    Besucht auch mein anderes Forum:
    Das Amateurfilm-Forum
    @Marcus Gräfe Dann musst Du es machen, wie es in C# üblich ist.
    Verwende das Modul Program.vb. Der Code in C# wäre:
    Spoiler anzeigen

    C#-Quellcode

    1. static class Program
    2. {
    3. [DllImport("User32.dll")]
    4. [return: MarshalAs(UnmanagedType.Bool)]
    5. static extern bool SetForegroundWindow(IntPtr hWnd);
    6. [DllImport("User32.dll")]
    7. [return: MarshalAs(UnmanagedType.Bool)]
    8. static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow);
    9. //----------------------------------------------------------
    10. /// <summary>Der Haupteinstiegspunkt für die Anwendung.</summary>
    11. [STAThread]
    12. static void Main()
    13. {
    14. Application.EnableVisualStyles();
    15. Application.SetCompatibleTextRenderingDefault(false);
    16. bool isFirstInstance;
    17. // Please use a unique name for the mutex to prevent conflicts with other programs
    18. using (Mutex mtx = new Mutex(true, "DEIN_MUTEX_NAME", out isFirstInstance))
    19. {
    20. if (isFirstInstance)
    21. {
    22. Application.Run(new MainForm());
    23. }
    24. else
    25. {
    26. // The application is already running
    27. // TODO: Display message box or change focus to existing application instance
    28. MessageBox.Show("DEIN_PROGRAMM already running!", "Info", MessageBoxButtons.OK, MessageBoxIcon.Information);
    29. // Fenster des Prozesses in den Vordergrund holen
    30. Process current = Process.GetCurrentProcess();
    31. foreach (Process process in Process.GetProcessesByName(current.ProcessName))
    32. {
    33. if (process.Id != current.Id)
    34. {
    35. SetForegroundWindow(process.MainWindowHandle);
    36. ShowWindowAsync(process.MainWindowHandle, 9); // SW_SHOW
    37. break;
    38. }
    39. }
    40. }
    41. } // releases the Mutex
    42. }
    43. }
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hier wird ja etwas aus dem VB6-Namespace vom System vorgegeben. Das zu umgehen wäre wohl Overkill. Man hat ja, wenn man will, immer Zugriff auf den Namespace. Es geht ja nur darum, ihn nicht zu importieren, um so quasi ungesehen/unwissend auf die Funktionalitäten zuzugreifen. Keine Ahnung, ob man sich da was aus C# abschauen kann, wie es eben da gemacht wird. Da gibt's schließlich keinen VB6-Namespace, dessen Funktionalitäten man nutzen könnte.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @VaporiZed Jou.
    @Marcus Gräfe Willst Du mit aller Gewalt das Ur-VB-Zeugs loswerden?
    Dann muss das Anwendungsframework deaktiviert werden:

    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    VaporiZed schrieb:

    Das zu umgehen wäre wohl Overkill.

    Dann hast du im Prinzip meine Frage beantwortet. In dem Fall benutze ich dann wohl den Namespace.

    RodFromGermany schrieb:

    Willst Du mit aller Gewalt das Ur-VB-Zeugs loswerden?

    Nicht unbedingt. Hätte ich hier im Forum nicht den Tipp bekommen, den Namespace zu meiden, würde ich den munter nutzen. Aber wie ich @VaporiZed verstehe, ist es manchmal OK, weil nicht ohne Aufwand vermeidbar.

    RodFromGermany schrieb:

    Der Code in C# wäre:

    Witzigerweise mache ich es mittlerweile, auch schon vor deinem Post, quasi genau so. ;) Klappt allerdings noch nicht. Aber vielleicht finde ich mit deinem Code meinen Fehler. Übrigens steht da was von SW_SHOW als Erklärung für den Wert 9. 9 ist allerdings SW_RESTORE.

    Danke euch!

    Ich melde mich gegebenenfalls in einem neuen Thread nochmal zurück, falls ich das mit dem ShowWindow nicht hinbekomme.
    Besucht auch mein anderes Forum:
    Das Amateurfilm-Forum

    Marcus Gräfe schrieb:

    SW_RESTORE
    ist jorrekt, das SW_SHOW hatte ich hier im Post nachträglich editiert.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!