Verhindern Prozess ‚A‘ von Laichen Prozess ‚B‘ zeigt, die dann oben auf, was die „TopMost“ Process sollte ‚C‘

StackOverflow https://stackoverflow.com/questions/1132831

Frage

Ich habe eine Windows Form-Anwendung, die die TopMost sein muss. Ich habe meine Form gesetzt die TopMost und meine Anwendung sein funktioniert, wie ich es möchte in einem Fall auszunehmen.

Es ist eine 3rd-Party-Anwendung (bezeichnet als player.exe ), den Film SWF-Dateien auf einem Teil des Bildschirms zeigt, dass Pop-up auf meiner Anwendung.

Mit Process Monitor ich festgestellt, dass player.exe Anwendung Anrufe
flash.exe <PositionX> <PositionY> <Width> <Height> <MovieFile>
in meinem Fall:
flash.exe 901 96 379 261 somemovie.swf

Da flash.exe wird in einem neuen Prozess nach meiner Form hervorgebracht wird, hat zur TopMost gesetzt wurde es auf meiner Anwendung erscheint.

Das erste, was ich tat, war meine Anwendung machen minimieren, um die player.exe Hauptfenster der Hoffnung, dass dies auch den Flash erscheinen verhindern würde. Aber leider hat es nicht ... auch mit dem Fenster minimiert, wenn der Flash-Film beginnt es an der Pixelstelle zeigt nach oben (901,96). Ich habe dann versucht, einen Timer zu schaffen halten die form.TopMost Eigenschaft auf true alle 10 ms einstellen. Diese Art von Arbeiten aber immer noch einen sehr schnellen Blip der SWF-Datei.

Gibt es irgendeine Art von API-Aufruf von Windows, die verwendet werden können, um vorübergehend zu verhindern player.exe von Child-Prozesse Laichen, die sichtbar sind? Ich gebe zu, es klingt ein wenig weit hergeholt. Aber neugierig, ob jemand ein ähnliches Problem gehabt hat.


Nachtrag:

Dieser Zusatz ist eine Antwort auf einige der Vorschläge in Mathews Beitrag unten verlegt out.

Für die Notsituation in den Kommentaren beschrieben, ich mögliche Lösungen entlang dieser Linien aussehen:

  

1) Wie funktioniert die Applikationen von Drittanbietern normalerweise beginnen und   gestoppt? Darf ich um es schließen   in der gleichen Weise? Handelt es sich um eine Dienstleistung, die   Service Control Manager kann es stoppen.   Wenn es sich um eine regelmäßige Anwendung ist,   eine Flucht Tastendruck sendet (mit   Send () vielleicht) oder WM_CLOSE   Nachricht an das Hauptfenster arbeiten kann.

Der einfachste Weg, um die App zu CTRL-ALT-DEL zu schließen, dann Prozess töten. -ODER- Der richtige Weg ist ESC zu halten, während die linke Maustaste klicken ... dann geben Sie Ihren Benutzernamen und das Passwort, das einige Menü navigieren den Player beenden.

Es gibt keinen Befehl PAUSE ... es glauben oder nicht.

Ich glaube nicht, WM_CLOSE verwendet, wird helfen, da die Anwendung minimiert nicht. Wäre das der Prozess auch töten? Wenn nicht, wie Sie wieder öffnen Sie es.

  

2) Wenn ich es nicht schön schließen kann, bin ich es zu töten erlaubt? Wenn ja,   TerminateProcess () sollte funktionieren.

Ich kann den Prozess aus zwei Gründen töten. 1) Nach dem Relaunch benötigen Sie Benutzername / Passwort-Anmeldeinformationen liefern ... Es gibt eine Möglichkeit sein kann, dies zu umgehen, da sie nicht aufgefordert werden, wenn das Gerät neu gestartet wird, aber ... 2) Jedes Mal, wenn ich den Prozess im Task-Manager zu töten < strong> es stirbt nicht anmutig und fragt, ob Sie einen Fehlerbericht senden möchten .

  

3) Wenn ich unbedingt den anderen Prozess laufen muss gehen, ich würde versuchen,   um zu sehen, ob ich das kann programmatisch   schnelle Benutzerumschaltung aufrufen, mich zu nehmen   zu einer anderen Sitzung (in der es   wird keine konkurrierenden oberste Fenster).   Ich weiß nicht, wo in der API zu starten   mit diesem. (Peter Ruderman   dies legt nahe, SwitchDesktop ()   Zweck in seiner Antwort.)

habe ich wirklich von dieser Idee begeistert ... Ich fand diesem Artikel auf Codeproject, die eine Menge der API-Wrapper Methoden zur Verfügung stellt. Ich hielt es die Umsetzung, weil Ich denke, dass für Desktops, um Sie zu arbeiten, müssen explorer.exe laufen haben (was ich nicht) .

EDIT2 : Am zweiten Gedanken ... vielleicht explorer.exe ist nicht erforderlich. Ich werde es versuchen und berichten.

Edit3 : War nicht in der Lage, den Code in th zu erhaltenin Artikel arbeiten. Müssen diese für einen Moment gehalten.


Antwort Zusammenfassung

Wie zu erwarten, gibt es keine einfache Antwort auf dieses Problem. Die beste Lösung wäre Schalter auf einen anderen Desktop in problematischer Weise, wenn Sie brauchen nichts zu garantieren darüber erscheinen. Ich war nicht in der Lage, eine einfache C # -Implementierung von Desktop-Schalt zu finden, die funktionierten und ich hatte einen drohenden Zweifel, dass ich nur eine ganz neue Reihe von Würmern eröffnen, sobald sie umgesetzt wurde. Deshalb habe ich beschlossen, nicht die Desktop-Umschaltung zu implementieren. Ich habe eine C ++ Implementierung, die gut funktioniert. Bitte senden Sie arbeiten C # virtuellen Desktop Implementierungen für andere.

War es hilfreich?

Lösung

Zur Einstellung der TopMost Eigenschaft (oder Hinzufügen des WS_EX_TOPMOST Stil zu einem Fenster) nicht machen sie einzigartig in dem System. Eine beliebige Anzahl von obersten Fenster kann durch eine beliebige Anzahl von Anwendungen erstellt werden; die einzige Garantie ist, dass alle obersten Fenster ‚oben‘ alle nicht-obersten Fenster gezogen werden. Wenn es zwei oder mehr oberste Fenster, die Z-Reihenfolge gilt nach wie vor. Aus Ihrer Beschreibung vermute ich, dass flash.exe auch ein oberstes Fenster erstellt wird.

Neben regelmäßigen Abständen Ihre Fenster auf der Oberseite der Z-Ordnung zu zwingen, ich glaube, es gibt wenig, was Sie tun können. Sei Sie gewarnt, jedoch, dass dieser Ansatz ist gefährlich: Wenn zwei oder mehr Fenster gleichzeitig selbst versuchen, von der Z-Ordnung nach oben zu zwingen, wird das Ergebnis ein Flackern Chaos sein, dass der Benutzer wird wahrscheinlich den Task-Manager verwenden, um entweichen kann.

Ich empfehle, dass Ihr Programm versuchen, nicht mit anderen Prozessen auf dem Computer einzumischen (es sei denn, das ist sein ausdrücklicher Zweck, zum Beispiel eines Task-Managers-Klon). Der Computer gehört dem Benutzer, und er kann das Programm höher nicht Wert als alle anderen.

Nachtrag:

Für die Notsituation in den Kommentaren beschrieben, ich mögliche Lösungen entlang dieser Linien aussehen:

  1. Wie funktioniert die Applikationen von Drittanbietern normalerweise beginnen und gestoppt? Darf ich es die gleiche Art und Weise schließen? Handelt es sich um eine Dienstleistung, die Service Control Manager kann es stoppen. Wenn es eine regelmäßige Anwendung, einen Escape-Tastendruck sendet (mit Send () vielleicht) oder WM_CLOSE Nachricht an das Hauptfenster arbeiten.

  2. Wenn ich es nicht schön schließen kann, bin ich es zu töten erlaubt? Wenn ja, TerminateProcess () sollte arbeiten.

  3. Wenn ich unbedingt den anderen Prozess laufen lassen müssen, würde ich versuchen, zu sehen, ob ich programmatisch schnell Benutzer aufrufen kann Schalt mich in eine andere Sitzung zu nehmen (in denen es keine konkurrierenden oberste Fenster sein). Ich weiß nicht, wo in der API mit diesem zu starten. (Peter Ruderman schlägt SwitchDesktop () für diese Zweck in seiner Antwort.)

Andere Tipps

Sie können über die Process-Klasse Start flash.exe direkt - und verwenden ein geeignetes Process Einstellungen, um das Fenster in einem verborgenen Zustand zu zeigen, -. oder mit einem Window von versteckten oder minimierte

Sie können auch mit der erwägen SetWindowsHookEx API, um die Prozessstart-API-Aufrufe abzufangen und wenn der Prozess einen Code flash.exe ausgeführt ist, dass Sie Fenster meisten Top-Status wieder herzustellen.

Matthew Antwort ist ausgezeichnet, aber ich vermute, dass Sie die falsche Frage stellen. Warum Ihre Anwendung Notwendigkeit sein oberster? Wenn Sie versuchen, einen Kiosk oder eine solche zu schaffen, dann oberste ist nicht der Weg zu gehen.

Edit: Nach Ihrer Antwort auf Matthew Kommentar zu lesen, würde ich vorschlagen, einen neuen Desktop erstellen und zu dem Einschalten, bevor Ihre Warnung angezeigt wird. (Siehe Create und SwitchDesktop in MSDN.)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top