强制 WPF 应用程序在 Windows 启动时最大化

Posted

技术标签:

【中文标题】强制 WPF 应用程序在 Windows 启动时最大化【英文标题】:Force WPF application to maximize on Windows startup 【发布时间】:2017-02-21 07:44:42 【问题描述】:

我有一个 WPF 应用程序,它通过 ClickOnce 安装在 Windows 10 Pro 上并使用 MahApps.Metro。

它设置为在 Windows 启动时使用没有密码的非管理员帐户启动。平板电脑模式已启用。

我希望应用程序全屏弹出以创建类似 kiosk 的体验,但是 应用程序在启动时会最小化。澄清一下,WindowState 已最大化,但 Windows 不显示它,而是显示开始屏幕。手动启动时会最大化全屏。

这是一些代码,但我想这更多的是配置问题而不是代码问题:

这是我设置开机启动的方式:

RegistryKey rkApp = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run", true);
string startPath = Environment.GetFolderPath(Environment.SpecialFolder.Programs)
                       + @"\Publisher\AppName.appref-ms";
rkApp.SetValue("AppName", startPath);

这是 MainWindow.xaml

<Controls:MetroWindow x:Class="AppName.MainWindow"
IgnoreTaskbarOnMaximize="True" ShowTitleBar="False" WindowStyle="None" WindowState="Maximized">
...
</Controls:MetroWindow>

【问题讨论】:

***.com/questions/3501151/… @Fabriziostellato 你指的问题是WinForms,OP使用的是WPF 我认为这个链接可能会有所帮助,***.com/questions/18721904/… 链接的问题无法处理 Windows 启动问题 【参考方案1】:

了解适用于 Windows 10 的 Kiosk 模式。

来自Set up a device for anyone to use (kiosk mode):

在 Windows 10 桌面版中轻松设置一次性设备 版本(专业版、企业版和教育版)。让自助服务终端设备运行 通用 Windows 应用,使用分配的访问权限功能。对于售货亭 设备(Windows 10 企业版或教育版)运行经典 Windows 应用程序,使用 Shell Launcher 将自定义用户界面设置为 外壳。

来自Assigned access (Industry 8.1):

管理员可以使用分配的访问权限将用户帐户限制为 访问单个应用程序。您可以使用分配的访问权限来设置 单功能设备,例如餐厅菜单或贸易展示 显示。

下表确定了可在每个 Windows 10 版本上用于创建展台设备的应用程序类型。

通用 Windows 应用是在通用 Windows 平台上构建的 (UWP),它在 Windows 8 中作为 Windows 运行时首次引入。 经典 Windows 应用程序使用经典 Windows 平台 (CWP) (例如,COM、Win32、WPF、WinForms 等)并且通常启动 使用 .EXE 或 .DLL 文件。

【讨论】:

我知道这一点,但感谢其他寻求答案的用户的良好概述。分配的访问权限不是一个选项,因为我有一个经典的 windows 应用程序并且企业版不可用。我希望有比 Shell Launcher 更简单的方法,但我可能需要研究一下。【参考方案2】:

您可以在 MainWindow.xaml.cs 中通过添加最大化的窗口状态来执行此操作。

public MainWindow()

    InitializeComponent();
    this.WindowState = WindowState.Maximized;

【讨论】:

OP 已经具有 XAML 等效项:WindowState="Maximized" windows启动时应该会弹出,怎么做?【参考方案3】:

解决方案(hack)是在启动时使用任务计划程序打开任何其他窗口(例如 powershell),在另一个窗口打开后,我们可以在 powershell 脚本中调用 Alt+Tab。

[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
[System.Windows.Forms.SendKeys]::SendWait("%TAB")

【讨论】:

多年后仍然对这个解决方案感到惊讶。谢谢微软。【参考方案4】:

在 ContentRendered 事件处理程序中设置 Window 状态:

protected override void OnStartup(StartupEventArgs e)
  
    Application.Current.MainWindow.ContentRendered += (s, a) => 
        Application.Current.MainWindow.WindowState = WindowState.Maximized;


【讨论】:

问题是 WindowState 已经最大化,但 Windows 不知何故决定不查看该程序。也许他们故意禁用了它。 所以问题不在于最大化,而是你的主窗口被隐藏了? 在启动时,Windows 仅显示开始屏幕,即使窗口状态已最大化。在其他情况下它工作得很好。

以上是关于强制 WPF 应用程序在 Windows 启动时最大化的主要内容,如果未能解决你的问题,请参考以下文章

如何强制WPF启动窗口到特定的屏幕?

如何强制 WPF 应用程序以管理员模式运行

Windows 快捷启动器(WPF)

System.Threading.dll 使 WPF 应用程序在 30 多秒内启动

强制重新加载 Windows 视频驱动程序。有可能吗?

WPF程序在Windows 7下应用Windows 8主题