Auf welchem ​​Desktop laufen Metro-Sachen?

8

Aus der Sicht des WinAPI-Entwicklers: Was ist der Desktop Laufen Metro-Apps?

Dieses Zeug:

    
c00000fd 20.04.2014, 02:59
quelle

2 Antworten

24

Ich wusste nicht, dass es so ein Geheimnis sein würde ... also musste ich einige Nachforschungen anstellen und hier ist was ich gefunden habe:

Zunächst, um meine ursprüngliche Frage zu beantworten - die Metro (oder Modern UI) Zeug läuft in der gleichen Desktop als" Desktop "-Apps (entschuldige das Wortspiel.) Es ist eigentlich alles sehr einfach. Die kurze Antwort - alle von Microsoft genehmigten Metro-Stuffs werden im Container " Internet Explorer_Server " ausgeführt (was laut Laien der Internet Explorer ist); oder im Container DirectUIHWND (das ist die proprietäre Klasse von Microsoft, die ihre undokumentierte Benutzeroberfläche abruft), alle in Fenster mit dem WS_EX_TOPMOST Stil gedreht on, wodurch sie über den anderen Inhalt gerendert werden. Und das ist es!

Hier ein paar Beispiele:

Lass uns den Desktop teilen und Spy++ verwenden, um zu sehen, was unter der Haube passiert:

Wenn wir also in das App-Fenster "Wetter" schauen, ist es nichts anderes als das reguläre (Win32) -Fenster der Klasse " Internet Explorer_Server ", das im Fenster des " Web Platform Embedding "Klasse, die wiederum im Container" Windows.UI.Core.CoreWindow "mit den Styles WS_EX_TOPMOST und WS_EX_NOREDIRECTIONBITMAP auf:

sitzt

Wenn Sie noch genauer hinschauen, scheinen alle Microsofts Metro -Steine ​​ von WWAHOST.exe , was vereinfacht gesagt der Container ist, in dem JavaScript für die Metro-Apps ausgeführt wird.

Sehen wir uns jetzt den Startbildschirm an. Da es den Desktop vollständig abdeckt, müssen wir ein anderes Tool und seine Shift-Key-Snapshot-Fähigkeit verwenden, um dorthin zu gelangen:

Daraus können wir das Fenster-Handle des Startbildschirms (oder 0x10158 in meinem Fall) holen und es im Spy ++ nachschlagen:

Wie Sie in beiden Tools sehen können, hat der Startbildschirm die folgende Fensterklasse: DirectUIHWND befindet sich in einem Fenster der Klasse ImmersiveLauncher , das ist die mit den Stilen WS_EX_TOPMOST und WS_EX_NOREDIRECTIONBITMAP , die dafür sorgen, dass es oben bleibt. Und das ist der einzige Unterschied zwischen it und jedem anderen Fenster, das von einer "Desktop" -App erstellt wurde.

Interessant ist auch, wie der "Desktop" selbst im Falle einer Split-Window-Situation gerendert wird. Ich nahm ursprünglich an, dass in diesem Fall der Desktop einfach verschoben (oder verschoben) wird auf die Seite und die Größe geändert, aber das ist nicht was passiert ... In der Realität (oder in meinem Windows 8.1) im Falle von Bei einer Trennung zwischen einer Desktop- und einer Metro-App deckt die Metro-App nur den Desktop ab, aber der Desktop ändert nicht seine Position oder Größe. In diesem Fall werden nur die Taskleiste und die vorhandenen Desktopfenster verschoben und in der Größe angepasst, um sie an die Aufteilung anzupassen. Dies könnte anhand dieses Diagramms veranschaulicht werden:

Als eine Randnotiz kann solch eine Verschiebung und Größenanpassung für einen Benutzer ziemlich ärgerlich sein, da die ursprünglichen Positionen und Größen der Desktop-Fenster nicht wiederhergestellt werden, wenn die Aufteilung wegfällt.

Und schließlich, ein etwas unerwarteter Befund. Ich habe mich entschieden, zu überprüfen, wie Google-Nutzer ihren Chrome-Browser (der als Metro-App ausgeführt wird) implementieren können und Folgendes gefunden haben:

Chrome rendert im Fenster " Windows.UI.Core.CoreWindow " des Google-eigenen Prozesses " C:\Program Files (x86)\Google\Chrome\Application\chrome.exe ". Ohne tiefer zu gehen, ist es offensichtlich möglich, eine Metro-ähnliche App in einem Nicht-Microsoft-Container zu kapseln, was eine gute Nachricht für Entwickler ist, die sich nicht um AppStore XAML-Apps kümmern:)

BEARBEITEN: Vergessen Sie zu erwähnen, wenn Sie eine eigene Popup-Nachricht von einem Win32-Prozess anzeigen möchten, der über einer Metro-App sichtbar ist, müssen Sie Folgendes tun:

  • Setzen Sie UIAccess="true" im Prozessmanifest. Sie können dies in Visual Studio tun, indem Sie zu Project Properties - & gt; Linker - & gt; Manifest Files und setze UAC Bypass UI Protection auf YES. (Beachten Sie, dass Sie UAC Execution Level als asInvoker beibehalten können oder keine Erhöhung Ihres Prozesses erfordern.)

  • Code-signieren Sie Ihren Prozess. Es ist wichtig, da es ohne eine Signatur nicht funktioniert, und Sie werden diese Fehlermeldung sehen: " Ein Verweis wurde vom Server zurückgegeben. "

Alternativ zum Signieren (oder zu Testzwecken auf Ihrem Entwicklungssystem) können Sie den folgenden Registrierungsschlüssel festlegen bis 0.(Ich habe es nicht ausprobiert, und ich würde es aus offensichtlichen Sicherheitsgründen nicht empfehlen ! Aber es scheint eine andere Möglichkeit zu sein, es zu testen, wenn ein Code-Signing-Zertifikat nicht verfügbar ist.)

%Vor%
  • Legen Sie die kompilierte ausführbare Datei entweder in den Ordner %windir%\System32 oder realistischer in den Ordner %ProgramFiles%\Company\Product oder in den alternativen Ordner %ProgramFiles(X86)%\Company\Product für den Installationsort Ihres Produkts.

Sie können auch Raymond Chens Artikel zu diesem Thema lesen .

  • Wenn Sie anschließend den WS_EX_TOPMOST Stil in Ihrem Popup-Fenster festlegen, wird er über allen anderen Fenstern angezeigt, einschließlich der Metro-Apps, des Startbildschirms usw.

Also mit anderen Worten, dies tun:

%Vor%

Kann dies erreichen:

    
c00000fd 20.04.2014 09:09
quelle
7

Da Sie sagen, dass Ihr tatsächliches Problem darin besteht, zu wissen, ob eine Metro-App läuft, lautet die Antwort: IAppVisibility::GetAppVisibilityOnMonitor . Übergeben Sie den Monitor, den Sie überprüfen möchten. Beachten Sie, dass dies unabhängig davon, auf welchem ​​Desktop die Anwendungen ausgeführt werden, die richtige Antwort liefert.

    
Raymond Chen 20.04.2014 22:58
quelle