UWP 調用Win32 關機

話說最近程序需要個晚上自動關機的功能

原則上 uwp 應該是沒有關機權限的

上網搜索之

有人說只要這樣就可以了

var psi = new ProcessStartInfo("shutdown", "/s /t 0");
psi.CreateNoWindow = true;
psi.UseShellExecute = false;
Process.Start(psi);

但是使用這個必須要用 Brokered UWP Component Project Templates:

https://marketplace.visualstudio.com/items?itemName=LanceContreras.BrokeredUWPComponentProjectTemplates

這個 Templates 是 vs2015 的

 

不過我的是 vs2017

而且代碼已經很多了,從頭開始肯定不行

但是在 VS2017 下,現在可以直接調用 Win32 程序

在這裏就可以調用 Win32 來進行關機

 

首先隨便寫個關機的程序

比如我們直接開個控制檯程序,寫上:

        static void Main(string[] args)
        {
            Process.Start("shutdown.exe", "-s -f -t 100");
        }

設置程序開啓後100秒關機 (話說設置100秒主要爲了調試方便,只要運行 shutdown –a 就可以取消關機任務)

編譯後生成 ConsoleShutdown1.exe

我們把文件拷貝到uwp的目錄下面

我單獨建了個文件夾,把exe文件包含到項目中:

image

 

然後我們添加引用 “ Windows Desktop Extensions For The UWP ”,添加那個版本看自己的項目需要了,我項目的目標版本直接就是1709,所以直接引用最新版的擴展。

(注意要在 UWP 中調用 Win32 程序,Windows Desktop Extensions For The UWP 的最低版本爲 14393,也就是說對方的win10最低也要爲1607)

image

 

然後我們需要編輯 Package.appxmanifest 文件

直接查看代碼:

image

 

在 Package 節點上,我們要加上 rescap 和 desktop 的引用,注意下面的 IgnorableNamespaces 要加上rescap ,不然你生成應用程序包的時候可以會提示配置文件錯誤。

<Package
  xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10"
  xmlns:mp="http://schemas.microsoft.com/appx/2014/phone/manifest"
  xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10"
  xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities"
  xmlns:desktop="http://schemas.microsoft.com/appx/manifest/desktop/windows10"
  IgnorableNamespaces="uap mp rescap">

 

然後修改 Capabilities 節點,加上 <rescap:Capability Name="runFullTrust"/>

  <Capabilities>
    <Capability Name="internetClient" />
    <rescap:Capability Name="runFullTrust"/>
  </Capabilities>

 

最後在 Application 節點中加入 Extensions 節點,裏面包含我們的 Win32 程序在項目中的路徑

  <Applications>
    <Application Id="App"
      Executable="$targetnametoken$.exe"
      EntryPoint="AppShutdown1.App">
      <uap:VisualElements
        DisplayName="AppShutdown1"
        Square150x150Logo="Assets\Square150x150Logo.png"
        Square44x44Logo="Assets\Square44x44Logo.png"
        Description="AppShutdown1"
        BackgroundColor="transparent">
        <uap:DefaultTile Wide310x150Logo="Assets\Wide310x150Logo.png"/>
        <uap:SplashScreen Image="Assets\SplashScreen.png" />
      </uap:VisualElements>
      <Extensions>
        <desktop:Extension Category="windows.fullTrustProcess" Executable="Exe\ConsoleShutdown1.exe" />
      </Extensions>
    </Application>
  </Applications>

 

基本就大功告成了

下面就是在需要調用 Win32 程序的地方 寫上:

await FullTrustProcessLauncher.LaunchFullTrustProcessForCurrentAppAsync();

 

就可以在UWP 中調用 Win32 程序了

這裏我就可以調用 shutdown 來關機

 

而且即使在  “設置分配的訪問權限” 下,也是可以正常調用 Win32程序 的

image

 

 

此外在調用 Win32 程序的時候還可以加參數(如果 Win32 程序支持的話)

更多見: https://docs.microsoft.com/en-us/uwp/api/windows.applicationmodel.fulltrustprocesslauncher

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章