下面的代码段示例化了一个包含一些标准控件的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帐户
- 已验证“主题”服务正在运行
1条答案
按热度按时间e5njpo681#
也许答案就在this microsoft article
由于会话0不再是用户会话,因此在会话0中运行的服务无法访问视频驱动程序。这意味着服务呈现图形的任何尝试都将失败
在没有GPU并且因此没有图形加速的情况下,系统缩放到旧的主题。这只是一个理论,相关的文献非常贫乏。