Powertoys: [FancyZones] Monitors connected to Surface docking station are not recognized

Created on 3 Sep 2020  ·  18Comments  ·  Source: microsoft/PowerToys

FancyZones Zones Editor applies new layout to all monitors instead of applying this new layout to the active monitor only. Cannot use different layouts for different monitors.

ℹ Computer information

  • PowerToys version: 0.21.1
  • PowerToy Utility: FancyZones
  • Running PowerToys as Admin: Yes (also when No)
  • Windows build number: 19041.450

📝 Provide detailed reproduction steps (if any)

  1. Press WIN+GRAVE (FancyZones Zones Editor) on monitor 1
  2. Select new layout

✔️ Expected result

New layout applied to monitor 1, layout of monitor 2 unchanged,

❌ Actual result

Both monitors have the new layout applied. Cannot create different layouts for different monitors.

A workaround is to use 'Allow zones to span across monitors, but this would require the creation of new multi-monitor layouts and makes all 'single monitor templates' unusable.

📷 Screenshots

N/A

Cost-Medium Issue-Bug Product-FancyZones Resolution-Fix-Committed

Most helpful comment

GetSystemMetrics = 3
GetMonitorInfo OK
EnumDisplayDevices OK:
    DeviceID = \\?\DISPLAY#LGD0555#4&5b5cba1&2&UID265988#{e6f07b5f-ee97-4a90-b076-33f57bf4eaa7}
    DeviceKey = \Registry\Machine\System\CurrentControlSet\Control\Class\{4d36e96e-e325-11ce-bfc1-08002be10318}\0001
    DeviceName = \\.\DISPLAY1\Monitor0
    DeviceString = Surface Display
GetMonitorInfo OK
EnumDisplayDevices OK:
    DeviceID = \\?\DISPLAY#LGD0555#4&5b5cba1&2&UID265988#{e6f07b5f-ee97-4a90-b076-33f57bf4eaa7}
    DeviceKey = \Registry\Machine\System\CurrentControlSet\Control\Class\{4d36e96e-e325-11ce-bfc1-08002be10318}\0001
    DeviceName = \\.\DISPLAY2\Monitor0
    DeviceString = Surface Display
GetMonitorInfo OK
EnumDisplayDevices OK:
    DeviceID = \\?\DISPLAY#LGD0555#4&5b5cba1&2&UID265988#{e6f07b5f-ee97-4a90-b076-33f57bf4eaa7}
    DeviceKey = \Registry\Machine\System\CurrentControlSet\Control\Class\{4d36e96e-e325-11ce-bfc1-08002be10318}\0001
    DeviceName = \\.\DISPLAY3\Monitor0
    DeviceString = Surface Display
EnumDisplayMonitors OK

WMI report:
Active: 1
WeekOfManufacture: 0
InstanceName: DISPLAY\LGD0555\4&5b5cba1&2&UID265988_0
YearOfManufacture: 2016
ManufacturerName: 76 71 68 0 0 0 0 0 0 0 0 0 0 0 0 0 
ProductCodeID: 48 53 53 53 0 0 0 0 0 0 0 0 0 0 0 0 
SerialNumberID: 50 54 56 52 51 53 54 49 55 0 0 0 0 0 0 0 
UserFriendlyName: 

Active: 1
WeekOfManufacture: 40
InstanceName: DISPLAY\DEL40E0\4&5b5cba1&2&UID200195_0
YearOfManufacture: 2015
ManufacturerName: 68 69 76 0 0 0 0 0 0 0 0 0 0 0 0 0 
ProductCodeID: 52 48 69 48 0 0 0 0 0 0 0 0 0 0 0 0 
SerialNumberID: 51 74 86 52 48 53 57 83 51 55 48 76 0 0 0 0 
UserFriendlyName: 68 69 76 76 32 85 80 50 53 49 54 68 0 

Active: 1
WeekOfManufacture: 41
InstanceName: DISPLAY\DEL40E0\4&5b5cba1&2&UID208387_0
YearOfManufacture: 2016
ManufacturerName: 68 69 76 0 0 0 0 0 0 0 0 0 0 0 0 0 
ProductCodeID: 52 48 69 48 0 0 0 0 0 0 0 0 0 0 0 0 
SerialNumberID: 84 89 80 82 51 54 65 65 52 52 55 76 0 0 0 0 
UserFriendlyName: 68 69 76 76 32 85 80 50 53 49 54 68 0 

Active: 1
WeekOfManufacture: 40
InstanceName: DISPLAY\DEL40E0\4&5b5cba1&2&UID216579_0
YearOfManufacture: 2015
ManufacturerName: 68 69 76 0 0 0 0 0 0 0 0 0 0 0 0 0 
ProductCodeID: 52 48 69 48 0 0 0 0 0 0 0 0 0 0 0 0 
SerialNumberID: 51 74 86 52 48 53 57 83 53 49 52 76 0 0 0 0 
UserFriendlyName: 68 69 76 76 32 85 80 50 53 49 54 68 0 

So, the first parts show identical ID's, the WMI report show different instance names and serial number (note that the second and fourth monitor have nearly identical serials, but are different.)

By the way, all three monitors are connected via the Surface Dock, which has only two (mini) DisplayPort connections. So, the third Dell monitor is connected to the DP-out port of the second monitor (Daisy chaining/MST). Looking at the DP Topology graph of the Intel Graphics Settings (Display>DisplayPort Topology), it looks like there is another MST-hub-like setup for the two DP connectors in the Dock, so can it be possible that all three monitors share the same graphics adapter port, somehow resulting in non-unique DeviceID's

image

All 18 comments

@RoL0NL
do you have two identical monitors? (same brand and same model)
Can you please upload the zone settings file?

"C:\Users\%USERNAME%\AppData\Local\Microsoft\PowerToys\FancyZones\zones-settings.json"

Rename it to .txt or zip, otherwise GitHub will not allow lo upload it.
Thanks.

I use three DELL UP2516D's on my Surface Pro 6 + Surface Dock. In my 'docked' setup (which I am using while this 'bug(?)' occurs), the internal Surface display is disabled.
zones-settings.txt

EDIT: To exclude a json 'corruption', I removed the .json (effectively resetting the zones) but the problem still occurs.

(Thank you for the fast responses by the way!)

@RoL0NL
the .json you uploaded, was before removing it?
The one you send me show the LG monitor that is the Surface monitor, plus three distinct Dell monitors plus a generic LOCALDISPLAY_2560_1440 that maybe associated with the bug.

Try quitting PowerToys (this step is important), delete the zone-settings.json file, restart PowerToys and apply the Priority Grid just to one Dell monitor. Then upload the new zone-settings.json file.
I need to check if LOCALDISPLAY_2560_1440 is recreated.

@RoL0NL
the .json you uploaded, was before removing it?

Indeed

The one you send me show the LG monitor that is the Surface monitor, plus three distinct Dell monitors plus a generic LOCALDISPLAY_2560_1440 that maybe associated with the bug.

Try quitting PowerToys (this step is important), delete the zone-settings.json file, restart PowerToys and apply the Priority Grid just to one Dell monitor. Then upload the new zone-settings.json file.
I need to check if LOCALDISPLAY_2560_1440 is recreated.
In my previous post-edit I forgot to close PowerToys before deleting the .json

Now I first close PowerToys, _then_ removed zone-settings.json, restarted PowerToys, opened the Zones Editor on my middle monitor and set the layout to 'Priority Grid'. The .json file now contains (this is the entire file):

{ "devices": [ { "device-id": "LGD0555#4&5b5cba1&2&UID265988_2560_1440_{AD908D4B-B867-4D18-AAEC-E939D13DF890}", "active-zoneset": { "uuid": "{21163A49-D0D7-4F55-80C5-4CB0ADB165D7}", "type": "priority-grid" }, "editor-show-spacing": true, "editor-spacing": 16, "editor-zone-count": 3 } ], "custom-zone-sets": [] }

The LocalDisplay is removed, but the Dell is recognized as 'LGD'! Note that I still used the docked setup with 3X Dell & internal display disabled and did not switch while performing the steps described above.

If I now set a '3 Rows' layout on my left monitor, the file contains (again, entire file):

{ "devices": [ { "device-id": "LGD0555#4&5b5cba1&2&UID265988_2560_1440_{AD908D4B-B867-4D18-AAEC-E939D13DF890}", "active-zoneset": { "uuid": "{10C98B4C-8A8E-4E9D-AC8C-57F9CB0062D5}", "type": "rows" }, "editor-show-spacing": true, "editor-spacing": 16, "editor-zone-count": 3 } ], "custom-zone-sets": [] }
For some reason, all three monitors are recognized as 'LGD...'. Possibly the Dell entries were from previous PowerToys versions.

Next step: Switch to 'PC Screen Only' (So, only internal Surface Display, power off the Dells) and set the layout to 3 columns:
{ "devices": [ { "device-id": "LGD0555#4&5b5cba1&2&UID265988_2560_1440_{AD908D4B-B867-4D18-AAEC-E939D13DF890}", "active-zoneset": { "uuid": "{10C98B4C-8A8E-4E9D-AC8C-57F9CB0062D5}", "type": "rows" }, "editor-show-spacing": true, "editor-spacing": 16, "editor-zone-count": 3 }, { "device-id": "LGD0555#4&5b5cba1&2&UID265988_2736_1824_{AD908D4B-B867-4D18-AAEC-E939D13DF890}", "active-zoneset": { "uuid": "{B1CD91D8-21BF-469B-AE88-48CF3863313D}", "type": "columns" }, "editor-show-spacing": true, "editor-spacing": 16, "editor-zone-count": 3 } ], "custom-zone-sets": [] }

You can see that the second entry corresponds to the internal display because of the screen resolution (2736x1824), but somehow the ID is equal to IDs of the Dells! As expected, the Internal display now shows a column layout, while all 3 Dells show a row layout. So, somehow the software sees the same monitor ID for all my 4 monitors.

To verify the ID's, I opened Device Manager, Monitors tab. The Surface Display shows a Device Instance Path of
DISPLAY\LGD0555\4&5b5cba1&2&UID265988
as found in the FancyZones config file. The Dells show unique IDs:
DISPLAY\DEL40E0\4&5b5cba1&2&UID200195
DISPLAY\DEL40E0\4&5b5cba1&2&UID216579
DISPLAY\DEL40E0\4&5b5cba1&2&UID265988

as found in the 'original' .json (before deleting it). So, Windows still recognizes the right ID's. I probably didn't have working monitors if these IDs were also wrong in Device Manager ;)

@RoL0NL
thanks you for all the testing. Initially I thought this could be a known issues where Windows is returning the same ID for all identical monitors, but it's not the case, it seems a bug in FZ.

@RoL0NL
can you please run this tool and report the output? (the tool creates a log file in the same folder where the .exe is)
Thanks.

monitor_info_report.zip

GetSystemMetrics = 3
GetMonitorInfo OK
EnumDisplayDevices OK:
    DeviceID = \\?\DISPLAY#LGD0555#4&5b5cba1&2&UID265988#{e6f07b5f-ee97-4a90-b076-33f57bf4eaa7}
    DeviceKey = \Registry\Machine\System\CurrentControlSet\Control\Class\{4d36e96e-e325-11ce-bfc1-08002be10318}\0001
    DeviceName = \\.\DISPLAY1\Monitor0
    DeviceString = Surface Display
GetMonitorInfo OK
EnumDisplayDevices OK:
    DeviceID = \\?\DISPLAY#LGD0555#4&5b5cba1&2&UID265988#{e6f07b5f-ee97-4a90-b076-33f57bf4eaa7}
    DeviceKey = \Registry\Machine\System\CurrentControlSet\Control\Class\{4d36e96e-e325-11ce-bfc1-08002be10318}\0001
    DeviceName = \\.\DISPLAY2\Monitor0
    DeviceString = Surface Display
GetMonitorInfo OK
EnumDisplayDevices OK:
    DeviceID = \\?\DISPLAY#LGD0555#4&5b5cba1&2&UID265988#{e6f07b5f-ee97-4a90-b076-33f57bf4eaa7}
    DeviceKey = \Registry\Machine\System\CurrentControlSet\Control\Class\{4d36e96e-e325-11ce-bfc1-08002be10318}\0001
    DeviceName = \\.\DISPLAY3\Monitor0
    DeviceString = Surface Display
EnumDisplayMonitors OK

WMI report:
Active: 1
WeekOfManufacture: 0
InstanceName: DISPLAY\LGD0555\4&5b5cba1&2&UID265988_0
YearOfManufacture: 2016
ManufacturerName: 76 71 68 0 0 0 0 0 0 0 0 0 0 0 0 0 
ProductCodeID: 48 53 53 53 0 0 0 0 0 0 0 0 0 0 0 0 
SerialNumberID: 50 54 56 52 51 53 54 49 55 0 0 0 0 0 0 0 
UserFriendlyName: 

Active: 1
WeekOfManufacture: 40
InstanceName: DISPLAY\DEL40E0\4&5b5cba1&2&UID200195_0
YearOfManufacture: 2015
ManufacturerName: 68 69 76 0 0 0 0 0 0 0 0 0 0 0 0 0 
ProductCodeID: 52 48 69 48 0 0 0 0 0 0 0 0 0 0 0 0 
SerialNumberID: 51 74 86 52 48 53 57 83 51 55 48 76 0 0 0 0 
UserFriendlyName: 68 69 76 76 32 85 80 50 53 49 54 68 0 

Active: 1
WeekOfManufacture: 41
InstanceName: DISPLAY\DEL40E0\4&5b5cba1&2&UID208387_0
YearOfManufacture: 2016
ManufacturerName: 68 69 76 0 0 0 0 0 0 0 0 0 0 0 0 0 
ProductCodeID: 52 48 69 48 0 0 0 0 0 0 0 0 0 0 0 0 
SerialNumberID: 84 89 80 82 51 54 65 65 52 52 55 76 0 0 0 0 
UserFriendlyName: 68 69 76 76 32 85 80 50 53 49 54 68 0 

Active: 1
WeekOfManufacture: 40
InstanceName: DISPLAY\DEL40E0\4&5b5cba1&2&UID216579_0
YearOfManufacture: 2015
ManufacturerName: 68 69 76 0 0 0 0 0 0 0 0 0 0 0 0 0 
ProductCodeID: 52 48 69 48 0 0 0 0 0 0 0 0 0 0 0 0 
SerialNumberID: 51 74 86 52 48 53 57 83 53 49 52 76 0 0 0 0 
UserFriendlyName: 68 69 76 76 32 85 80 50 53 49 54 68 0 

So, the first parts show identical ID's, the WMI report show different instance names and serial number (note that the second and fourth monitor have nearly identical serials, but are different.)

By the way, all three monitors are connected via the Surface Dock, which has only two (mini) DisplayPort connections. So, the third Dell monitor is connected to the DP-out port of the second monitor (Daisy chaining/MST). Looking at the DP Topology graph of the Intel Graphics Settings (Display>DisplayPort Topology), it looks like there is another MST-hub-like setup for the two DP connectors in the Dock, so can it be possible that all three monitors share the same graphics adapter port, somehow resulting in non-unique DeviceID's

image

@RoL0NL
thank you for the detailed report, it confirms it's the same issue reported in https://github.com/microsoft/PowerToys/issues/611
I'll close that one in favor of this one.

@RoL0NL Hello! :) We're currently investigating this bug and came up with a modified way of enumerating display devices. Could you please show the output of the updated monitor info report tool with the configuration you've described earlier?
monitor_info_report1.1.zip

Sure!

Report #1 v1.1:
GetMonitorInfo OK
    MonitorName = \\.\DISPLAY9
    DeviceID = \\?\DISPLAY#LGD0555#4&5b5cba1&2&UID265988#{e6f07b5f-ee97-4a90-b076-33f57bf4eaa7}
    DeviceKey = \Registry\Machine\System\CurrentControlSet\Control\Class\{4d36e96e-e325-11ce-bfc1-08002be10318}\0001
    DeviceName = \\.\DISPLAY9\Monitor0
    DeviceString = Surface Display
    Mirror = false
    Desktop/Active = false
GetMonitorInfo OK
    MonitorName = \\.\DISPLAY10
    DeviceID = \\?\DISPLAY#LGD0555#4&5b5cba1&2&UID265988#{e6f07b5f-ee97-4a90-b076-33f57bf4eaa7}
    DeviceKey = \Registry\Machine\System\CurrentControlSet\Control\Class\{4d36e96e-e325-11ce-bfc1-08002be10318}\0001
    DeviceName = \\.\DISPLAY10\Monitor0
    DeviceString = Surface Display
    Mirror = false
    Desktop/Active = false
GetMonitorInfo OK
    MonitorName = \\.\DISPLAY11
    DeviceID = \\?\DISPLAY#LGD0555#4&5b5cba1&2&UID265988#{e6f07b5f-ee97-4a90-b076-33f57bf4eaa7}
    DeviceKey = \Registry\Machine\System\CurrentControlSet\Control\Class\{4d36e96e-e325-11ce-bfc1-08002be10318}\0001
    DeviceName = \\.\DISPLAY11\Monitor0
    DeviceString = Surface Display
    Mirror = false
    Desktop/Active = false
EnumDisplayMonitors OK

Report #2 v1.1:
    DeviceID = PCI\VEN_8086&DEV_5917&SUBSYS_00261414&REV_07
    DeviceKey = \Registry\Machine\System\CurrentControlSet\Control\Video\{F6873EDE-E79E-11EA-8F6F-D1E000256671}\0000
    DeviceName = \\.\DISPLAY9
    DeviceString = Intel(R) UHD Graphics 620
    Mirror = false
    Desktop/Active = true
Associated devices:
Device #0:
    DeviceID = \\?\DISPLAY#LGD0555#4&5b5cba1&2&UID265988#{e6f07b5f-ee97-4a90-b076-33f57bf4eaa7}
    DeviceKey = \Registry\Machine\System\CurrentControlSet\Control\Class\{4d36e96e-e325-11ce-bfc1-08002be10318}\0001
    DeviceName = \\.\DISPLAY9\Monitor0
    DeviceString = Surface Display
    Mirror = false
    Desktop/Active = false
Device #1:
    DeviceID = \\?\DISPLAY#DEL40E0#4&5b5cba1&2&UID208387#{e6f07b5f-ee97-4a90-b076-33f57bf4eaa7}
    DeviceKey = \Registry\Machine\System\CurrentControlSet\Control\Class\{4d36e96e-e325-11ce-bfc1-08002be10318}\0003
    DeviceName = \\.\DISPLAY9\Monitor1
    DeviceString = Dell UP2516D (DP)
    Mirror = false
    Desktop/Active = true

    DeviceID = PCI\VEN_8086&DEV_5917&SUBSYS_00261414&REV_07
    DeviceKey = \Registry\Machine\System\CurrentControlSet\Control\Video\{F6873EDE-E79E-11EA-8F6F-D1E000256671}\0001
    DeviceName = \\.\DISPLAY10
    DeviceString = Intel(R) UHD Graphics 620
    Mirror = false
    Desktop/Active = true
Associated devices:
Device #0:
    DeviceID = \\?\DISPLAY#LGD0555#4&5b5cba1&2&UID265988#{e6f07b5f-ee97-4a90-b076-33f57bf4eaa7}
    DeviceKey = \Registry\Machine\System\CurrentControlSet\Control\Class\{4d36e96e-e325-11ce-bfc1-08002be10318}\0001
    DeviceName = \\.\DISPLAY10\Monitor0
    DeviceString = Surface Display
    Mirror = false
    Desktop/Active = false
Device #1:
    DeviceID = \\?\DISPLAY#DEL40E0#4&5b5cba1&2&UID200195#{e6f07b5f-ee97-4a90-b076-33f57bf4eaa7}
    DeviceKey = \Registry\Machine\System\CurrentControlSet\Control\Class\{4d36e96e-e325-11ce-bfc1-08002be10318}\0002
    DeviceName = \\.\DISPLAY10\Monitor1
    DeviceString = Dell UP2516D (DP)
    Mirror = false
    Desktop/Active = true

    DeviceID = PCI\VEN_8086&DEV_5917&SUBSYS_00261414&REV_07
    DeviceKey = \Registry\Machine\System\CurrentControlSet\Control\Video\{F6873EDE-E79E-11EA-8F6F-D1E000256671}\0002
    DeviceName = \\.\DISPLAY11
    DeviceString = Intel(R) UHD Graphics 620
    Mirror = false
    Desktop/Active = true
Associated devices:
Device #0:
    DeviceID = \\?\DISPLAY#LGD0555#4&5b5cba1&2&UID265988#{e6f07b5f-ee97-4a90-b076-33f57bf4eaa7}
    DeviceKey = \Registry\Machine\System\CurrentControlSet\Control\Class\{4d36e96e-e325-11ce-bfc1-08002be10318}\0001
    DeviceName = \\.\DISPLAY11\Monitor0
    DeviceString = Surface Display
    Mirror = false
    Desktop/Active = false
Device #1:
    DeviceID = \\?\DISPLAY#DEL40E0#4&5b5cba1&2&UID216579#{e6f07b5f-ee97-4a90-b076-33f57bf4eaa7}
    DeviceKey = \Registry\Machine\System\CurrentControlSet\Control\Class\{4d36e96e-e325-11ce-bfc1-08002be10318}\0004
    DeviceName = \\.\DISPLAY11\Monitor1
    DeviceString = Dell UP2516D (DP)
    Mirror = false
    Desktop/Active = true

@RoL0NL
thanks, that was very useful.

Note: even if https://github.com/microsoft/PowerToys/issues/1777 is very similar to this issue, they are not exactly the same.
In this case Windows does return the correct monitor ID when enumerating the associated devices of a given monitor, while for https://github.com/microsoft/PowerToys/issues/1777 it doesn't happen. We might fix the two issues in a different way (still evaluating the best approach).

@RoL0NL
if it's ok for you to install an unsigned build, we have a possible fix in the work.
I've attached the private build that may be able to detect the monitors correctly.
Before install it, quit PowerToys and delete the current FZ settings opening a command prompt and running:

del %localappdata%\Microsoft\PowerToys\FancyZones

PowerToysSetup-0.21.2-x64.zip

@enricogior
This does indeed work! Nice work!

Here is the new zones-settings.json by the way (after applying different types to all monitors). Thank you for the fix!

{
  "devices": [
    {
      "device-id": "DEL40E0#4&5b5cba1&2&UID216579_2560_1440_{AD908D4B-B867-4D18-AAEC-E939D13DF890}",
      "active-zoneset": {
        "uuid": "{D6BB313C-7F66-4D2E-AB0C-669B9B09A0BE}",
        "type": "priority-grid"
      },
      "editor-show-spacing": true,
      "editor-spacing": 16,
      "editor-zone-count": 3,
      "editor-sensitivity-radius": 20
    },
    {
      "device-id": "DEL40E0#4&5b5cba1&2&UID208387_2560_1440_{AD908D4B-B867-4D18-AAEC-E939D13DF890}",
      "active-zoneset": {
        "uuid": "{6A864A16-38FA-4D07-8A75-E4679CCDD9A2}",
        "type": "rows"
      },
      "editor-show-spacing": true,
      "editor-spacing": 16,
      "editor-zone-count": 3,
      "editor-sensitivity-radius": 20
    },
    {
      "device-id": "DEL40E0#4&5b5cba1&2&UID200195_2560_1440_{AD908D4B-B867-4D18-AAEC-E939D13DF890}",
      "active-zoneset": {
        "uuid": "{748841ED-164F-419D-9D96-D4BA40718278}",
        "type": "columns"
      },
      "editor-show-spacing": false,
      "editor-spacing": 16,
      "editor-zone-count": 3,
      "editor-sensitivity-radius": 20
    },
    {
      "device-id": "LGD0555#4&5b5cba1&2&UID265988_2736_1824_{AD908D4B-B867-4D18-AAEC-E939D13DF890}",
      "active-zoneset": {
        "uuid": "{0D389746-B5CB-468D-AAD3-D1996F7EC33E}",
        "type": "grid"
      },
      "editor-show-spacing": true,
      "editor-spacing": 16,
      "editor-zone-count": 4,
      "editor-sensitivity-radius": 20
    }
  ],
  "custom-zone-sets": []
}

@RoL0NL
great, we will add the fix to 0.25.
I'll keep the issue open until we release the fix.
Thanks.

@RoL0NL
one more thing, we are in the process to release 0.23 that doesn't contain this fix.
But the private build is from the 0.23 code base + the fix even if it's version number 0.21.2.
So you can skip to update to 0.23 and wait until 0.25 (end of October)

Great! Thank you for the extra info about the version numbers. Sorry for closing by the way ;)

Was this page helpful?
0 / 5 - 0 ratings