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