diff --git a/include/MaaFramework/MaaDef.h b/include/MaaFramework/MaaDef.h index f0eff90a0..1be97c972 100644 --- a/include/MaaFramework/MaaDef.h +++ b/include/MaaFramework/MaaDef.h @@ -176,7 +176,7 @@ enum MaaWin32ControllerTypeEnum MaaWin32ControllerType_Key_SendMessage = 1 << 8, MaaWin32ControllerType_Key_Mask = 0xFF00, - MaaWin32ControllerType_Screencap_HWND = 1 << 16, + MaaWin32ControllerType_Screencap_GDI = 1 << 16, MaaWin32ControllerType_Screencap_Mask = 0xFF0000, }; typedef void* MaaWin32Hwnd; diff --git a/sample/cpp/main.cpp b/sample/cpp/main.cpp index ab9be390f..9f30f6976 100644 --- a/sample/cpp/main.cpp +++ b/sample/cpp/main.cpp @@ -83,7 +83,7 @@ MaaControllerHandle create_adb_controller() MaaControllerHandle create_win32_controller() { auto hwnd = MaaToolKitGetCursorWindow(); - auto type = MaaWin32ControllerType_Touch_SendMessage | MaaWin32ControllerType_Screencap_HWND; + auto type = MaaWin32ControllerType_Touch_SendMessage | MaaWin32ControllerType_Screencap_GDI; return MaaWin32ControllerCreate(hwnd, type, nullptr, nullptr); } diff --git a/source/MaaWin32ControlUnit/API/Win32ControlUnitAPI.cpp b/source/MaaWin32ControlUnit/API/Win32ControlUnitAPI.cpp index 5dafd0102..3c431ae06 100644 --- a/source/MaaWin32ControlUnit/API/Win32ControlUnitAPI.cpp +++ b/source/MaaWin32ControlUnit/API/Win32ControlUnitAPI.cpp @@ -3,7 +3,7 @@ #include "Base/UnitBase.h" #include "Input/SendMessageInput.h" #include "Manager/ControlUnitMgr.h" -#include "Screencap/HwndScreencap.h" +#include "Screencap/GdiScreencap.h" #include "Utils/Logger.h" #include "Utils/SafeWindows.hpp" @@ -48,9 +48,9 @@ MaaControlUnitHandle MaaWin32ControlUnitCreate( // } switch (screencap_type) { - case MaaWin32ControllerType_Screencap_HWND: - LogInfo << "screencap_type: HWND"; - screencap_unit = std::make_shared(h_wnd); + case MaaWin32ControllerType_Screencap_GDI: + LogInfo << "screencap_type: GDI"; + screencap_unit = std::make_shared(h_wnd); break; default: diff --git a/source/MaaWin32ControlUnit/Screencap/HwndScreencap.cpp b/source/MaaWin32ControlUnit/Screencap/GDIScreencap.cpp similarity index 73% rename from source/MaaWin32ControlUnit/Screencap/HwndScreencap.cpp rename to source/MaaWin32ControlUnit/Screencap/GDIScreencap.cpp index 52d2037ae..c87492ee2 100644 --- a/source/MaaWin32ControlUnit/Screencap/HwndScreencap.cpp +++ b/source/MaaWin32ControlUnit/Screencap/GDIScreencap.cpp @@ -1,4 +1,4 @@ -#include "HwndScreencap.h" +#include "GdiScreencap.h" #include @@ -6,45 +6,20 @@ MAA_CTRL_UNIT_NS_BEGIN -double get_window_screen_scale() -{ -#ifdef _WIN32_WINNT_WIN10 - //需要win10 1607以上版本 - double screen_scale = GetDpiForWindow(GetDesktopWindow()) / 96.0; -#else - HWND desktop_hwnd = GetDesktopWindow(); - HMONITOR monitor_handle = MonitorFromWindow(desktop_hwnd, MONITOR_DEFAULTTONEAREST); - - MONITORINFOEX miex; - miex.cbSize = sizeof(miex); - GetMonitorInfo(monitor_handle, &miex); - int screen_x_logical = (miex.rcMonitor.right - miex.rcMonitor.left); - - DEVMODE dm; - dm.dmSize = sizeof(dm); - dm.dmDriverExtra = 0; - EnumDisplaySettings(miex.szDevice, ENUM_CURRENT_SETTINGS, &dm); - int screen_x_physical = dm.dmPelsWidth; - - double screen_scale = ((double)screen_x_physical / (double)screen_x_logical); -#endif - return screen_scale; -} - -std::optional HwndScreencap::screencap() +std::optional GdiScreencap::screencap() { if (!hwnd_) { LogError << "hwnd_ is nullptr"; return std::nullopt; } - RECT rect; + RECT rect { 0 }; if (!GetClientRect(hwnd_, &rect)) { LogError << "GetClientRect failed, error code: " << GetLastError(); return std::nullopt; } - double screen_scale = get_window_screen_scale(); + double screen_scale = window_screen_scale(); int width = static_cast(screen_scale * (rect.right - rect.left)); int height = static_cast(screen_scale * (rect.bottom - rect.top)); @@ -107,4 +82,33 @@ std::optional HwndScreencap::screencap() return mat; } +double GdiScreencap::window_screen_scale() +{ + // TODO: 处理多显示器不同 DPI 的情况 + +#ifndef MAA_WIN32_COMPATIBLE + + constexpr double kStandardDPI = 96.0; + // 运行期需要 Win10 1607 以上版本 + return GetDpiForWindow(GetDesktopWindow()) / kStandardDPI; + +#else + + HMONITOR monitor_handle = MonitorFromWindow(GetDesktopWindow(), MONITOR_DEFAULTTONEAREST); + + MONITORINFOEX miex { 0 }; + miex.cbSize = sizeof(miex); + GetMonitorInfo(monitor_handle, &miex); + LONG screen_x_logical = miex.rcMonitor.right - miex.rcMonitor.left; + + DEVMODE dm { 0 }; + dm.dmSize = sizeof(dm); + EnumDisplaySettings(miex.szDevice, ENUM_CURRENT_SETTINGS, &dm); + DWORD screen_x_physical = dm.dmPelsWidth; + + return static_cast(screen_x_physical) / static_cast(screen_x_logical); + +#endif +} + MAA_CTRL_UNIT_NS_END diff --git a/source/MaaWin32ControlUnit/Screencap/HwndScreencap.h b/source/MaaWin32ControlUnit/Screencap/GdiScreencap.h similarity index 63% rename from source/MaaWin32ControlUnit/Screencap/HwndScreencap.h rename to source/MaaWin32ControlUnit/Screencap/GdiScreencap.h index c68badd31..1df7d6369 100644 --- a/source/MaaWin32ControlUnit/Screencap/HwndScreencap.h +++ b/source/MaaWin32ControlUnit/Screencap/GdiScreencap.h @@ -7,16 +7,18 @@ MAA_CTRL_UNIT_NS_BEGIN -class HwndScreencap : public ScreencapBase +class GdiScreencap : public ScreencapBase { public: - HwndScreencap(HWND hwnd) : hwnd_(hwnd) {} - virtual ~HwndScreencap() override = default; + GdiScreencap(HWND hwnd) : hwnd_(hwnd) {} + virtual ~GdiScreencap() override = default; public: // from TouchInputBase virtual std::optional screencap() override; private: + double window_screen_scale(); + HWND hwnd_; };