56 lines
2.0 KiB
C++
56 lines
2.0 KiB
C++
#include "Bootstrap/ApplicationBootstrapInternal.h"
|
|
|
|
namespace XCEngine::UI::Editor::BootstrapInternal {
|
|
|
|
void EnableDpiAwareness() {
|
|
const HMODULE user32 = GetModuleHandleW(L"user32.dll");
|
|
if (user32 != nullptr) {
|
|
using SetProcessDpiAwarenessContextFn = BOOL(WINAPI*)(DPI_AWARENESS_CONTEXT);
|
|
const auto setProcessDpiAwarenessContext =
|
|
reinterpret_cast<SetProcessDpiAwarenessContextFn>(
|
|
GetProcAddress(user32, "SetProcessDpiAwarenessContext"));
|
|
if (setProcessDpiAwarenessContext != nullptr) {
|
|
if (setProcessDpiAwarenessContext(DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2)) {
|
|
return;
|
|
}
|
|
if (GetLastError() == ERROR_ACCESS_DENIED) {
|
|
return;
|
|
}
|
|
if (setProcessDpiAwarenessContext(DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE)) {
|
|
return;
|
|
}
|
|
if (GetLastError() == ERROR_ACCESS_DENIED) {
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
|
|
const HMODULE shcore = LoadLibraryW(L"shcore.dll");
|
|
if (shcore != nullptr) {
|
|
using SetProcessDpiAwarenessFn = HRESULT(WINAPI*)(PROCESS_DPI_AWARENESS);
|
|
const auto setProcessDpiAwareness =
|
|
reinterpret_cast<SetProcessDpiAwarenessFn>(
|
|
GetProcAddress(shcore, "SetProcessDpiAwareness"));
|
|
if (setProcessDpiAwareness != nullptr) {
|
|
const HRESULT hr = setProcessDpiAwareness(PROCESS_PER_MONITOR_DPI_AWARE);
|
|
FreeLibrary(shcore);
|
|
if (SUCCEEDED(hr) || hr == E_ACCESSDENIED) {
|
|
return;
|
|
}
|
|
} else {
|
|
FreeLibrary(shcore);
|
|
}
|
|
}
|
|
|
|
if (user32 != nullptr) {
|
|
using SetProcessDPIAwareFn = BOOL(WINAPI*)();
|
|
const auto setProcessDPIAware =
|
|
reinterpret_cast<SetProcessDPIAwareFn>(GetProcAddress(user32, "SetProcessDPIAware"));
|
|
if (setProcessDPIAware != nullptr) {
|
|
setProcessDPIAware();
|
|
}
|
|
}
|
|
}
|
|
|
|
} // namespace XCEngine::UI::Editor::BootstrapInternal
|