I believe win32 widgetset has a small mistake in the ANSI part in its GetMonitorInfo procedure:
//\lcl\interfaces\win32\win32winapi.inc
function TWin32WidgetSet.GetMonitorInfo(hMonitor: HMONITOR; lpmi: LCLType.PMonitorInfo): Boolean;
var
LocalInfo: TMonitorInfoExW;
begin
if (lpmi <> nil) and (lpmi^.cbSize >= SizeOf(TMonitorInfoEx)) then
begin
if UnicodeEnabledOS then
begin
LocalInfo.cbSize := SizeOf(TMonitorInfoExW);
Result := MultiMon.GetMonitorInfo(hMonitor, @LocalInfo);
lpmi^.rcMonitor := LocalInfo.rcMonitor;
lpmi^.rcWork := LocalInfo.rcWork;
lpmi^.dwFlags := LocalInfo.dwFlags;
PMonitorInfoEx(lpmi)^.szDevice := UTF16ToUTF8(LocalInfo.szDevice);
end
else begin
PMonitorInfoEx(lpmi)^.szDevice := AnsiToUtf8(PMonitorInfoEx(lpmi)^.szDevice);
Result := True;
end;
end
else
Result := MultiMon.GetMonitorInfo(hMonitor, LPMonitorInfo(lpmi));
end;
It misses a call to MultiMon.GetMonitorInfo as marked bellow:
function TWin32WidgetSet.GetMonitorInfo(hMonitor: HMONITOR; lpmi: LCLType.PMonitorInfo): Boolean;
var
LocalInfo: TMonitorInfoExW;
begin
if (lpmi <> nil) and (lpmi^.cbSize >= SizeOf(TMonitorInfoEx)) then
begin
if UnicodeEnabledOS then
begin
LocalInfo.cbSize := SizeOf(TMonitorInfoExW);
Result := MultiMon.GetMonitorInfo(hMonitor, @LocalInfo);
lpmi^.rcMonitor := LocalInfo.rcMonitor;
lpmi^.rcWork := LocalInfo.rcWork;
lpmi^.dwFlags := LocalInfo.dwFlags;
PMonitorInfoEx(lpmi)^.szDevice := UTF16ToUTF8(LocalInfo.szDevice);
end
else begin
Result := MultiMon.GetMonitorInfo(hMonitor, PMonitorInfo(lpmi));
PMonitorInfoEx(lpmi)^.szDevice := AnsiToUTF8(PMonitorInfoExA(lpmi)^.szDevice);
Result := True;
end;
end
else
Result := MultiMon.GetMonitorInfo(hMonitor, LPMonitorInfo(lpmi));
end;
I don't know about Linux.