#include "mainwindow.h"
#include
#include
#include
#ifdef Q_OS_WIN
#include <windows.h>
// 定义必要的常量和函数类型
typedef enum _PROCESS_DPI_AWARENESS {
PROCESS_DPI_UNAWARE = 0,
PROCESS_SYSTEM_DPI_AWARE = 1,
PROCESS_PER_MONITOR_DPI_AWARE = 2
} PROCESS_DPI_AWARENESS;
typedef enum _DPI_AWARENESS_CONTEXT {
DPI_AWARENESS_CONTEXT_UNAWARE = -1,
DPI_AWARENESS_CONTEXT_SYSTEM_AWARE = -2,
DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE = -3,
DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2 = -4
} DPI_AWARENESS_CONTEXT;
// 设置DPI为系统处理(不依赖shellscalingapi.h)
void forceSystemDPIScaling()
{
// 尝试使用SetProcessDpiAwarenessContext (Windows 10 1703+)
HMODULE user32 = LoadLibraryA("user32.dll");
if (user32) {
// 定义函数指针类型
typedef BOOL (WINAPI *SetProcessDpiAwarenessContextFunc)(DPI_AWARENESS_CONTEXT);
SetProcessDpiAwarenessContextFunc pFunc =
(SetProcessDpiAwarenessContextFunc)GetProcAddress(user32, "SetProcessDpiAwarenessContext");
if (pFunc) {
// 关键:让系统处理DPI缩放
pFunc(DPI_AWARENESS_CONTEXT_UNAWARE);
qDebug() << "Set DPI awareness context to UNAWARE";
FreeLibrary(user32);
return;
}
FreeLibrary(user32);
}
// 尝试使用SetProcessDpiAwareness (Windows 8.1+)
HMODULE shcore = LoadLibraryA("Shcore.dll");
if (shcore) {
typedef HRESULT (WINAPI *SetProcessDpiAwarenessFunc)(PROCESS_DPI_AWARENESS);
SetProcessDpiAwarenessFunc pFunc =
(SetProcessDpiAwarenessFunc)GetProcAddress(shcore, "SetProcessDpiAwareness");
if (pFunc) {
pFunc(PROCESS_DPI_UNAWARE);
qDebug() << "Set process DPI awareness to UNAWARE";
FreeLibrary(shcore);
return;
}
FreeLibrary(shcore);
}
// 最后回退:不调用SetProcessDPIAware(),因为我们要的是未感知
qDebug() << "Using default DPI handling (system managed)";
}
#endif
int main(int argc, char *argv[])
{
#ifdef Q_OS_WIN
// 设置DPI为系统处理
forceSystemDPIScaling();
#endif
// 完全禁用Qt的DPI处理
QCoreApplication::setAttribute(Qt::AA_DisableHighDpiScaling);
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}