【问题标题】:Enable/Disable StartupTask in C#在 C# 中启用/禁用 StartupTask
【发布时间】:2020-04-09 06:42:19
【问题描述】:

我想请教一些关于如何使以下内容成为可能的建议:

想要的功能:我想让用户选择在应用程序运行时启用和禁用我正在构建的桌面桥应用程序的启动设置。理想情况下,当通过上下文菜单按下按钮时会弹出一个小的表单窗口,为用户提供两个选项。 “是”或“否”按钮是应用程序是否应在启动时自动启动以便下次重新启动系统的两个选项。

正在使用的技术:我将应用程序构建为一个 winform 应用程序,并通过桌面桥功能将其变成一个 uwp 应用程序。我这样做是因为它最终会出现在 Windows 应用商店中。

参考:我在此站点上找到了一个名为 StartupTask 的 API:https://docs.microsoft.com/en-us/uwp/api/windows.applicationmodel.startuptask#properties

我的 Package.appxmanifest 文件中已经有这个:

<Extensions>
<desktop:Extension
Category="windows.startupTask"
Executable="uniqueFolder\myExeFile.exe"
EntryPoint="Windows.FullTrustApplication">
<desktop:StartupTask
TaskId="myAppTaskID"
Enabled="true"
DisplayName="MyAppDisplayName" />
</desktop:Extension>
</Extensions>

我已成功添加这些参考:

-Windows(Windows.winmd)
-System.Runtime.WindowsRuntime(WindowsRuntime.dll)
-Windows.ApplicationModel.StartupTaskContract
-Windows.Foundation.FoundationContract

我将 Windows(Windows.winmd) 别名的引用修改为“全局”以外的其他内容以避免编译器错误:

StateError The type 'StartupTaskContract' exists in both '...' and '...'.

以下 c# 代码尝试通过尝试获取应用程序的 startuptaskId 来开始使用此功能,但不幸的是,这给了我一个错误。

C#代码:

async void MyFunct()
{
StartupTask startupTask = await StartupTask.GetAsync("myAppTaskID");
}

我目前收到的编译器错误:

StateError CS1929 'IAsyncOperation<StartupTask>' does not contain a definition for 'GetAwaiter' and the best extension method overload 'WindowsRuntimeSystemExtensions.GetAwaiter(IAsyncAction)' requires a receiver of type 'IAsyncAction'

最后,此启用和禁用功能应反映在 Windows 10 启动应用程序窗口中,显示应用程序处于打开或关闭状态。

我尝试了多种不同的方法,但都没有成功。也许我忽略了一些事情,所以有一个外部视角会有所帮助。

使用应用清单扩展代码,应用会在系统启动时自动启动。

我知道用户可以通过启动应用程序窗口或任务管理器打开或关闭应用程序。但此功能是客户端的要求。

任何建议将不胜感激。

感谢阅读~

【问题讨论】:

    标签: c# winforms windows-10 desktop-bridge app-startup


    【解决方案1】:

      <package id="Antlr" version="3.4.1.9004" targetFramework="net452" />
      <package id="bootstrap" version="3.0.0" targetFramework="net452" />
      <package id="jQuery" version="1.10.2" targetFramework="net452" />
      <package id="jQuery.Validation" version="1.11.1" targetFramework="net452" />
      <package id="Microsoft.AspNet.Identity.Core" version="2.2.1" targetFramework="net452" />
      <package id="Microsoft.AspNet.Mvc" version="5.2.3" targetFramework="net452" />
      <package id="Microsoft.AspNet.Razor" version="3.2.3" targetFramework="net452" />
      <package id="Microsoft.AspNet.Web.Optimization" version="1.1.3" targetFramework="net452" />
      <package id="Microsoft.AspNet.WebPages" version="3.2.3" targetFramework="net452" />
      <package id="Microsoft.CodeDom.Providers.DotNetCompilerPlatform" version="1.0.0" targetFramework="net452" />
      <package id="Microsoft.jQuery.Unobtrusive.Validation" version="3.2.3" targetFramework="net452" />
      <package id="Microsoft.Net.Compilers" version="1.0.0" targetFramework="net452" developmentDependency="true" />
      <package id="Microsoft.Rest.ClientRuntime" version="2.3.2" targetFramework="net452" />
      <package id="Microsoft.Web.Infrastructure" version="1.0.0.0" targetFramework="net452" />
      <package id="Modernizr" version="2.6.2" targetFramework="net452" />
      <package id="Newtonsoft.Json" version="6.0.8" targetFramework="net452" />
      <package id="Respond" version="1.2.0" targetFramework="net452" />
      <package id="WebGrease" version="1.5.2" targetFramework="net452" />
    

    用途

    using System;
    using System.Collections;
    using System.Collections.Generic;
    using System.Threading;
    using System.Threading.Tasks;
    using Microsoft.Rest;
    

    方法

    void MyFunct()
    {
    
       Task.Factory.StartNew(s => StartupTask.GetAsync("myAppTaskID"), this, CancellationToken.None, TaskCreationOptions.None, TaskScheduler.Default).GetAwaiter();
    
    // or 
    
       StartupTask.GetAsync("myAppTaskID").wait();
    }
    

    【讨论】:

    • 感谢您的回复。我尝试了您的建议,但收到以下错误:错误 CS1929 'Task>' 不包含“Unwrap”的定义,并且最佳扩展方法重载“TaskExtensions.Unwrap(Task)”需要'Task' 类型的接收者。我是否缺少一些 dll 或 using 命名空间?
    • 我做了一些改动。
    • 非常感谢您的帮助。这次我在编译应用程序时没有遇到编译器错误,但 StartNew 方法的 StartupTask.GetAsync("myAppTaskID") 部分不会像这样运行。我知道这是因为如果我尝试将该语句简化为: var myVar = StartupTask.GetAsync("myAppTaskID");我尝试在运行时访问代码的简化部分,我得到一个运行时错误,导致应用程序崩溃。错误显示“System.Exception: Element not found. (Exception from HRESULT: 0x800 ...) at Windows.ApplicationModel.StartupTask.GetAsync(String taskId)”。你对此有何看法
    • 这让我相信 StartNew 方法被忽略或从未运行,因为它无法访问该元素。然后,当我尝试使用该简化版本直接访问它时,我得到了导致应用程序崩溃的运行时错误。当您最终尝试此操作时,您是否能够使用此代码成功更改应用程序的启动设置并将其反映在 Windows 10 启动应用程序窗口或任务管理器中?如果是这样,我做错了什么?
    • 可能你的任务缺少接口或IBackgroundTask。
    猜你喜欢
    • 2019-04-19
    • 2018-09-06
    • 1970-01-01
    • 1970-01-01
    • 2014-07-10
    • 2018-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多