Recently I had to replace the LCD in my ThinkPad L540 laptop. Since doing so, the display no longer works correctly under Windows. Interestingly, it works just fine under Linux (using the latest upstream kernel with the standard DRM drivers), and for anything that either uses VESA or UEFI graphics. Things work fine when I am using just an external display (although only when it's connected to the mini displayport, not the VGA output), and also when I'm using both if the external display has the same resolution and refresh rate as the internal one. Things also work just fine when Windows is booted in safe mode and when I have the Intel graphics driver uninstalled (which is _not_ a solution, as my whole reason for running Windows at all is gaming).
I've tried multiple versions (both the current version, which worked fine prior to the hardware change, and ffive previous versions) of the Intel HD Graphics driver, and all of them see the same issue. I don't know if it's related to this issue or not, but when I have an external display connected, I only see that display listed in device manager and the graphics settings, previously I would see both that and the internal display (as long as the lid was open).
The hardware itself is a single GPU system using just the integrated GPU (no switching/hybrid graphics), which reports as a HD 4600 series (the CPU is an i5-5310M). I've thrown everything I can think of at it from Linux, and the GPU itself appears to be in perfect condition, which leads me to believe the issue is with the driver. The new screen has identical timing characteristics to the old one (1920x1080@60Hz native resolution). Prior to swapping the display, I had the driver on Windows configured correctly to display this, and clone screens when an external monitor is plugged in (and I think that's why it works with an external monitor plugged in).
Based on past experience with almost identical issues on Linux with other GPU's (multiple years ago now), I think that the driver isn't parsing the EDID properly, and as such can't figure out the actual resolution for the display. Visually, it looks like the driver is writing frames at some low resolution (my guess would be either 640x480 or 800x600) into the GPU memory, while the GPU is expecting frames at 1920x1080 (the display's native resolution (or possibly the driver is writing frames at the right resolution, and the GPU is trying to do some sort of scaling trick with them). I'm working on trying to get a VNC server running on Windows (I've only got 8.1 Home edition, so RDP isn't an option) to see if I can figure anything out from there, but until then I can't get a screenshot without a camera, which I don't have available.