|
@@ -90,6 +90,7 @@ bool DisplayServerWindows::has_feature(Feature p_feature) const {
|
|
|
case FEATURE_SWAP_BUFFERS:
|
|
|
case FEATURE_KEEP_SCREEN_ON:
|
|
|
case FEATURE_TEXT_TO_SPEECH:
|
|
|
+ case FEATURE_SCREEN_CAPTURE:
|
|
|
return true;
|
|
|
default:
|
|
|
return false;
|
|
@@ -631,6 +632,26 @@ int DisplayServerWindows::screen_get_dpi(int p_screen) const {
|
|
|
EnumDisplayMonitors(nullptr, nullptr, _MonitorEnumProcDpi, (LPARAM)&data);
|
|
|
return data.dpi;
|
|
|
}
|
|
|
+
|
|
|
+Color DisplayServerWindows::screen_get_pixel(const Point2i &p_position) const {
|
|
|
+ Point2i pos = p_position + _get_screens_origin();
|
|
|
+
|
|
|
+ POINT p;
|
|
|
+ p.x = pos.x;
|
|
|
+ p.y = pos.y;
|
|
|
+ if (win81p_LogicalToPhysicalPointForPerMonitorDPI) {
|
|
|
+ win81p_LogicalToPhysicalPointForPerMonitorDPI(0, &p);
|
|
|
+ }
|
|
|
+ HDC dc = GetDC(0);
|
|
|
+ COLORREF col = GetPixel(dc, p.x, p.y);
|
|
|
+ if (col != CLR_INVALID) {
|
|
|
+ return Color(float(col & 0x000000FF) / 256.0, float((col & 0x0000FF00) >> 8) / 256.0, float((col & 0x00FF0000) >> 16) / 256.0, 1.0);
|
|
|
+ }
|
|
|
+ ReleaseDC(NULL, dc);
|
|
|
+
|
|
|
+ return Color();
|
|
|
+}
|
|
|
+
|
|
|
float DisplayServerWindows::screen_get_refresh_rate(int p_screen) const {
|
|
|
_THREAD_SAFE_METHOD_
|
|
|
|
|
@@ -4023,6 +4044,7 @@ GetImmersiveUserColorSetPreferencePtr DisplayServerWindows::GetImmersiveUserColo
|
|
|
bool DisplayServerWindows::winink_available = false;
|
|
|
GetPointerTypePtr DisplayServerWindows::win8p_GetPointerType = nullptr;
|
|
|
GetPointerPenInfoPtr DisplayServerWindows::win8p_GetPointerPenInfo = nullptr;
|
|
|
+LogicalToPhysicalPointForPerMonitorDPIPtr DisplayServerWindows::win81p_LogicalToPhysicalPointForPerMonitorDPI = nullptr;
|
|
|
|
|
|
typedef enum _SHC_PROCESS_DPI_AWARENESS {
|
|
|
SHC_PROCESS_DPI_UNAWARE = 0,
|
|
@@ -4151,10 +4173,12 @@ DisplayServerWindows::DisplayServerWindows(const String &p_rendering_driver, Win
|
|
|
}
|
|
|
|
|
|
// Note: Windows Ink API for pen input, available on Windows 8+ only.
|
|
|
+ // Note: DPI conversion API, available on Windows 8.1+ only.
|
|
|
HMODULE user32_lib = LoadLibraryW(L"user32.dll");
|
|
|
if (user32_lib) {
|
|
|
win8p_GetPointerType = (GetPointerTypePtr)GetProcAddress(user32_lib, "GetPointerType");
|
|
|
win8p_GetPointerPenInfo = (GetPointerPenInfoPtr)GetProcAddress(user32_lib, "GetPointerPenInfo");
|
|
|
+ win81p_LogicalToPhysicalPointForPerMonitorDPI = (LogicalToPhysicalPointForPerMonitorDPIPtr)GetProcAddress(user32_lib, "LogicalToPhysicalPointForPerMonitorDPI");
|
|
|
|
|
|
winink_available = win8p_GetPointerType && win8p_GetPointerPenInfo;
|
|
|
}
|