【发布时间】: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 中建议的事情。