Какова размерная связь между WindowDC и GetWindowRect? - PullRequest
0 голосов
/ 01 июля 2019
  • Я пишу программу захвата экрана, которая требует 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;
    

    }

  • Не знаете, существует ли более простой и эффективный способ?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...