.
Anmeldung | Registrieren | Hilfe
in Suchen

Externe Anwendungen starten, aber _ohne_ Focusänderung

Letzter Beitrag 05. Feb 2008 18:58 von kaleb. 6 Antworten.
Seite 1 von 1 (7 Treffer)
Beiträge sortieren: Zurück Weiter
  • 03. Feb 2008 0:39

    • kaleb
    • Top 100 Mitwirkender
    • Registriert am 23. Jan 2008
    • Beiträge 15
    • Punkte 380

    Confused [8-)] Externe Anwendungen starten, aber _ohne_ Focusänderung

    Ich möchte in meiner Anwendung windows-updates in eine XPCD  Integrieren. Dazu rufe ich die Updates nacheinander mit den entsprechenden Parametern auf. Das ganze passiert in einem von der GUI getrennten Thread. Funktioniert alles und hab damit keine Probleme.

    Das Problem ist das die Hauptanwendung ständig den Focus verliert und wieder bekommt, wenn die Updates der Reihe nach beendet und gestartet werden. Das Focus verlieren ist kein Problem, kann es ruhig. Nur das der Fokus anschließend wieder auf die Anwendung zurückfällt ist extrem unpraktisch. Denn man kann so gut wie nichts mehr am PC machen während die Integration läuft, weil der Focus zb, von _diesem_ Eingabefeld oder von einem Chat-Fenster, meinem Word-Dokument, etc. entfernt wird und der Hauptanwendung wieder zugeteilt wird.

    Nun also die Fachfrage: Wie kann ich externe Anwendungen (in dem Fall die Updates) starten ohne das sich der Focus meiner Hauptanwendung ändert. Also wenn die Anwendung den Focus hat, soll der auch da bleiben und wenn Sie keinen hat soll sie ihn auch nicht bekommen. Ich habe mit "shell" und "process.start" schon sehr viel ausprobiert und komme einfach nicht weiter.
    • IP-Adresse ist Registriert
  • 03. Feb 2008 3:26 Antwort zu

    • Tim Hartwig
    • Top 25 Mitwirkender
      Männlich
    • Registriert am 13. Jan 2008
    • 66822 Lebach
    • Beiträge 116
    • Punkte 1.775

    Externe Anwendungen starten, aber _ohne_ Focusänderung

    Das kann man ganz einfach mit der ShellExecute API lösen:

        Declare Function ShellExecuteA Lib "shell32.dll" ( _
            ByVal hWnd As IntPtr, _
            ByVal lpOperation As String, _
            ByVal lpFile As String, _
            ByVal lpParameters As String, _
            ByVal lpDirectory As String, _
            ByVal nShowCmd As Integer) _
        As IntPtr

    Und dann der Aufruf wie folgt:
    ShellExecuteA(Me.Handle, "open", "C:\test.txt", "", "", 0)

    Wobei die 0 am ende für HIDE steht.
    Statt der 0 kann man auch die 4 nehmen die steht für SHOWNOACTIVATE also ohne Focus anzeigen.
    Und statt "C:\test.txt" natürlich den Pfad der Anwendung Wink

    Hier sind alle Optionen im überblick:

    SW_HIDE             = 0
    SW_SHOWNORMAL       = 1
    SW_NORMAL           = 1
    SW_SHOWMINIMIZED    = 2
    SW_SHOWMAXIMIZED    = 3
    SW_MAXIMIZE         = 3
    SW_SHOWNOACTIVATE   = 4
    SW_SHOW             = 5
    SW_MINIMIZE         = 6
    SW_SHOWMINNOACTIVE  = 7
    SW_SHOWNA           = 8
    SW_RESTORE          = 9
    SW_SHOWDEFAULT      = 10

    • IP-Adresse ist Registriert
  • 03. Feb 2008 11:56 Antwort zu

    • kaleb
    • Top 100 Mitwirkender
    • Registriert am 23. Jan 2008
    • Beiträge 15
    • Punkte 380

    Externe Anwendungen starten, aber _ohne_ Focusänderung

    Sieht ja ganz nett aus nur sehe ich da keine Möglichkeit meinem Code mitzuteilen das er warten soll bis dieser Aufruf komplett beendet wurde.
    • IP-Adresse ist Registriert
  • 03. Feb 2008 12:13 Antwort zu

    Externe Anwendungen starten, aber _ohne_ Focusänderung

    Aus Deinen Ausführungen entnehme ich, daß die einzelnen Updates keine Benutzereingaben erfordern. Kannst Du dann nicht System.Diagnostics.Process benutzen? Man kann den WindowStyle von StartInfo auf ProcessWindowStyle.Hidden setzen. Anschließend kannst Du auf das Ende des Prozesses warten bzw. Dich benachrichtigen lassen.
    Gruß,
    Thomas


    Thomas Freudenberg
    • IP-Adresse ist Registriert
  • 03. Feb 2008 12:17 Antwort zu

    • kaleb
    • Top 100 Mitwirkender
    • Registriert am 23. Jan 2008
    • Beiträge 15
    • Punkte 380

    Externe Anwendungen starten, aber _ohne_ Focusänderung

    Ja, im Moment benutze ich auch einen "Process". Da kann man auch einfach auf das Ende warten.

    So siehts im Moment aus.

                            'Den Prozess starten
                            Dim startinfo As New System.Diagnostics.ProcessStartInfo
                            startinfo.Arguments = "/quiet /integrate:""" & Integration_WorkingDir & """"
                            startinfo.CreateNoWindow = True
                            startinfo.ErrorDialog = False
                            startinfo.FileName = Path.Combine(download_pfad, dateiname)
                            startinfo.UseShellExecute = False
                            startinfo.WindowStyle = ProcessWindowStyle.Hidden
    
                            Dim p As Process = Process.Start(startinfo)
                            p.PriorityClass = ProcessPriorityClass.AboveNormal
                            'Warten, bis das Laden des Prozessfensters durchgeführt ist
                            p.WaitForInputIdle()
                            'Warten, bis der Prozess beendet ist
                            p.WaitForExit()



    Sehr viele verschiedene tolle Optionen. Aber keine sorgt dafür das die Updates _richtig_ im Hintergrund ohne eine Focus-Änderung gestartet werden.
    • IP-Adresse ist Registriert
  • 03. Feb 2008 12:24 Antwort zu

    • kaleb
    • Top 100 Mitwirkender
    • Registriert am 23. Jan 2008
    • Beiträge 15
    • Punkte 380

    Externe Anwendungen starten, aber _ohne_ Focusänderung

    Um das ganze mal etwas zu Demonstrieren hier ein kleines Video. Man sieht es eigentlich sehr gut was ich meine.

    Während diesem Vorgang taucht wie gesagt nix neues in der Taskleiste auf. Es läuft lediglich eine Progressbar.

    http://box.tobiasndw-online.de/2008-02-03_1220.swf
    • IP-Adresse ist Registriert
  • 05. Feb 2008 18:58 Antwort zu

    • kaleb
    • Top 100 Mitwirkender
    • Registriert am 23. Jan 2008
    • Beiträge 15
    • Punkte 380

    Externe Anwendungen starten, aber _ohne_ Focusänderung

    Hat denn niemand eine Idee??
    • IP-Adresse ist Registriert
Seite 1 von 1 (7 Treffer)

Regeln | Impressum