- Я пишу программу захвата экрана, которая требует GetWindowDC, GetWindowRect, DwmGetWindowAttribute (DWMWA_EXTENDED_FRAME_BOUNDS), PrintWindow и других функций.Так как некоторые приложения Windows, такие как Calculator, имеют свойства, такие как ws_ex_noredirectionbitmap, размер HDC не может быть получен из GetWindowDC
- , поэтому я переориентировал свое внимание на GetWindowRect в попытке получить размер HDC через GetDeviceCaps (HORZRES / VERTRES / DESKTOPHORZRES / D/ LOGPIXELSX / LOGPIXELSY).С моим компьютером система dpi установлена на 150%.вызывая GetProcessDpiAwareness для целевого процесса и моего собственного процесса, я использую следующую функцию для получения: GetWindowRect (target_hwnd), GetWindowDC (target_hwnd) -> GetCurrentObject (OBJ_BITMAP) -> GetObject
dpi осведомлен (target_proc: 0, local_proc: 0)
GetDeviceCaps:
HORZRES: 2560,
DESKTOPHORZRES: 3840,
VERTRES: 1440,
DESKTOPVERTRES: 2160
LOGPIXELSX: 96
LOGPIXELSX: 96
GetWindowRect:
Width: 669
Height: 389
GetWindowDC_Dismension:
Width: 669
Height: 389
точек на дюйм (target_proc: 0, local_proc: 1)
GetDeviceCaps:
HORZRES: 3840,
DESKTOPHORZRES : 3840,
VERTRES : 2160,
DESKTOPVERTRES : 2160
LOGPIXELSX : 144
LOGPIXELSX : 144
GetWindowRect:
Width : 1004
Height : 584
GetWindowDC_Dismension:
Width : 669
Height : 389
с разрешением dpi (target_proc: 1, local_proc: 1)
GetDeviceCaps:
HORZRES : 3840,
DESKTOPHORZRES : 3840,
VERTRES : 2160,
DESKTOPVERTRES : 2160
LOGPIXELSX : 144
LOGPIXELSX : 144
GetWindowRect:
Width : 955
Height : 606
GetWindowDC_Dismension:
Width : 955
Height : 606
с разрешением dpi (target_proc: 1, local_proc: 0)
GetDeviceCaps: HORZRES: 2560, DESKTOPHORZRES: 3840, ВЕРТЕРЫ: 1440, DESKTOPVERTRES: 2160 LOGPIXX: 96 LOGPIXELSX: 96
GetWindowRect:
Width : 637
Height : 404
GetWindowDC_Dismension:
Width : 955
Height : 606
Итак, этот закон:
Если (! target_proc_dpi_aware)
{
Windc_dimension = win_rect * 96 / LOGPIXELS;
}
Остальное
{
Windc_dimension = win_rect * HORZRES_VERTRES / DESKTOPHORZRES_DESKTOPVERTRES;
}
Не знаете, существует ли более простой и эффективный способ?