2015-11-25 21 views
19

Pracuję nad tworzeniem niestandardowych poleceń Cortany. Polecenia są rejestrowane i wykonywane przy użyciu uniwersalnej aplikacji platformy Windows. (GitHub)Jak wykonać polecenia procesu (lub podobne) za pomocą aplikacji Universal Windows Platform (UWP)?

Na przykład, mam zarejestrowane następujące polecenie

<Command Name="ShutDown">  
    <ListenFor>Shut down</ListenFor> 
    <Navigate/>  
</Command> 

Aby uruchomić tę funkcję w UWP aplikacji

static async void ShutDown() 
{ 
    var dialog = new MessageDialog("This is where I would shut the computer down."); 
    await dialog.ShowAsync(); 
    //System.Diagnostics.Process.Start("Shutdown", "-s -t 10"); 
} 

Ale po ustawieniu tego się dowiedziałem System.Diagnostics.Process nie jest obsługiwany UWP.

Komendy niestandardowe, które chcę uruchomić, obejmują wykonywanie pewnych czynności, takich jak uruchamianie programów zewnętrznych, uruchamianie innych skryptów lub otwieranie witryn.

To ma sens, że UWP nie obsługuje ich, biorąc pod uwagę, że jest uniwersalny i XBox lub telefon może nie być w stanie tego zrobić, ale miałem nadzieję, że był jakiś alternatywny lub hacky sposób, aby to osiągnąć w systemie Windows 10 PC.

Czy istnieje sposób, aby wykonać komendy Process lub coś podobnego o podobnej funkcjonalności w aplikacji UWP? Wygląda na to, że mimo tego, że mogę zmusić Cortanę do wykonania mojego kodu C#, UWP nie obsługuje wielu, które byłyby użyteczne w tej sytuacji.

Z góry dziękuję.

+0

robi '' wsparcie UWP' użyciu WMI' jeśli tak to zrobić za pomocą WMI – MethodMan

+0

@MethodMan Dzięki za pomysł, że warto było sprawdzić. Niestety [nie wygląda na to, że obsługiwany jest również "WMI"] (https://social.msdn.microsoft.com/Forums/vstudio/en-US/efcf0564-5bdb-44c5-95a8-76395b662b2b/uwp-wmi- wsparcie-uwp-applications? forum = wpdevelop). To właśnie mam na myśli, myślałem, że rejestracja i wykonywanie poleceń będzie trudną częścią, nie zdawałem sobie sprawy, że C# będzie tak ograniczone w 'UWP'. –

+3

bummer. Microsoft chce więcej aplikacji, ale mocniej zaciska nasze ręce. Chcę wysłać polecenie do "zaufanego" procesu aplikacji - o co w tym wszystkim chodzi? Człowiek w środku atakuje? Programista może wysyłać i odbierać json z aplikacji na serwer, dlaczego nie do aplikacji? – ezaspi

Odpowiedz

16

Istnieją - ograniczone - sposoby na osiągnięcie podobnego zachowania.

  1. Możesz użyć LaunchUri, aby aktywować inne aplikacje, które zarejestrowały się dla określonego URI-Scheme. To powinno działać w twoim scenariuszu przeglądarki. Więcej szczegółów: https://msdn.microsoft.com/en-us/library/windows/apps/windows.system.launcher.launchuriasync.aspx

  2. Możesz uruchomić inną aplikację i uzyskać z niej wyniki za pomocą LaunchForResults. Wywoływana aplikacja musi to wspierać. Więcej szczegółów: https://msdn.microsoft.com/en-us/library/windows/apps/mt269386.aspx

  3. Możesz uruchomić usługi aplikacji dostarczane przez inną aplikację. Wywoływana aplikacja musi to wspierać. Usługa aplikacji zostanie wykonana w tle. (Myślę, że to jest całkiem fajne.) Więcej szczegółów tutaj: http://blogs.msdn.com/b/mvpawardprogram/archive/2015/06/11/writing-windows-10-app-services-in-javascript.aspx

  4. To jest trochę hacky: nie jestem pewien, czy to nadal działa, ale zadziałało dla Windows 8.1: Można utworzyć tzw. "Brokered" Składnik". To pozwala wyzwolić wszystko z twojej aplikacji na twoim komputerze, ale nie będziesz w stanie opublikować wyrzuconego komponentu do sklepu. Pozwoliło to również Process.Start() na Windows 8.1. Działało tylko w przypadku sideloaded aplikacji. Nie jestem pewien, czy to nadal działa w systemie Windows 10. Więcej informacji tutaj: https://msdn.microsoft.com/en-us/library/windows/apps/dn630195.aspx

Podsumowanie: Uruchamianie innej aplikacji jest dość proste, dopóki aplikacja docelowa zarejestrowany jako usługi aplikacji lub zarejestrowanego obsługi protokołu (Schemat Uri). Uruchamianie skryptów lub innych * .exe jest niemożliwe, jeśli opcja 4 nie działa.

+0

Dzięki za odpowiedź! Wypróbuję niektóre z nich dziś wieczorem. –

+0

Czy ktoś próbuje użyć AppService do "zamknięcia" lub "ponownego uruchomienia" tabletu? Nie mogę znaleźć sposobu, żeby to zrobić. – Sam

3

Wraz z aktualizacją rocznicy systemu Windows 10 (1607) dostępna jest opcja włączenia tego scenariusza na komputerze.Z tego API na pulpicie Extension SDK można uruchomić proces fulltrust że pracuje z pełnymi uprawnieniami użytkownika:

https://docs.microsoft.com/en-us/uwp/api/Windows.ApplicationModel.FullTrustProcessLauncher

ten sposób można zapalić ją na platformach gdzie jest obsługiwany, czyli komputery z systemem 1607 lub powyżej. A aplikacja będzie nadal uniwersalny:

if (ApiInformation.IsApiContractPresent("Windows.ApplicationModel.FullTrustAppContract", 1, 0)) 
{ 
    await FullTrustProcessLauncher.LaunchFullTrustProcessForCurrentAppAsync(); 
} 
+0

Ale jeśli użyję tego, czy mogę opublikować moją aplikację w Sklepie? – Sieg

+0

Tak, ogólnie możesz. Będziesz musiał przejść proces publikowania aplikacji komputerowej, który będzie zawierał wstępną recenzję Twojej aplikacji, ponieważ ma pełną zdolność reklamową. Możesz rozpocząć ten proces tutaj: https://developer.microsoft.com/en-us/windows/projects/campaigns/desktop-bridge –