double DipToZoom(_In_ int dip)
{
double dRet = 1.0;
switch (dip)
{
case 96:
dRet = 1.00;
break;
case 120:
dRet = 1.25;
break;
case 144:
dRet = 1.50;
break;
case 192:
dRet = 2.0;
break;
default:
dRet = 1.00;
}
return dRet;
}
VOID GetProcessZoom(_Out_ double& xZoom, _Out_ double& yZoom)
{
HDC desktopDc = ::GetDC(NULL);
xZoom = yZoom = 1.00;
do
{
if (NULL == desktopDc) break;
xZoom = DipToZoom(::GetDeviceCaps(desktopDc, LOGPIXELSX));
yZoom = DipToZoom(::GetDeviceCaps(desktopDc, LOGPIXELSY));
::ReleaseDC(NULL, desktopDc);
} while (0);
}
#pragma once
#ifndef __SHCORE_H__
#define __SHCORE_H__
#include <wtypes.h>
#define SHCORE_NAME_A "Shcore.dll"
#define SHCORE_NAME_W L"Shcore.dll"
#define SetProcessDpiAwareness_NAME_A "SetProcessDpiAwareness"
#define GetProcessDpiAwareness_NAME_A "GetProcessDpiAwareness"
typedef enum {
PROCESS_DPI_UNAWARE = 0,
PROCESS_SYSTEM_DPI_AWARE = 1,
PROCESS_PER_MONITOR_DPI_AWARE = 2,
}E_PROCESS_DPI_AWARENESS;
typedef
HRESULT
(WINAPI* SetProcessDpiAwareness_T)(
_In_ E_PROCESS_DPI_AWARENESS value);
typedef
HRESULT
(WINAPI* GetProcessDpiAwareness_T)(
_In_opt_ HANDLE hprocess,
_Out_ E_PROCESS_DPI_AWARENESS *value);
class Shcore
{
public:
static HMODULE GetModuleHandle();
static SetProcessDpiAwareness_T SetProcessDpiAwareness();
static GetProcessDpiAwareness_T GetProcessDpiAwareness();
};
#endif
#include "Shcore.h"
HMODULE Shcore::GetModuleHandle()
{
static HMODULE s_hShcore = NULL;
if (NULL == s_hShcore)
{
s_hShcore = ::GetModuleHandleW(SHCORE_NAME_W);
}
return s_hShcore;
}
SetProcessDpiAwareness_T Shcore::SetProcessDpiAwareness()
{
return (SetProcessDpiAwareness_T)::GetProcAddress(GetModuleHandle(), SetProcessDpiAwareness_NAME_A);
}
GetProcessDpiAwareness_T Shcore::GetProcessDpiAwareness()
{
return (GetProcessDpiAwareness_T)::GetProcAddress(GetModuleHandle(), GetProcessDpiAwareness_NAME_A);
}
HRESULT SetCurProDipAwareness(_In_ E_PROCESS_DPI_AWARENESS value)
{
HRESULT hr = S_OK;
static SetProcessDpiAwareness_T s_SetProcessDpiAwareness = NULL;
if (NULL == s_SetProcessDpiAwareness)
{
s_SetProcessDpiAwareness = Shcore::SetProcessDpiAwareness();
}
if (NULL != s_SetProcessDpiAwareness)
{
hr = s_SetProcessDpiAwareness(value);
}
return hr;
}
HRESULT GetCurProDpiAwareness(_Out_ E_PROCESS_DPI_AWARENESS& value)
{
HRESULT hr = S_OK;
static GetProcessDpiAwareness_T s_GetProcessDpiAwareness = NULL;
if (NULL == s_GetProcessDpiAwareness)
{
s_GetProcessDpiAwareness = Shcore::GetProcessDpiAwareness();
}
if (NULL != s_GetProcessDpiAwareness)
{
hr = s_GetProcessDpiAwareness(::GetCurrentProcess(),&value);
}
return hr;
}