当编译器没有SetProcessDpiAwareness()这个函数时...

发布时间 2023-08-02 18:03:31作者: Light-Chaser
#include <Shlobj.h>
int setdpi()
{
    // 定义一个函数指针类型
    typedef HRESULT (WINAPI *SetProcessDpiAwarenessFunc)(int value);

    // 加载 Shcore.dll
    HMODULE hModule = LoadLibrary("Shcore.dll");
    if (hModule == NULL)
    {
        // 加载失败,处理错误
        return -1;
    }

    // 获取 SetProcessDpiAwareness 函数指针
    SetProcessDpiAwarenessFunc pFunc = (SetProcessDpiAwarenessFunc)GetProcAddress(hModule, "SetProcessDpiAwareness");
    if (pFunc == NULL)
    {
        // 获取失败,处理错误
        FreeLibrary(hModule);
        return -1;
    }

    // 调用 SetProcessDpiAwareness 函数,设置进程为感知每个监视器模式
    //注:0: DPI unaware, 1: system DPI aware, 2: per-monitor DPI aware 
    HRESULT hr = pFunc(1);
    
    if (FAILED(hr))
    {
        // 调用失败,处理错误
        FreeLibrary(hModule);
        return -1;
    }

    // 释放 Shcore.dll
    FreeLibrary(hModule);

    //返回0,表示成功 
    return 0;
}

代码原理见注释(就是动态加载dll文件,算是一个简单地应用吧)