【问题标题】:Check if a packaged WPF Application runned with startup or manually?检查打包的 WPF 应用程序是随启动还是手动运行?
【发布时间】:2018-08-22 04:35:46
【问题描述】:

我有一个打包的 WPF 应用程序,以便能够在 Microsoft Store 中提交它。我已经使用StartupTask extension 来运行它与系统启动。

Package.appmanifest(在解决方案的Package项目中):

<Extensions>
  <uap5:Extension Category="windows.startupTask" Executable="*PathToExecutable*" EntryPoint="Windows.FullTrustApplication">
    <uap5:StartupTask TaskId="MyAppStartupTaskId" Enabled="true" DisplayName="Title in TaskManager" />
  </uap5:Extension>
</Extensions>

问题是在启动时没有设置Argument属性,如下所示:

<uap5:StartupTask Argument="/autostart" ... />

然后我可以在Application_Startup 事件中做这样的事情:

App.xaml.cs(在解决方案的Application项目中):

private void Application_Startup(object sender, StartupEventArgs e)
{
    // Check if application is running by startup
    if (e.Args.Length > 0 && e.Args[0] == "/autostart")
    {
        LaunchMinimized = true;
    }
    // Lots of bla bla blas here...
}

问题是我可以使用StartupTask 的东西检查是否在 WPF 应用程序中通过系统启动启动了程序?系统启动启动器是否将任何事件或属性附加到我的应用或其启动参数以检查启动?

【问题讨论】:

  • 您可以查询 PPID(父 PID)并据此判断哪个进程打开了您的程序。
  • @IneedHelp 不错的技巧,但恐怕 PPID 是我可以依赖的线索。我刚刚使用 Process Hacker 在自动启动模式下检查了我的应用程序的父进程,它是“explorer.exe”。不幸的是,即使我手动运行它,“explorer”也会是父级,所以我猜自动启动模式和手动模式没有区别,至少使用StartupTask
  • 根据它的开始方式,你想做什么不同的事情?
  • @IneedHelp 正如问题的第二个代码示例中所述,我想在启动时最小化运行应用程序。
  • 在 StartupTask 文章的链接之后,它显示了一个 c# 示例;如果您可以在代码隐藏中实现您的 StartupTask,那么您可以切换一个 bool 静态字段,该字段可用于决定是否应该开始最小化。我绝对鄙视 XAML,我纯粹在 C# 中做 WPF,所以我不知道你是否可以做我刚才在 XAML 中建议的事情。

标签: c# wpf uwp startup


【解决方案1】:

恐怕你不能为启动任务指定参数,但如果你的目标是Windows 10 18.03或更高版本,你可以使用AppInstance.GetActivatedEventArgs方法获取IActivatedEventArgs,然后检查它的Kind属性来确定应用程序是否是从启动任务中激活的。

另一种选择是从启动任务启动不同的 .EXE。

这些 API 来自 Windows.ApplicationModel.dllWindows.dll 程序集,您无法将它们添加到 WPF 应用中

当然可以。确保您已安装 the latest SDK 并添加对 C:\Program Files (x86)\Windows Kits\10\References\10.0.17134.0\Windows.Foundation.UniversalApiContract\6.0.0.0\Windows.Foundation.UniversalApiContract.winmd 的引用。

然后你可以在你的 WPF 应用中调用这样的方法:

Windows.ApplicationModel.Activation.IActivatedEventArgs args = Windows.ApplicationModel.AppInstance.GetActivatedEventArgs();

【讨论】:

  • 谢谢,但是从 WPF 应用调用 GetActivatedEventnot supported
  • 我认为多个exe文件是最好的解决方案,如果没有更好的解决方案,我会去。
  • 应该是GetActivatedEventArgs,是的,您应该能够从桌面桥应用程序调用此方法。你试过了吗?
  • 是的。这些 API 来自 Windows.ApplicationModel.dllWindows.dll 程序集,您无法将它们添加到您的 WPF 应用程序中。
  • WPF 本身没有这些方法。您应该添加对它的引用,但没有任何支持的引用。
猜你喜欢
  • 1970-01-01
  • 2016-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-01
  • 1970-01-01
  • 2012-11-15
  • 2022-01-02
相关资源
最近更新 更多