§
    ¬Y¯já(  ã                   ó`  — d Z ddlZddlZddlZddlmZ ddlmZ ddlmZm	Z	m
Z
 ddlmZ ddlmZ ddlmZ d	Zd
ZdZdZdZdZdZdZdZdZdZdZdZdZdZ ed¬¦  «         G d„ d¦  «        ¦   «         Z  G d„ dej!        ¦  «        Z" G d„ dej!        ¦  «        Z#dee          fd „Z$de	e          fd!„Z%de&fd"„Z'	 	 	 d/d$e(d%e	e          d&e&d'e&de&f
d(„Z)d$e(de	e
e(e(e(e(f                  fd)„Z*	 d0d$e(d%e	e          de&fd*„Z+	 d0d%e	e          de	ej                 fd+„Z,	 	 d1d%e	e          d-e(de	e-         fd.„Z.dS )2ud  Module quáº£n lÃ½ mÃ n hÃ¬nh áº£o pháº§n cá»©ng (Virtual Display Manager) cho AutoPOE2.

Há»— trá»£ tá»± Ä‘á»™ng nháº­n diá»‡n mÃ n hÃ¬nh áº£o IddCx phá»¥ (Monitor 2), dá»�i cá»­a sá»• game
PathOfExile.exe sang khÃ´ng gian lÃ m viá»‡c Ä‘á»™c láº­p vÃ  chá»¥p áº£nh luá»“ng thá»�i gian thá»±c
thÃ´ng qua GDI BitBlt an toÃ n tÃ i nguyÃªn (Rule 5 & Rule 16).
é    N)Úwintypes)Ú	dataclass)ÚListÚOptionalÚTuple)ÚImage)Úcapture_rect_bitblt)Úattach_to_default_desktopé   é   é   é    é@   é   é	   iðÿÿÿi  À i   i   i   l        i   T)Úfrozenc                   óœ   — e Zd ZU dZeed<   eed<   eed<   eed<   eed<   eed<   edefd	„¦   «         Z	edefd
„¦   «         Z
dededefd„ZdS )ÚMonitorInfouT   ThÃ´ng tin Ä‘á»‹nh tuyáº¿n vÃ  tá»�a Ä‘á»™ hÃ¬nh há»�c cá»§a má»™t mÃ n hÃ¬nh Win32.ÚdeviceÚleftÚtopÚwidthÚheightÚ
is_primaryÚreturnc                 ó    — | j         | j        z   S ©N)r   r   ©Úselfs    ú:C:\Projects\AutoPOE2\src\common\virtual_display_manager.pyÚrightzMonitorInfo.right1   s   € àŒy˜4œ:Ñ%Ð%ó    c                 ó    — | j         | j        z   S r   )r   r   r   s    r    ÚbottomzMonitorInfo.bottom5   s   € àŒx˜$œ+Ñ%Ð%r"   ÚxÚyc                 ój   — | j         |cxk    o
| j        k     nc o| j        |cxk    o
| j        k     nc S r   )r   r!   r   r$   )r   r%   r&   s      r    Úcontains_pointzMonitorInfo.contains_point9   sM   € ØŒy˜AÐ*Ð*Ò*Ð* ¤
Ò*Ð*Ð*Ð*ÐJ¨t¬x¸1Ð/JÐ/JÒ/JÐ/J¸t¼{Ò/JÐ/JÐ/JÐ/JÐJr"   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚstrÚ__annotations__ÚintÚboolÚpropertyr!   r$   r(   © r"   r    r   r   '   sÓ   € € € € € € à^Ð^Ø€K€K�KØ
€I€I�IØ	€H€H�HØ€J€J�JØ€K€K�KØÐÐÑàð&�sð &ð &ð &ñ „Xð&ð ð&˜ð &ð &ð &ñ „Xð&ðK ð K¨ð K°ð Kð Kð Kð Kð Kð Kr"   r   c                   óR   — e Zd Zdej        fdej        fdej        fdej        fgZdS )Ú_RECTr   r   r!   r$   N)r)   r*   r+   r   ÚLONGÚ_fields_r2   r"   r    r4   r4   =   s=   € € € € € à	�”ÐØ	�”ÐØ	�(”-Ð Ø	�8”=Ð!ð	€H€H€Hr"   r4   c                   óT   — e Zd Zdej        fdefdefdej        fdej        dz  fgZdS )Ú_MONITORINFOEXWÚcbSizeÚ	rcMonitorÚrcWorkÚdwFlagsÚszDevicer   N)r)   r*   r+   r   ÚDWORDr4   ÚWCHARr6   r2   r"   r    r8   r8   F   sH   € € € € € à	�8”>Ð"Ø	�eÐØ	�5ÐØ	�H”NÐ#Ø	�X”^ bÑ(Ð)ð€H€H€Hr"   r8   r   c                  ó�  ‡‡— t           j        dk    rg S 	 t          ¦   «          n# t          $ r Y nw xY wt          j        j        Šg Šˆˆfd„} t	          j        t          j        t          j	        t          j	        t	          j
        t          ¦  «        t          j        ¦  «        }‰                     dd || ¦  «        d¦  «         ‰S )uÊ   Liá»‡t kÃª toÃ n bá»™ cÃ¡c mÃ n hÃ¬nh hiá»ƒn thá»‹ Ä‘ang káº¿t ná»‘i vá»›i há»‡ Ä‘iá»�u hÃ nh.

    Returns:
        List[MonitorInfo]: Danh sÃ¡ch cÃ¡c mÃ n hÃ¬nh kÃ¨m tá»�a Ä‘á»™ vÃ  cá»� Primary.
    Úntc                 ó  •— t          ¦   «         }t          j        t           ¦  «        |_        ‰                     t          j        | ¦  «        t          j        |¦  «        ¦  «        r£|j        }t          |j	        dz  ¦  «        }‰ 
                    t          |j        t          |j        ¦  «        t          |j        ¦  «        t          |j        |j        z
  ¦  «        t          |j        |j        z
  ¦  «        |¬¦  «        ¦  «         dS )Nr   )r   r   r   r   r   r   T)r8   ÚctypesÚsizeofr9   ÚGetMonitorInfoWÚc_void_pÚbyrefr:   r0   r<   Úappendr   r=   r/   r   r   r!   r$   )	Ú	h_monitorÚ_hdcÚ_lprcÚ_lparamÚinfoÚrr   ÚmonitorsÚuser32s	          €€r    Ú
_enum_procz$get_all_monitors.<locals>._enum_proca   sÛ   ø€ ÝÑ Ô ˆÝ”m¥OÑ4Ô4ˆŒØ×!Ò!¥&¤/°)Ñ"<Ô"<½f¼lÈ4Ñ>PÔ>PÑQÔQð 	Ø”ˆAÝ˜dœl¨QÑ.Ñ/Ô/ˆJØ�OŠOÝØœ=Ý˜QœV™œÝ˜AœE™
œ
Ý˜aœg¨¬Ñ.Ñ/Ô/Ý˜qœx¨!¬%Ñ/Ñ0Ô0Ø)ðñ ô ñ	ô 	ð 	ð ˆtr"   Nr   )ÚosÚnamer
   Ú	ExceptionrC   ÚwindllrP   ÚWINFUNCTYPEÚc_boolrF   ÚPOINTERr4   r   ÚLPARAMÚEnumDisplayMonitors)rQ   Úcb_typerO   rP   s     @@r    Úget_all_monitorsr\   P   sÙ   øø€ õ 
„w�$‚€Øˆ	ðÝ!Ñ#Ô#Ð#Ð#øÝð ð ð Øˆðøøøõ Œ]Ô!€FØ"$€Hðð ð ð ð ð õ$ Ô ÝŒÝŒÝŒÝŒ•uÑÔÝŒñô €Gð ×Ò˜t T¨7¨7°:Ñ+>Ô+>ÀÑBÔBÐBØ€Os   –% ¥
2±2c                  óŒ   — t          ¦   «         } d„ | D ¦   «         }|sdS |D ]}|j        dk    r|j        dk    r|c S Œ|d         S )uc  TÃ¬m mÃ n hÃ¬nh áº£o phá»¥ (non-primary monitor) Ä‘á»ƒ cháº¡y game Ä‘á»™c láº­p.

    Æ¯u tiÃªn tÃ¬m mÃ n hÃ¬nh khÃ´ng pháº£i primary cÃ³ chiá»�u rá»™ng >= 1280.
    Náº¿u cÃ³ nhiá»�u mÃ n hÃ¬nh phá»¥, chá»�n mÃ n hÃ¬nh cÃ³ tá»�a Ä‘á»™ left >= 1920.

    Returns:
        Optional[MonitorInfo]: MÃ n hÃ¬nh áº£o náº¿u tá»“n táº¡i, ngÆ°á»£c láº¡i None.
    c                 ó    — g | ]}|j         °	|‘ŒS r2   )r   )Ú.0Úms     r    ú
<listcomp>z'get_virtual_monitor.<locals>.<listcomp>ˆ   s   € Ð=Ð=Ð=˜1°´Ð=�QÐ=Ð=Ð=r"   Nr   i   )r\   r   r   )rO   Únon_primariesr`   s      r    Úget_virtual_monitorrc   ~   sj   € õ  Ñ!Ô!€HØ=Ð= Ð=Ñ=Ô=€MØð Øˆtð ð ð ˆØŒ6�AŠ:ˆ:˜!œ' Tš/˜/ØˆHˆHˆHøà˜ÔÐr"   c                  ó"   — t          ¦   «         duS )uV   Kiá»ƒm tra xem há»‡ thá»‘ng cÃ³ mÃ n hÃ¬nh áº£o phá»¥ Ä‘ang hoáº¡t Ä‘á»™ng hay khÃ´ng.N)rc   r2   r"   r    Úis_virtual_display_activere   ”   s   € åÑ Ô ¨Ð,Ð,r"   FÚhwndÚmonitorÚ
borderlessÚ	keep_sizec                 ó8  — t           j        dk    s| sdS |pt          ¦   «         }|sdS t          j        j        }|                     | ¦  «        sdS |                     | ¦  «        r|                     | t          ¦  «         |rš| 
                    | t          ¦  «        }|t          t          z  t          z  t          z   z  }|t           t"          z  z  }|                     | t          |¦  «         t&          t(          z  t*          z  t,          z  }|j        }|j        }	nK|r$t&          t2          z  t*          z  t,          z  }d}d}	n%t&          t*          z  t,          z  }|j        }|j        }	t5          |                     | d|j        |j        ||	|¦  «        ¦  «        }
|
S )u†  Di chuyá»ƒn vÃ  cÄƒn chá»‰nh cá»­a sá»• Win32 sang mÃ n hÃ¬nh áº£o phá»¥.

    Args:
        hwnd: Handle cá»­a sá»• cáº§n di chuyá»ƒn.
        monitor: ThÃ´ng tin mÃ n hÃ¬nh Ä‘Ã­ch (náº¿u None sáº½ tá»± Ä‘á»™ng tÃ¬m).
        borderless: Náº¿u True, loáº¡i bá»� viá»�n vÃ  thanh tiÃªu Ä‘á»� thÃ nh Borderless Fullscreen. Máº·c Ä‘á»‹nh False Ä‘á»ƒ báº£o vá»‡ DirectX 12 swapchain.
        keep_size: Náº¿u True, giá»¯ nguyÃªn kÃ­ch thÆ°á»›c hiá»‡n táº¡i vÃ  chá»‰ dá»‹ch chuyá»ƒn tá»�a Ä‘á»™ (SWP_NOSIZE), trÃ¡nh kÃ­ch hoáº¡t ResizeBuffers trong DirectX.

    Returns:
        bool: True náº¿u di chuyá»ƒn thÃ nh cÃ´ng, ngÆ°á»£c láº¡i False.
    rA   Fr   )rR   rS   rc   rC   rU   rP   ÚIsWindowÚIsIconicÚ
ShowWindowÚ
SW_RESTOREÚGetWindowLongWÚ	GWL_STYLEÚ
WS_CAPTIONÚWS_THICKFRAMEÚWS_MINIMIZEBOXÚWS_MAXIMIZEBOXÚWS_POPUPÚ
WS_VISIBLEÚSetWindowLongWÚSWP_NOZORDERÚSWP_FRAMECHANGEDÚSWP_SHOWWINDOWÚSWP_NOACTIVATEr   r   Ú
SWP_NOSIZEr0   ÚSetWindowPosr   r   )rf   rg   rh   ri   Útarget_monitorrP   ÚstyleÚflagsÚtarget_wÚtarget_hÚsuccesss              r    Úmove_window_to_virtual_displayr„   ™   s›  € õ" 
„w�$‚€˜d€ØˆuàÐ5Õ 3Ñ 5Ô 5€NØð ØˆuåŒ]Ô!€FØ�?Š?˜4Ñ Ô ð Øˆuð ‡‚�tÑÔð ,Ø×Ò˜$¥
Ñ+Ô+Ð+ð ð )Ø×%Ò% d­IÑ6Ô6ˆØ•:¥Ñ-µÑ>ÅÑOÐPÑPˆØ•�JÑ&Ñ&ˆØ×Ò˜d¥I¨uÑ5Ô5Ð5ÝÕ/Ñ/µ.Ñ@Å>ÑQˆØ!Ô'ˆØ!Ô(ˆˆØ	ð )Ý�zÑ)­NÑ:½^ÑKˆØˆØˆˆå�~Ñ-µÑ>ˆØ!Ô'ˆØ!Ô(ˆõ Ø×ÒØØØÔØÔØØØñ	
ô 	
ñ
ô 
€Gð €Nr"   c                 ó†  — t           j        dk    s| sdS t          j        j        }|                     | ¦  «        sdS t          ¦   «         }|                     | t          j        |¦  «        ¦  «        sdS t          |j
        ¦  «        t          |j        ¦  «        t          |j        ¦  «        t          |j        ¦  «        fS )uñ   Láº¥y tá»�a Ä‘á»™ tuyá»‡t Ä‘á»‘i cá»§a cá»­a sá»• (left, top, right, bottom).

    Args:
        hwnd: Handle cá»­a sá»• Win32.

    Returns:
        Optional[Tuple[int, int, int, int]]: Bá»™ tá»© (left, top, right, bottom) hoáº·c None.
    rA   N)rR   rS   rC   rU   rP   rk   r4   ÚGetWindowRectrG   r/   r   r   r!   r$   )rf   rP   Úrects      r    Úget_window_boundsrˆ   Ú   sœ   € õ 
„w�$‚€˜d€ØˆtåŒ]Ô!€FØ�?Š?˜4Ñ Ô ð Øˆtå‰7Œ7€DØ×Ò ¥f¤l°4Ñ&8Ô&8Ñ9Ô9ð Øˆtå�”	‰NŒN�C ¤™MœM­3¨t¬z©?¬?½CÀÄÑ<LÔ<LÐMÐMr"   c                 óô   — t           j        dk    s| sdS |pt          ¦   «         }|sdS t          | ¦  «        }|sdS |d         |d         z   dz  }|d         |d         z   dz  }|                     ||¦  «        S )ua  XÃ¡c thá»±c xem cá»­a sá»• Win32 cÃ³ Ä‘ang náº±m trong pháº¡m vi mÃ n hÃ¬nh áº£o hay khÃ´ng.

    Args:
        hwnd: Handle cá»­a sá»• cáº§n kiá»ƒm tra.
        monitor: ThÃ´ng tin mÃ n hÃ¬nh Ä‘Ã­ch (náº¿u None sáº½ tá»± Ä‘á»™ng tÃ¬m).

    Returns:
        bool: True náº¿u tÃ¢m cá»§a cá»­a sá»• náº±m trong mÃ n hÃ¬nh áº£o, ngÆ°á»£c láº¡i False.
    rA   Fr   r   r   é   )rR   rS   rc   rˆ   r(   )rf   rg   r~   ÚboundsÚcenter_xÚcenter_ys         r    Úis_window_on_virtual_displayrŽ   ñ   s”   € õ 
„w�$‚€˜d€ØˆuàÐ5Õ 3Ñ 5Ô 5€NØð Øˆuå˜tÑ$Ô$€FØð Øˆuà�q”	˜F 1œIÑ%¨!Ñ+€HØ�q”	˜F 1œIÑ%¨!Ñ+€HØ×(Ò(¨°8Ñ<Ô<Ð<r"   c                 ó  — | pt          ¦   «         }|sdS 	 ddlm} ddlm}  |¦   «         }|r!t          ||¦  «        r ||d¬¦  «        }|�|S n# t          $ r Y nw xY wt          |j        |j	        |j
        |j        ¦  «        S )uB  Chá»¥p khung hÃ¬nh toÃ n mÃ n hÃ¬nh áº£o thÃ´ng qua GDI BitBlt / PrintWindow an toÃ n tÃ i nguyÃªn.

    Æ¯u tiÃªn chá»¥p trá»±c tiáº¿p buffer DirectX cá»§a cá»­a sá»• game náº¿u game Ä‘ang hiá»ƒn thá»‹
    trÃªn mÃ n hÃ¬nh áº£o (trÃ¡nh hiá»‡n tÆ°á»£ng BitBlt desktop bá»‹ DirectFlip bypass).
    Fallback sang chá»¥p toÃ n bá»™ rect mÃ n hÃ¬nh áº£o náº¿u khÃ´ng cÃ³ game.

    Args:
        monitor: MÃ n hÃ¬nh áº£o cáº§n chá»¥p (náº¿u None sáº½ tá»± Ä‘á»™ng tÃ¬m).

    Returns:
        Optional[Image.Image]: áº¢nh chá»¥p PIL RGB náº¿u thÃ nh cÃ´ng, ngÆ°á»£c láº¡i None.
    Nr   )Úfind_poe2_window)Úcapture_window_bitbltF)Úclient_only)rc   Úsrc.common.win32_windowr�   Úsrc.common.screen_capturer‘   rŽ   rT   r	   r   r   r   r   )rg   r~   r�   r‘   Ú	game_hwndÚimg_games         r    Úcapture_virtual_displayr—     sà   € ð Ð5Õ 3Ñ 5Ô 5€NØð Øˆtð	Ø<Ð<Ð<Ð<Ð<Ð<ØCÐCÐCÐCÐCÐCØ$Ð$Ñ&Ô&ˆ	Øð 	 Õ5°iÀÑPÔPð 	 Ø,Ð,¨YÀEÐJÑJÔJˆHØÐ#Ø�øøÝð ð ð Øˆðøøøõ ØÔØÔØÔØÔñ	ô ð s   –8A Á
AÁAéK   Úqualityc                 ó¦   — t          | ¦  «        }|sdS t          j        ¦   «         }|                     |d|¬¦  «         |                     ¦   «         S )u�  Chá»¥p áº£nh mÃ n hÃ¬nh áº£o vÃ  nÃ©n sang Ä‘á»‹nh dáº¡ng JPEG phá»¥c vá»¥ live web stream.

    Args:
        monitor: MÃ n hÃ¬nh áº£o cáº§n chá»¥p (náº¿u None sáº½ tá»± Ä‘á»™ng tÃ¬m).
        quality: Cháº¥t lÆ°á»£ng nÃ©n JPEG (1-100), máº·c Ä‘á»‹nh 75 tá»‘i Æ°u bÄƒng thÃ´ng.

    Returns:
        Optional[bytes]: Máº£ng bytes JPEG náº¿u chá»¥p vÃ  nÃ©n thÃ nh cÃ´ng, ngÆ°á»£c láº¡i None.
    NÚJPEG)Úformatr™   )r—   ÚioÚBytesIOÚsaveÚgetvalue)rg   r™   ÚimgÚbufs       r    Úcapture_virtual_display_jpegr£   6  sO   € õ " 'Ñ
*Ô
*€CØð Øˆtå
Œ*‰,Œ,€CØ‡H‚HˆS˜¨€HÑ1Ô1Ð1Ø�<Š<‰>Œ>Ðr"   )NFFr   )Nr˜   )/r,   rC   r�   rR   r   Údataclassesr   Útypingr   r   r   ÚPILr   r”   r	   r“   r
   r|   Ú
SWP_NOMOVErx   ry   rz   r{   rn   ÚSW_SHOWNOACTIVATErp   rq   rr   rs   rt   ru   rv   r   Ú	Structurer4   r8   r\   rc   r0   re   r/   r„   rˆ   rŽ   r—   Úbytesr£   r2   r"   r    ú<module>r«      sL  ððð ð €€€Ø 	€	€	€	Ø 	€	€	€	Ø Ð Ð Ð Ð Ð Ø !Ð !Ð !Ð !Ð !Ð !Ø (Ð (Ð (Ð (Ð (Ð (Ð (Ð (Ð (Ð (à Ð Ð Ð Ð Ð à 9Ð 9Ð 9Ð 9Ð 9Ð 9Ø =Ð =Ð =Ð =Ð =Ð =ð €
Ø€
Ø€ØÐ Ø€Ø€Ø€
ØÐ à€	Ø€
Ø€Ø€Ø€Ø€Ø€
ð €�$ÐÑÔðKð Kð Kð Kð Kñ Kô Kñ ÔðKð*ð ð ð ð ˆFÔñ ô ð ðð ð ð ð �fÔ&ñ ô ð ð+˜$˜{Ô+ð +ð +ð +ð +ð\˜X kÔ2ð ð ð ð ð,- 4ð -ð -ð -ð -ð &*ØØð	>ð >Ø
ð>à�kÔ"ð>ð ð>ð ð	>ð
 
ð>ð >ð >ð >ðBN˜Cð N H¨U°3¸¸SÀ#Ð3EÔ-FÔ$Gð Nð Nð Nð Nð2 &*ð=ð =Ø
ð=à�kÔ"ð=ð 
ð=ð =ð =ð =ð< &*ð%ð %Ø�kÔ"ð%àˆeŒkÔð%ð %ð %ð %ðR &*Øðð Ø�kÔ"ðàðð ˆe„_ðð ð ð ð ð r"   