C# WPF仅在某些硬件配置上在辅助屏幕上创建窗口

C# WPF仅在某些硬件配置上在辅助屏幕上创建窗口,c#,.net,wpf,windows,C#,.net,Wpf,Windows,我使用标准建议创建一个窗口并将其显示在辅助监视器上: 我使用以下方法获得可用屏幕: Screen[] availableScreens = Screen.AllScreens; 提取目标屏幕的工作区域(在我的情况下是第二个屏幕,而不是主屏幕): 创建窗口时,根据工作区域设置位置属性(在调用Show()之前): 关于窗口,还需要注意一些其他事项: 这是一个全屏窗口,旨在跨越整个秒 展示 它不是主应用程序窗口 它在任务栏中隐藏,旨在补充 主应用程序窗口 WindowState=WindowSta

我使用标准建议创建一个窗口并将其显示在辅助监视器上:

我使用以下方法获得可用屏幕:

Screen[] availableScreens = Screen.AllScreens;
提取目标屏幕的工作区域(在我的情况下是第二个屏幕,而不是主屏幕):

创建窗口时,根据工作区域设置位置属性(在调用Show()之前):

关于窗口,还需要注意一些其他事项:

  • 这是一个全屏窗口,旨在跨越整个秒 展示

  • 它不是主应用程序窗口

  • 它在任务栏中隐藏,旨在补充 主应用程序窗口

  • WindowState=WindowState.Maximized

  • ShowInTaskbar=“假”

  • WindowStyle=WindowStyle.None

  • 在Windows 10 Enterprise V 1809上运行

下面是我测试过的不同配置的概要,其中只有一个运行不正常:

  • 当我在带有两个1920x1080显示器的工作站上运行此设置时,显示比例为100%,工作正常
  • 当我在带有两个1920x1080显示器的工作站上运行此设置时,显示比例为150%,工作正常
  • 当我在连接了1920x1080显示器和辅助USB显示器(800x480)的工作站上运行此设置时,显示比例为100%,可以正常工作
  • 当我在连接了1920x1080显示器和辅助USB显示器(800x480)的工作站上运行此设置时,显示比例为150%,它可以工作
  • 当我在Microsoft Surface Go上运行此功能时,主Surface显示屏(1800x1200)和辅助USB显示屏(800x480)连接到Surface dock,100%显示缩放,它可以正常工作
  • 当我在Microsoft Surface Go上运行此功能时,主Surface显示屏(1800x1200)和辅助USB显示屏(800x480)连接到Surface dock,显示比例为150%,无法正常工作。相反,一旦调用Window.Show(),这将触发窗口重新定位到主显示(surface go屏幕)。我注意到了这一点,因为在调用window.Show()期间,我收到了窗口的LocationChanged事件,并看到宽度和高度属性已更新为曲面Go显示(1800x1200)的大小。但是,奇怪的是,即使窗口已移动,顶部和左侧属性也不会更新
从上面的案例中可以看出,这似乎是显示缩放+曲面Go的问题。在我的工作站上,我强制使用与Surface go相同的分辨率(1800x1200),并将显示比例设置为150%,但无法从Surface go复制问题

此外,我用另一个分辨率稍高(1024x600)的USB显示器进行了一些测试,发现同样的问题也发生了,只是在表面上,但这一次我需要在该配置中出现问题之前将显示器缩放到200%

我尝试了几件事,但都没有找到解决这个问题的办法:

  • 尝试了各种配置的dpiAware和dpiAware。这些更改了我在获取可用屏幕时接收到的坐标的缩放比例,但使用缩放/未缩放坐标对该问题没有影响

  • 更改显示缩放选项后重新启动Surface Go(根据显示设置中显示的“某些应用程序在您签字之前不会响应缩放更改”消息)

  • 尝试设置WindowState=WindowState。在加载事件之前和之后都最大化,并且都产生相同的结果

如果您有任何关于尝试的帮助或其他想法,我们将不胜感激,但不确定这是WPF、Windows 10还是Microsoft Surface Go问题

secondaryScreenWorkingArea = availableScreens[1].WorkingArea;
Left = secondaryScreenWorkingArea.Left;
Top = secondaryScreenWorkingArea.Top;
Width = secondaryScreenWorkingArea.Width;
Height = secondaryScreenWorkingArea.Height;