Signed-off-by: Yuhang Zhao <2546789017@qq.com>
This commit is contained in:
Yuhang Zhao 2020-08-02 09:04:08 +08:00
parent 88cb48b306
commit 57e732835a
1 changed files with 74 additions and 106 deletions

View File

@ -26,9 +26,9 @@
#include <QDebug> #include <QDebug>
#include <QGuiApplication> #include <QGuiApplication>
#include <QLibrary>
#include <QMargins> #include <QMargins>
#include <QWindow> #include <QWindow>
#include <QtMath>
#if (QT_VERSION >= QT_VERSION_CHECK(5, 9, 0)) #if (QT_VERSION >= QT_VERSION_CHECK(5, 9, 0))
#include <QOperatingSystemVersion> #include <QOperatingSystemVersion>
#else #else
@ -40,7 +40,6 @@
#ifdef QT_WIDGETS_LIB #ifdef QT_WIDGETS_LIB
#include <QWidget> #include <QWidget>
#endif #endif
#include <QtMath>
#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0)) #if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
#include <qpa/qplatformnativeinterface.h> #include <qpa/qplatformnativeinterface.h>
#else #else
@ -136,32 +135,23 @@ bool isWin10OrGreator(const int ver)
_WNEF_WINAPI_##funcName m_lp##funcName = nullptr; _WNEF_WINAPI_##funcName m_lp##funcName = nullptr;
#endif #endif
#ifndef WNEF_SYSTEM_LIB_BEGIN
#define WNEF_SYSTEM_LIB_BEGIN(libName) \
{ \
QLibrary library(QString::fromUtf8(#libName));
#endif
#ifndef WNEF_SYSTEM_LIB_END
#define WNEF_SYSTEM_LIB_END }
#endif
#ifndef WNEF_RESOLVE_ERROR #ifndef WNEF_RESOLVE_ERROR
#ifdef _DEBUG #ifdef _DEBUG
#define WNEF_RESOLVE_ERROR(funcName, errMsg) Q_ASSERT_X(m_lp##funcName, __FUNCTION__, errMsg); #define WNEF_RESOLVE_ERROR(funcName) Q_ASSERT(m_lp##funcName);
#else #else
#define WNEF_RESOLVE_ERROR(funcName, errMsg) \ #define WNEF_RESOLVE_ERROR(funcName) \
if (!m_lp##funcName) { \ if (!m_lp##funcName) { \
qCritical().noquote() << "Failed to resolve symbol" << #funcName << ':' << errMsg; \ qCritical().noquote() << "Failed to resolve symbol" << #funcName; \
} }
#endif #endif
#endif #endif
#ifndef WNEF_RESOLVE_WINAPI #ifndef WNEF_RESOLVE_WINAPI
#define WNEF_RESOLVE_WINAPI(funcName) \ #define WNEF_RESOLVE_WINAPI(libName, funcName) \
if (!m_lp##funcName) { \ if (!m_lp##funcName) { \
m_lp##funcName = reinterpret_cast<_WNEF_WINAPI_##funcName>(library.resolve(#funcName)); \ m_lp##funcName = reinterpret_cast<_WNEF_WINAPI_##funcName>( \
WNEF_RESOLVE_ERROR(funcName, qUtf8Printable(library.errorString())) \ GetProcAddress(GetModuleHandleW(L#libName), #funcName)); \
WNEF_RESOLVE_ERROR(funcName) \
} }
#endif #endif
@ -422,25 +412,19 @@ void loadDPIFunctions()
resolved = true; resolved = true;
// Available since Windows 8.1 // Available since Windows 8.1
if (isWin8Point1OrGreator()) { if (isWin8Point1OrGreator()) {
WNEF_SYSTEM_LIB_BEGIN(SHCore) WNEF_RESOLVE_WINAPI(SHCore, GetDpiForMonitor)
WNEF_RESOLVE_WINAPI(GetDpiForMonitor) WNEF_RESOLVE_WINAPI(SHCore, GetProcessDpiAwareness)
WNEF_RESOLVE_WINAPI(GetProcessDpiAwareness)
WNEF_SYSTEM_LIB_END
} }
// Available since Windows 10, version 1607 (10.0.14393) // Available since Windows 10, version 1607 (10.0.14393)
if (isWin10OrGreator(14393)) { if (isWin10OrGreator(14393)) {
WNEF_SYSTEM_LIB_BEGIN(User32) WNEF_RESOLVE_WINAPI(User32, GetDpiForWindow)
WNEF_RESOLVE_WINAPI(GetDpiForWindow) WNEF_RESOLVE_WINAPI(User32, GetDpiForSystem)
WNEF_RESOLVE_WINAPI(GetDpiForSystem) WNEF_RESOLVE_WINAPI(User32, GetSystemMetricsForDpi)
WNEF_RESOLVE_WINAPI(GetSystemMetricsForDpi) WNEF_RESOLVE_WINAPI(User32, AdjustWindowRectExForDpi)
WNEF_RESOLVE_WINAPI(AdjustWindowRectExForDpi)
WNEF_SYSTEM_LIB_END
} }
// Available since Windows 10, version 1803 (10.0.17134) // Available since Windows 10, version 1803 (10.0.17134)
if (isWin10OrGreator(17134)) { if (isWin10OrGreator(17134)) {
WNEF_SYSTEM_LIB_BEGIN(User32) WNEF_RESOLVE_WINAPI(User32, GetSystemDpiForProcess)
WNEF_RESOLVE_WINAPI(GetSystemDpiForProcess)
WNEF_SYSTEM_LIB_END
} }
} }
@ -470,88 +454,72 @@ void ResolveWin32APIs()
} }
resolved = true; resolved = true;
// Available since Windows 2000. // Available since Windows 2000.
WNEF_SYSTEM_LIB_BEGIN(User32) WNEF_RESOLVE_WINAPI(User32, OffsetRect)
WNEF_RESOLVE_WINAPI(OffsetRect) WNEF_RESOLVE_WINAPI(User32, GetWindowDC)
WNEF_RESOLVE_WINAPI(GetWindowDC) WNEF_RESOLVE_WINAPI(User32, GetDCEx)
WNEF_RESOLVE_WINAPI(GetDCEx) WNEF_RESOLVE_WINAPI(User32, AdjustWindowRectEx)
WNEF_RESOLVE_WINAPI(AdjustWindowRectEx) WNEF_RESOLVE_WINAPI(User32, EndPaint)
WNEF_RESOLVE_WINAPI(EndPaint) WNEF_RESOLVE_WINAPI(User32, BeginPaint)
WNEF_RESOLVE_WINAPI(BeginPaint) WNEF_RESOLVE_WINAPI(User32, FillRect)
WNEF_RESOLVE_WINAPI(FillRect) WNEF_RESOLVE_WINAPI(User32, GetWindowInfo)
WNEF_RESOLVE_WINAPI(GetWindowInfo) WNEF_RESOLVE_WINAPI(User32, IsWindow)
WNEF_RESOLVE_WINAPI(IsWindow) WNEF_RESOLVE_WINAPI(User32, SetWindowRgn)
WNEF_RESOLVE_WINAPI(SetWindowRgn) WNEF_RESOLVE_WINAPI(User32, InvalidateRect)
WNEF_RESOLVE_WINAPI(InvalidateRect) WNEF_RESOLVE_WINAPI(User32, UpdateWindow)
WNEF_RESOLVE_WINAPI(UpdateWindow) WNEF_RESOLVE_WINAPI(User32, SetWindowPos)
WNEF_RESOLVE_WINAPI(SetWindowPos) WNEF_RESOLVE_WINAPI(User32, SendMessageW)
WNEF_RESOLVE_WINAPI(SendMessageW) WNEF_RESOLVE_WINAPI(User32, GetDesktopWindow)
WNEF_RESOLVE_WINAPI(GetDesktopWindow) WNEF_RESOLVE_WINAPI(User32, GetAncestor)
WNEF_RESOLVE_WINAPI(GetAncestor) WNEF_RESOLVE_WINAPI(User32, DefWindowProcW)
WNEF_RESOLVE_WINAPI(DefWindowProcW) WNEF_RESOLVE_WINAPI(User32, SetLayeredWindowAttributes)
WNEF_RESOLVE_WINAPI(SetLayeredWindowAttributes) WNEF_RESOLVE_WINAPI(User32, MoveWindow)
WNEF_RESOLVE_WINAPI(MoveWindow) WNEF_RESOLVE_WINAPI(User32, IsZoomed)
WNEF_RESOLVE_WINAPI(IsZoomed) WNEF_RESOLVE_WINAPI(User32, IsIconic)
WNEF_RESOLVE_WINAPI(IsIconic) WNEF_RESOLVE_WINAPI(User32, GetSystemMetrics)
WNEF_RESOLVE_WINAPI(GetSystemMetrics) WNEF_RESOLVE_WINAPI(User32, GetDC)
WNEF_RESOLVE_WINAPI(GetDC) WNEF_RESOLVE_WINAPI(User32, ReleaseDC)
WNEF_RESOLVE_WINAPI(ReleaseDC) WNEF_RESOLVE_WINAPI(User32, RedrawWindow)
WNEF_RESOLVE_WINAPI(RedrawWindow) WNEF_RESOLVE_WINAPI(User32, GetClientRect)
WNEF_RESOLVE_WINAPI(GetClientRect) WNEF_RESOLVE_WINAPI(User32, GetWindowRect)
WNEF_RESOLVE_WINAPI(GetWindowRect) WNEF_RESOLVE_WINAPI(User32, ScreenToClient)
WNEF_RESOLVE_WINAPI(ScreenToClient) WNEF_RESOLVE_WINAPI(User32, EqualRect)
WNEF_RESOLVE_WINAPI(EqualRect) #if defined(WIN64) || defined(_WIN64)
#ifdef Q_PROCESSOR_X86_64
// These functions only exist in 64 bit User32.dll // These functions only exist in 64 bit User32.dll
WNEF_RESOLVE_WINAPI(GetWindowLongPtrW) WNEF_RESOLVE_WINAPI(User32, GetWindowLongPtrW)
WNEF_RESOLVE_WINAPI(SetWindowLongPtrW) WNEF_RESOLVE_WINAPI(User32, SetWindowLongPtrW)
WNEF_RESOLVE_WINAPI(GetClassLongPtrW) WNEF_RESOLVE_WINAPI(User32, GetClassLongPtrW)
WNEF_RESOLVE_WINAPI(SetClassLongPtrW) WNEF_RESOLVE_WINAPI(User32, SetClassLongPtrW)
#else #else
WNEF_RESOLVE_WINAPI(GetWindowLongW) WNEF_RESOLVE_WINAPI(User32, GetWindowLongW)
WNEF_RESOLVE_WINAPI(SetWindowLongW) WNEF_RESOLVE_WINAPI(User32, SetWindowLongW)
WNEF_RESOLVE_WINAPI(GetClassLongW) WNEF_RESOLVE_WINAPI(User32, GetClassLongW)
WNEF_RESOLVE_WINAPI(SetClassLongW) WNEF_RESOLVE_WINAPI(User32, SetClassLongW)
#endif #endif
WNEF_RESOLVE_WINAPI(FindWindowW) WNEF_RESOLVE_WINAPI(User32, FindWindowW)
WNEF_RESOLVE_WINAPI(MonitorFromWindow) WNEF_RESOLVE_WINAPI(User32, MonitorFromWindow)
WNEF_RESOLVE_WINAPI(GetMonitorInfoW) WNEF_RESOLVE_WINAPI(User32, GetMonitorInfoW)
WNEF_SYSTEM_LIB_END WNEF_RESOLVE_WINAPI(Gdi32, GetDeviceCaps)
WNEF_SYSTEM_LIB_BEGIN(Gdi32) WNEF_RESOLVE_WINAPI(Gdi32, CreateSolidBrush)
WNEF_RESOLVE_WINAPI(GetDeviceCaps) WNEF_RESOLVE_WINAPI(Gdi32, DeleteObject)
WNEF_RESOLVE_WINAPI(CreateSolidBrush) WNEF_RESOLVE_WINAPI(Gdi32, GetStockObject)
WNEF_RESOLVE_WINAPI(DeleteObject) WNEF_RESOLVE_WINAPI(Gdi32, CreateRectRgnIndirect)
WNEF_RESOLVE_WINAPI(GetStockObject)
WNEF_RESOLVE_WINAPI(CreateRectRgnIndirect)
WNEF_SYSTEM_LIB_END
// Available since Windows XP. // Available since Windows XP.
WNEF_SYSTEM_LIB_BEGIN(Shell32) WNEF_RESOLVE_WINAPI(Shell32, SHAppBarMessage)
WNEF_RESOLVE_WINAPI(SHAppBarMessage) WNEF_RESOLVE_WINAPI(Kernel32, GetCurrentProcess)
WNEF_SYSTEM_LIB_END
WNEF_SYSTEM_LIB_BEGIN(Kernel32)
WNEF_RESOLVE_WINAPI(GetCurrentProcess)
WNEF_SYSTEM_LIB_END
// Available since Windows Vista. // Available since Windows Vista.
WNEF_SYSTEM_LIB_BEGIN(User32) WNEF_RESOLVE_WINAPI(User32, IsProcessDPIAware)
WNEF_RESOLVE_WINAPI(IsProcessDPIAware) WNEF_RESOLVE_WINAPI(Dwmapi, DwmGetWindowAttribute)
WNEF_SYSTEM_LIB_END WNEF_RESOLVE_WINAPI(Dwmapi, DwmIsCompositionEnabled)
WNEF_SYSTEM_LIB_BEGIN(Dwmapi) WNEF_RESOLVE_WINAPI(Dwmapi, DwmExtendFrameIntoClientArea)
WNEF_RESOLVE_WINAPI(DwmGetWindowAttribute) WNEF_RESOLVE_WINAPI(Dwmapi, DwmSetWindowAttribute)
WNEF_RESOLVE_WINAPI(DwmIsCompositionEnabled) WNEF_RESOLVE_WINAPI(Dwmapi, DwmDefWindowProc)
WNEF_RESOLVE_WINAPI(DwmExtendFrameIntoClientArea) WNEF_RESOLVE_WINAPI(UxTheme, IsThemeActive)
WNEF_RESOLVE_WINAPI(DwmSetWindowAttribute) WNEF_RESOLVE_WINAPI(UxTheme, BufferedPaintSetAlpha)
WNEF_RESOLVE_WINAPI(DwmDefWindowProc) WNEF_RESOLVE_WINAPI(UxTheme, EndBufferedPaint)
WNEF_SYSTEM_LIB_END WNEF_RESOLVE_WINAPI(UxTheme, BeginBufferedPaint)
WNEF_SYSTEM_LIB_BEGIN(UxTheme)
WNEF_RESOLVE_WINAPI(IsThemeActive)
WNEF_RESOLVE_WINAPI(BufferedPaintSetAlpha)
WNEF_RESOLVE_WINAPI(EndBufferedPaint)
WNEF_RESOLVE_WINAPI(BeginBufferedPaint)
WNEF_SYSTEM_LIB_END
// Available since Windows 7. // Available since Windows 7.
#if 0 #if 0
WNEF_SYSTEM_LIB_BEGIN(D2D1) WNEF_RESOLVE_WINAPI(D2D1, D2D1CreateFactory)
WNEF_RESOLVE_WINAPI(D2D1CreateFactory)
WNEF_SYSTEM_LIB_END
#endif #endif
loadDPIFunctions(); loadDPIFunctions();
} }