PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : .NET: Prozess starten ohne Fokus


Metal Maniac
2011-10-28, 01:04:25
Hallo zusammen,

ich bin grad am verzweifeln. Innerhalb einer VB.NET-Applikation soll ein externer Prozess gestartet werden (Default-Viewer für Images/PDF/etc.). Die Applikation selber stellt nur eine Liste mit Files dar, durch die man sich mit den Cursortasten bewegen kann, die Files sollten dann sofort angezeigt werden. Das Problem ist jetzt aber, dass der externe Prozess nach dem Starten den Fokus erhält und man somit erst wieder die Applikation anklicken muss, um weiter durch die Liste zu navigieren.

Hat da jemand eine Idee, wie man den Prozess ohne Fokus starten könnte?

Ausprobiert habe ich bisher Me.Activate/Focus und einige API-Calls (SetActiveWindow, SetForegroundWindow etc.), bisher leider ohne Erfolg. Bei Me.Activate wird zwar der Fokus wieder auf die Anwendung gesetzt, aber ich muss vorher einen Sleep einbauen, was auch nicht so toll ist.

Viele Grüße,
Metal Maniac

RattuS
2011-10-28, 03:07:42
Wie rufst du denn den Default-Viewer auf? Wenn ich mich recht entsinne, gab es beim .NET einen parametergestützten Prozess-Aufruf, dem du mitgeben kannst, wie der Fokus des aufzurufenden Prozesses gehandhabt werden soll.

Elemental
2011-10-28, 07:33:03
Me.Select() ?

xxxgamerxxx
2011-10-28, 08:29:18
Bei Me.Activate wird zwar der Fokus wieder auf die Anwendung gesetzt, aber ich muss vorher einen Sleep einbauen, was auch nicht so toll ist.


Das ist aber normal bzw. wüsste ich nicht, wie du es besser machen könntest. Du musst die Instanz vom Prozess so lange anpollen bis MainWindowHandle != null ist. Dann weißt du, dass der Fremdprozess sein Fenster erstellt hat und kannst anschließend dein Hauptfenster wieder fokusieren. Wenn du den Fokus zuvor setzen würdest und der Fremdprozess erst danach sein Fenster erstellt, würde der Fokus deiner Hauptanwendung wieder gestohlen werden.

Metal Maniac
2011-10-28, 09:54:25
Danke für die Antworten!

Momentan hab' ich folgendes probiert:
Dim p As Process = Process.Start(viewer, filename)
p.WaitForInputIdle()
Me.Activate()

Das funktioniert aber leider auch nicht verlässlich (beim Acrobat Reader z.B. gar nicht). Me.Select hat an der Stelle auch nichts gebracht. Schön wäre es, wenn ich die Applikation dazu bringen könnte, dass sie den Fokus erst gar nicht verliert.

Metal Maniac
2011-10-28, 22:30:24
Ich hab's jetzt so gelöst:

Dim p As Process = Process.Start(viewer, filename)
p.WaitForInputIdle()

For i As Integer = 0 To 20
Application.DoEvents()
Threading.Thread.Sleep(50)
Me.Activate()
Next

D.h. es wird gewartet, bis der Prozess fertig geladen ist, und dann wird eine Sekunde lang mit der groben Kelle der Fokus zurückgeholt. Das ist zwar für meine Begriffe ziemlich grauslich, aber es funktioniert wenigstens. Hab' mich bei .NET eh schon daran gewöhnt, manche Sachen nicht ganz so elegant lösen zu können...

xxxgamerxxx
2011-10-28, 23:25:12
Eleganter wäre es auf das MainWindowHandle abzufragen anstatt blindlings eine Schleife hochzuzählen.

Metal Maniac
2011-10-29, 02:45:27
Das hab' ich auch ausprobiert, hat aber leider ebenfalls nicht geklappt. Hängt vermutlich mit dem Viewer zusammen, Acrobat Reader z.B. startet ja mehrere Prozesse. Außerdem könnte das Handle auch ein Splash-Screen der aufgerufenen Applikation sein, da bringt das dann auch nichts. Mit der Schleife krieg' ich wenigstens garantiert den Fokus zurück.

Trotzdem danke für die Hilfe!

Bietchiebatchie
2011-11-01, 19:09:01
Die System.Diagnostics.Process-Klasse bietet leider nicht alle Optionen um einen Prozess ohne Focus zu starten; Abhilfe schafft
Microsoft.VisualBasic.Interaction.Shell("foo.exe", ApplicationStyle.NoFocus) (oder so ähnlich.)
Microsoft.VBSCript o.ä. als dll einbinden

Metal Maniac
2011-11-02, 11:52:21
Danke für den Hinweis, hatte ich allerdings auch schon probiert und hat beim Acrobat Reader leider nicht funktioniert.

][immy
2011-11-15, 14:04:36
probier mal die TopMost eigenschaft. http://msdn.microsoft.com/de-de/library/system.windows.forms.form.topmost(v=vs.80).aspx
vor dem starten der externen app auf true setzen. Anschließend wieder auf false. Dadurch solltest du deinen Focus behalten.

Metal Maniac
2011-11-17, 09:22:55
Danke, aber das hatte ich auch schon probiert. Das Fenster ist zwar dann in der Hierarchie ganz oben, verliert aber trotzdem den Fokus :(.