当应用程序作为服务运行时,未应用Windows10平面主题

hyrbngr7  于 2023-05-01  发布在  Windows
关注(0)|答案(1)|浏览(134)

下面的代码段示例化了一个包含一些标准控件的UserControl,并将其内容呈现为png

public void TrySavingUiAsPng()
{
    // tried with and without this two lines, no differences
    //System.Windows.Forms.Application.EnableVisualStyles();
    //System.Windows.Forms.Application.SetCompatibleTextRenderingDefault(false);

    var control = new MyTestUserControl();
    
    using (var bmp = new System.Drawing.Bitmap(300, 200))
    {
        control.DrawToBitmap(bmp, new Rectangle(0, 0, bmp.Width, bmp.Height));
        bmp.Save(tempFileName);
    }
}

在windows10机器上(windows10 enterprise 21H2),当交互完成时,ui具有经典的平面主题,生成的png看起来像这样:

我遇到的问题是,如果相同的代码作为服务运行(因此可能是在会话0中),ui看起来像“3d”,xp风格,好像没有应用平面windows主题。服务生成的png看起来像这样:

问:是否有一种方法可以确保在作为服务运行时,控件具有标准的windows10平面主题?
注解

  • 我不想与用户界面交互。最终目标是生成UI的PNG
  • 上面的例子是winforms,但同样的问题也发生在wpf和最有可能的标准win32控件上。

我尝试过但失败了

  • 将服务标记为“允许服务与桌面交互”
  • 使用用户而不是LocalSystem帐户
  • 已验证“主题”服务正在运行
e5njpo68

e5njpo681#

也许答案就在this microsoft article
由于会话0不再是用户会话,因此在会话0中运行的服务无法访问视频驱动程序。这意味着服务呈现图形的任何尝试都将失败
在没有GPU并且因此没有图形加速的情况下,系统缩放到旧的主题。这只是一个理论,相关的文献非常贫乏。

相关问题