§
    ¨’¯jÜ^  ã            	       óT  — U d Z ddlZddlZddlZddlZddlmZmZmZ ddl	m
Z
 dZee         ed<   dee         fd„Zi Zdedefd	„Zdd
eee                  defd„Zdedeeeeef         fd„Zdedefd„Zddededefd„Zddededefd„Zddedededefd„Zddee         defd„ZdS )ua  ThÆ° viá»‡n dÃ¹ng chung quáº£n lÃ½ cá»­a sá»• Win32 cho Path of Exile 2.

Cung cáº¥p cÃ¡c hÃ m tÆ°Æ¡ng tÃ¡c cá»­a sá»• cáº¥p tháº¥p, chuáº©n hÃ³a tá»�a Ä‘á»™ Client Rectangle,
tÃ­nh toÃ¡n há»‡ sá»‘ DPI Scale vÃ  gáº¯n luá»“ng vÃ o Desktop tÆ°Æ¡ng tÃ¡c cá»§a ngÆ°á»�i dÃ¹ng.
TuÃ¢n thá»§ nghiÃªm ngáº·t chuáº©n tÃ i liá»‡u Google Docstrings theo Rule 16.
é    N)ÚListÚOptionalÚTuple)Úis_poe2_pidÚ_global_default_deskÚreturnc                  óÂ  — t           j        dk    rdS 	 t          j        j        } |                      ddd¦  «        }|r|                      |¦  «         |                      ddd¦  «        }|r$|                      |¦  «         t          |¦  «        S |  
                    dddd¦  «        }|r$|                      |¦  «         t          |¦  «        S n# t          $ r Y nw xY wdS )uþ  Gáº¯n luá»“ng hiá»‡n táº¡i vÃ o Desktop 'Default' tÆ°Æ¡ng tÃ¡c cá»§a phiÃªn ngÆ°á»�i dÃ¹ng.

    HÃ m nÃ y má»Ÿ tráº¡m lÃ m viá»‡c 'WinSta0' vÃ  desktop 'Default', sau Ä‘Ã³ gá»�i SetThreadDesktop
    Ä‘á»ƒ cho phÃ©p tiáº¿n trÃ¬nh cháº¡y ngáº§m hoáº·c service cÃ³ thá»ƒ tÃ¬m tháº¥y vÃ  chá»¥p cá»­a sá»• Win32
    cá»§a game Path of Exile 2 mÃ  khÃ´ng bá»‹ lá»—i Access Denied.

    Preconditions:
        Há»‡ Ä‘iá»�u hÃ nh Windows (nt). Luá»“ng gá»�i cÃ³ quyá»�n truy cáº­p desktop tÆ°Æ¡ng tÃ¡c.

    Postconditions:
        Náº¿u thÃ nh cÃ´ng, luá»“ng hiá»‡n táº¡i Ä‘Æ°á»£c liÃªn káº¿t vá»›i 'Default' desktop.

    Returns:
        Optional[int]: Handle cá»§a desktop náº¿u thÃ nh cÃ´ng, hoáº·c None náº¿u tháº¥t báº¡i / khÃ´ng cháº¡y trÃªn Windows.

    Thread-safety:
        Thread-safe. CÃ³ thá»ƒ gá»�i an toÃ n tá»« báº¥t ká»³ worker thread nÃ o.

    Example:
        >>> hdesk = attach_to_default_desktop()
        >>> if hdesk:
        ...     print("Ä�Ã£ gáº¯n luá»“ng vÃ o Default Desktop thÃ nh cÃ´ng.")
    ÚntNÚWinSta0Fé   r   ÚDefault)ÚosÚnameÚctypesÚwindllÚuser32ÚOpenWindowStationWÚSetProcessWindowStationÚOpenInputDesktopÚSetThreadDesktopÚintÚOpenDesktopWÚ	Exception)r   ÚhwinstaÚh_inputÚ	h_defaults       úsrc/common/win32_window.pyÚattach_to_default_desktopr      s  € õ0 
„w�$‚€ØˆtðÝ”Ô%ˆØ×+Ò+¨I°u¸jÑIÔIˆØð 	4Ø×*Ò*¨7Ñ3Ô3Ð3ð ×)Ò)¨!¨U°JÑ?Ô?ˆØð 	 Ø×#Ò# GÑ,Ô,Ð,Ý�w‘<”<Ðð ×'Ò'¨	°1°e¸ZÑHÔHˆ	Øð 	"Ø×#Ò# IÑ.Ô.Ð.Ý�y‘>”>Ð!ð	"øõ ð ð ð Øˆðøøøàˆ4s   ”A;C Â=C Ã
CÃCÚhwndc                 óî  ‡
— t           j        dk    s| sdS t          j        j        }|                     | ¦  «        rdS t                               | ¦  «        }|r,|                     |¦  «        r|                     | ¦  «        rdS 	 | 	                    | d¦  «        }|rM| 
                    |¦  «        }|r6|                     |¦  «        r!|                     | ¦  «        r|t          | <   dS n# t          $ r Y nw xY w	 |                     ¦   «         }|rÐt          j        t          j        j        t          j        t          j        j        ¦  «        }g Š
ˆ
fd„}|                     | ||¦  «        d¦  «         ‰
D ]h}|                     |ddd¦  «        }	|	rL|                     |	¦  «        r"|                     | ¦  «        r|	t          | <    dS |                     |	¦  «         Œin# t          $ r Y nw xY wdS )u†  Gáº¯n luá»“ng hiá»‡n táº¡i vÃ o Desktop chá»©a cá»­a sá»• HWND chá»‰ Ä‘á»‹nh.

    Tá»± Ä‘á»™ng truy váº¥n Thread ID sá»Ÿ há»¯u HWND qua GetWindowThreadProcessId,
    láº¥y handle Desktop qua GetThreadDesktop hoáº·c duyá»‡t EnumDesktopsW vá»›i quyá»�n MAXIMUM_ALLOWED.
    Ä�áº£m báº£o 100% tÆ°Æ¡ng thÃ­ch báº¥t ká»ƒ cá»­a sá»• náº±m trÃªn Default desktop hay sandbox desktop (exebox).
    r
   FTNc                 óP   •— | r"‰                      t          | ¦  «        ¦  «         dS ©NT©ÚappendÚstr)ÚdÚlpÚdesktopss     €r   Ú_d_cbz'attach_to_window_desktop.<locals>._d_cbk   s(   ø€ Øð ,Ø—O’O¥C¨¡F¤FÑ+Ô+Ð+Ø�tó    r   r   )r   r   r   r   r   ÚIsWindowÚ_cached_window_desktopsÚgetr   ÚGetWindowThreadProcessIdÚGetThreadDesktopr   ÚGetProcessWindowStationÚWINFUNCTYPEÚwintypesÚBOOLÚ	c_wchar_pÚLPARAMÚEnumDesktopsWr   ÚCloseDesktop)r   r   ÚcachedÚtidÚhdeskr   ÚDESKTOPENUMPROCWr)   r&   Úhdr(   s             @r   Úattach_to_window_desktopr=   H   sI  ø€ õ 
„w�$‚€˜d€ØˆuÝŒ]Ô!€FØ‡‚�tÑÔð Øˆtå$×(Ò(¨Ñ.Ô.€FØð �&×)Ò)¨&Ñ1Ô1ð Ø�?Š?˜4Ñ Ô ð 	Ø�4ð	Ø×-Ò-¨d°DÑ9Ô9ˆØð 	 Ø×+Ò+¨CÑ0Ô0ˆEØð  ˜×0Ò0°Ñ7Ô7ð  Ø—?’? 4Ñ(Ô(ð  Ø49Õ+¨DÑ1Ø˜4øøÝð ð ð ØˆðøøøðØ×0Ò0Ñ2Ô2ˆØð 	,Ý%Ô1µ&´/Ô2FÍÔHXÕZ`ÔZiÔZpÑqÔqÐØˆHðð ð ð ð ð
 × Ò  Ð*:Ð*:¸5Ñ*AÔ*AÀ1ÑEÔEÐEØð ,ð ,�Ø×(Ò(¨¨A¨u°jÑAÔA�Øð ,Ø×.Ò.¨rÑ2Ô2ð (Ø!Ÿ?š?¨4Ñ0Ô0ð (Ø<>Õ3°DÑ9Ø#' 4 4Ø×'Ò'¨Ñ+Ô+Ð+øøøÝð ð ð Øˆðøøøàˆ5s,   ÂA#C- Ã-
C:Ã9C:Ã>CG% ÇG% Ç%
G2Ç1G2Útitle_candidatesc                 óŠ  ‡‡‡‡‡‡‡— t           j        dk    rdS t          ¦   «          | €ddg} d„ | D ¦   «         ŠddgŠt          j        j        ŠdŠd	t          d
t          fˆfd„ŠdD ]6}‰                     |d¦  «        }|r ‰|¦  «        rt          |¦  «        c S Œ7| D ]6}‰                     d|¦  «        }|r ‰|¦  «        rt          |¦  «        c S Œ7t          ¦   «         }t          j	        t          j
        j        t          j
        j        t          j
        j        ¦  «        }h d£Šˆˆˆˆˆˆfd„} ||¦  «        }	 |r‰                     ||d¦  «         n‰                     |d¦  «         n# t           $ r Y nw xY w‰�s=	 t          j	        t          j
        j        t          j        t          j
        j        ¦  «        }g Šˆfd„}	‰                     ¦   «         }
|
rÐ‰                     |
 ||	¦  «        d¦  «         ‰D ]­}|                     ¦   «         dk    rŒ‰                     |ddd¦  «        }|rx	 ‰                     ||d¦  «         ‰r-‰                     |¦  «         	 ‰                     |¦  «          n2	 ‰                     |¦  «         Œ“# ‰                     |¦  «         w xY wŒ®n# t           $ r Y nw xY w‰S )u]  TÃ¬m handle (HWND) cá»§a cá»­a sá»• game Path of Exile 2.

    Thá»±c hiá»‡n dÃ² tÃ¬m thÃ´ng qua lá»›p cá»­a sá»• Ä‘Ã£ biáº¿t (POEWindowClass, POEC2_MainWindow)
    vÃ  danh sÃ¡ch tiÃªu Ä‘á»� á»©ng viÃªn (title candidates). Tá»± Ä‘á»™ng duyá»‡t qua toÃ n bá»™ cÃ¡c
    cá»­a sá»• trÃªn Default Desktop náº¿u EnumDesktopWindows kháº£ dá»¥ng.

    Args:
        title_candidates: Danh sÃ¡ch chuá»—i tiÃªu Ä‘á»� cá»­a sá»• cáº§n khá»›p (khÃ´ng phÃ¢n biá»‡t hoa thÆ°á»�ng).
            Náº¿u None, máº·c Ä‘á»‹nh sá»­ dá»¥ng ["path of exile 2", "path of exile"].

    Returns:
        int: HWND cá»§a cá»­a sá»• game náº¿u tÃ¬m tháº¥y, hoáº·c 0 náº¿u khÃ´ng tÃ¬m tháº¥y.

    Thread-safety:
        Thread-safe.

    Example:
        >>> hwnd = find_poe2_window()
        >>> if hwnd != 0:
        ...     print(f"TÃ¬m tháº¥y cá»­a sá»• game: HWND={hex(hwnd)}")
    r
   r   Nzpath of exile 2úpath of exilec                 ó6   — g | ]}|                      ¦   «         ‘ŒS © )Úlower)Ú.0Úts     r   ú
<listcomp>z$find_poe2_window.<locals>.<listcomp>›   s    € Ð=Ð=Ð= q˜Ÿš™œÐ=Ð=Ð=r*   ÚpoewindowclassÚpoec2_mainwindowÚhr   c                 ó  •— | r*‰                      | ¦  «        r‰                     | ¦  «        sdS t          j        ¦   «         }‰                     | t          j        |¦  «        ¦  «         |j        dk    rdS t          |j        ¦  «        S )NFr   )r+   ÚIsWindowVisibler   Úc_ulongr.   ÚbyrefÚvaluer   )rI   Úw_pidr   s     €r   Ú_is_valid_poe2_hwndz-find_poe2_window.<locals>._is_valid_poe2_hwnd¢   s‡   ø€ Øð 	˜Ÿš¨Ñ*Ô*ð 	°&×2HÒ2HÈÑ2KÔ2Kð 	Ø�5Ý”Ñ Ô ˆØ×'Ò'¨­6¬<¸Ñ+>Ô+>Ñ?Ô?Ð?ØŒ;˜!ÒÐØ�5Ý˜5œ;Ñ'Ô'Ð'r*   )ÚPOEWindowClassÚPOEC2_MainWindow>   Úwindow_classÚcabinetwclassÚchrome_widgetwin_1Úmozilla_window_classÚapplicationframewindowc                 óP  •— ‰                      | ¦  «        r‰                     | ¦  «        sdS t          j        d¦  «        }‰                     | |d¦  «         |j                             ¦   «                              ¦   «         }|‰	v rdS t          j        d¦  «        }‰                     | |d¦  «         |j                             ¦   «                              ¦   «         }|‰v r ‰| ¦  «        rt          | ¦  «        ŠdS ‰
D ]#}||v r ‰| ¦  «        rt          | ¦  «        Š dS Œ$dS )NTé   F)
r+   rK   r   Úcreate_unicode_bufferÚGetClassNameWrN   ÚstriprC   ÚGetWindowTextWr   )r   ÚlparamÚcbufÚcls_nameÚtbufÚ	win_titleÚtarget_titlerP   Ú
found_hwndÚignored_classesÚnormalized_titlesÚtarget_classesr   s          €€€€€€r   Ú
_enum_procz$find_poe2_window.<locals>._enum_procÁ   sF  ø€ à�Š˜tÑ$Ô$ð 	¨F×,BÒ,BÀ4Ñ,HÔ,Hð 	Ø�4åÔ+¨CÑ0Ô0ˆØ×Ò˜T 4¨Ñ-Ô-Ð-Ø”:×#Ò#Ñ%Ô%×+Ò+Ñ-Ô-ˆà�Ð&Ð&Ø�4åÔ+¨CÑ0Ô0ˆØ×Ò˜d D¨#Ñ.Ô.Ð.Ø”J×$Ò$Ñ&Ô&×,Ò,Ñ.Ô.ˆ	ð �~Ð%Ð%Ø"Ð" 4Ñ(Ô(ð Ý  ™YœY�
Ø�uð .ð 	!ð 	!ˆLØ˜yÐ(Ð(Ø&Ð& tÑ,Ô,ð !Ý!$ T¡¤�JØ ˜5˜5øàˆtr*   c                 óP   •— | r"‰                      t          | ¦  «        ¦  «         dS r"   r#   )Údnamer'   Údesktops_lists     €r   r)   zfind_poe2_window.<locals>._d_cbî   s*   ø€ Øð 5Ø!×(Ò(­¨U©¬Ñ4Ô4Ð4Ø�tr*   ÚdefaultFr   )r   r   r   r   r   r   r   ÚboolÚFindWindowWr1   r2   r3   ÚHWNDr5   ÚEnumDesktopWindowsÚEnumWindowsr   r4   r0   r6   rC   r   r   r7   )r>   Úclsr   Útitler:   ÚWNDENUMPROCrh   Úcbr;   r)   r   r&   r<   rP   rk   rd   re   rf   rg   r   s                @@@@@@@r   Úfind_poe2_windowrv   ~   s´  øøøøøøø€ õ, 
„w�$‚€ØˆqåÑÔÐàÐØ-¨Ð?ÐØ=Ð=Ð,<Ð=Ñ=Ô=Ðà&Ð(:Ð;€NåŒ]Ô!€FØ€Jð(�sð (¥tð (ð (ð (ð (ð (ð (ð 6ð ð ˆØ×!Ò! # tÑ,Ô,ˆØð 	Ð'Ð'¨Ñ-Ô-ð 	Ý�t‘9”9ÐÐÐøð "ð ð ˆØ×!Ò! $¨Ñ.Ô.ˆØð 	Ð'Ð'¨Ñ-Ô-ð 	Ý�t‘9”9ÐÐÐøõ &Ñ'Ô'€EÝÔ$¥V¤_Ô%9½6¼?Ô;OÕQWÔQ`ÔQgÑhÔh€Kðð ð €Oð
ð ð ð ð ð ð ð ð ð ð> 
ˆ�ZÑ	 Ô	 €BðØð 	&Ø×%Ò% e¨R°Ñ3Ô3Ð3Ð3à×Ò˜r 1Ñ%Ô%Ð%øøÝð ð ð Øˆðøøøð ñ ð	Ý%Ô1µ&´/Ô2FÍÔHXÕZ`ÔZiÔZpÑqÔqÐØˆMðð ð ð ð ð ×4Ò4Ñ6Ô6ˆGØð 4Ø×$Ò$ WÐ.>Ð.>¸uÑ.EÔ.EÀqÑIÔIÐIØ&ð 4ð 4�AØ—w’w‘y”y IÒ-Ð-Ø Ø×,Ò,¨Q°°5¸*ÑEÔE�BØð 4ð4Ø"×5Ò5°b¸"¸aÑ@Ô@Ð@Ø)ð &Ø &× 7Ò 7¸Ñ ;Ô ;Ð ;Ø %à"×/Ò/°Ñ3Ô3Ð3Ð3Ð3ð	&ð #×/Ò/°Ñ3Ô3Ð3Ð3ø˜F×/Ò/°Ñ3Ô3Ð3Ð3øøøð4øøõ ð 	ð 	ð 	ØˆDð	øøøð ÐsC   Å0E3 Å3
F Å?F ÆB2J3 È:.JÉ)J3 ÊJ3 ÊJ.Ê.J3 Ê3
K Ê?K c                 ó  — t           j        dk    s| sdS t          | ¦  «         t          j        j        }|                     | ¦  «        sdS t          j                             ¦   «         }| 	                    | t          j
        |¦  «        ¦  «        sdS t          j                             dd¦  «        }|                     | t          j
        |¦  «        ¦  «        sdS |j        |j        z
  }|j        |j        z
  }|j        |j        ||fS )uq  Láº¥y tá»�a Ä‘á»™ vÃ¹ng váº½ thá»±c táº¿ (Client Rectangle) cá»§a cá»­a sá»• game theo pixel mÃ n hÃ¬nh.

    Tá»± Ä‘á»™ng bÃ¹ trá»« thanh tiÃªu Ä‘á»� (title bar) vÃ  viá»�n cá»­a sá»• thÃ´ng qua Win32 API
    GetClientRect vÃ  ClientToScreen, tráº£ vá»� tá»�a Ä‘á»™ tuyá»‡t Ä‘á»‘i chuáº©n xÃ¡c cho viá»‡c
    tÃ­nh toÃ¡n giao diá»‡n, quÃ©t máº«u pixel vÃ  báº¯t sá»± kiá»‡n chuá»™t.

    Args:
        hwnd: Handle cá»­a sá»• Win32 cá»§a tiáº¿n trÃ¬nh Path of Exile 2.

    Returns:
        Tuple[int, int, int, int]: Bá»™ tá»© (left, top, width, height) theo tá»�a Ä‘á»™ mÃ n hÃ¬nh.
            Tráº£ vá»� (0, 0, 0, 0) náº¿u HWND khÃ´ng há»£p lá»‡ hoáº·c gá»�i Win32 API tháº¥t báº¡i.

    Thread-safety:
        Thread-safe.

    Example:
        >>> left, top, width, height = get_client_rect(hwnd)
        >>> print(f"Client Area: {width}x{height} táº¡i ({left}, {top})")
    r
   )r   r   r   r   r   )r   r   r=   r   r   r   r+   r2   ÚRECTÚGetClientRectrM   ÚPOINTÚClientToScreenÚrightÚleftÚbottomÚtopÚxÚy)r   r   ÚrectÚpointÚwidthÚheights         r   Úget_client_rectr†     sð   € õ* 
„w�$‚€˜d€Øˆ|å˜TÑ"Ô"Ð"ÝŒ]Ô!€FØ�?Š?˜4Ñ Ô ð Øˆ|åŒ?×ÒÑ!Ô!€DØ×Ò ¥f¤l°4Ñ&8Ô&8Ñ9Ô9ð Øˆ|åŒO×!Ò! ! QÑ'Ô'€EØ× Ò  ¥v¤|°EÑ':Ô':Ñ;Ô;ð Øˆ|àŒJ˜œÑ"€EØŒ[˜4œ8Ñ#€FØŒG�U”W˜e VÐ,Ð,r*   c                 óV  — t           j        dk    s| sdS t          j        j        }t          |d¦  «        r?	 |                     | ¦  «        }|dk    rt          |¦  «        dz  S n# t          $ r Y nw xY w	 t          j        j	        }| 
                    | ¦  «        }|rz	 d}|                     ||¦  «        }|dk    r(t          |¦  «        dz  |                     | |¦  «         S 	 |                     | |¦  «         n# |                     | |¦  «         w xY wn# t          $ r Y nw xY wdS )u  TÃ­nh toÃ¡n há»‡ sá»‘ phÃ³ng Ä‘áº¡i DPI (DPI Scale Factor) cá»§a cá»­a sá»• chá»‰ Ä‘á»‹nh.

    Sá»­ dá»¥ng GetDpiForWindow (Windows 10 v1607+ / Windows 11) vá»›i cÆ¡ cháº¿ fallback
    vá»� Device Context GetDeviceCaps(LOGPIXELSX) Ä‘á»ƒ Ä‘áº£m báº£o Ä‘á»™ co giÃ£n giao diá»‡n
    vÃ  tá»�a Ä‘á»™ chuá»™t luÃ´n chÃ­nh xÃ¡c trÃªn má»�i thiáº¿t láº­p mÃ n hÃ¬nh (HiDPI / 4K / Ultrawide).

    Args:
        hwnd: Handle cá»­a sá»• Win32 cáº§n Ä‘o lÆ°á»�ng.

    Returns:
        float: Há»‡ sá»‘ tá»‰ lá»‡ DPI (vÃ­ dá»¥ 1.0 cho 100% 96 DPI, 1.25 cho 125% 120 DPI, 1.5 cho 150%).
            Tráº£ vá»� 1.0 náº¿u khÃ´ng xÃ¡c Ä‘á»‹nh Ä‘Æ°á»£c.

    Thread-safety:
        Thread-safe.

    Example:
        >>> scale = get_dpi_scale(hwnd)
        >>> print(f"DPI Scale: {scale * 100:.0f}%")
    r
   g      ð?ÚGetDpiForWindowr   g      X@éX   )r   r   r   r   r   Úhasattrrˆ   Úfloatr   Úgdi32ÚGetDCÚGetDeviceCapsÚ	ReleaseDC)r   r   ÚdpirŒ   ÚhdcÚ
LOGPIXELSXs         r   Úget_dpi_scaler“   1  sg  € õ* 
„w�$‚€˜d€ØˆsåŒ]Ô!€FåˆvÐ(Ñ)Ô)ð ð	Ø×(Ò(¨Ñ.Ô.ˆCØ�QŠwˆwÝ˜S‘z”z DÑ(Ð(ð øåð 	ð 	ð 	ØˆDð	øøøðÝ”Ô#ˆØ�lŠl˜4Ñ Ô ˆØð 	,ð,Ø�
Ø×)Ò)¨#¨zÑ:Ô:�Ø˜’7�7Ý  ™:œ:¨Ñ,à× Ò   sÑ+Ô+Ð+Ð+ð ð × Ò   sÑ+Ô+Ð+Ð+ø�× Ò   sÑ+Ô+Ð+Ð+øøøøøÝð ð ð Øˆðøøøð ˆ3sA   ·,A% Á%
A2Á1A2Á6(D Â/C= ÃD Ã&D Ã=DÄD Ä
D&Ä%D&éô  Ú
timeout_msc           	      óô	  — t           j        dk    s| sdS t          j        j        }t          j        j        }t          | ¦  «         |                     | ¦  «        sdS 	 ddlm	}  || ¦  «        r,| 
                    | ¦  «        r|                     | ¦  «        sdS n# t          $ r Y nw xY w|                     ¦   «         | k    rt          | ¦  «        rdS 	 |                     | ¦  «        r|                     | d¦  «         n|                     | d¦  «         |                     | dddddd¦  «         |                     ¦   «         }|                     ¦   «         }|r|                     |d	¦  «        nd}|                     | d	¦  «        }d}	d}
|r*||k    r$t'          |                     ||d¦  «        ¦  «        }	|r*||k    r$t'          |                     ||d¦  «        ¦  «        }
	 t+          |d
¦  «        r|                     d¦  «         d}d}|                     |dd|¦  «         n# t          $ r Y nw xY w	 t+          |d¦  «        r|                     d¦  «         t+          |d¦  «        r|                     | d¦  «         |                     dddd¦  «         |                     | ¦  «         |                     | ¦  «         |                     | ¦  «         |                     | ¦  «         |                     dddd¦  «         |
r|r|                     ||d¦  «         |	r|r|                     ||d¦  «         n=# |
r|r|                     ||d¦  «         |	r|r|                     ||d¦  «         w w w xY wt?          j        ¦   «         |dz  z   }t?          j        ¦   «         |k     rë|                     ¦   «         }|| k    rdS t          j         ¦   «         }|                     | t          j!        |¦  «        ¦  «         t          j         ¦   «         }|                     |t          j!        |¦  «        ¦  «         |j"        dk    r|j"        |j"        k    rdS t          | ¦  «        rdS t?          j#        d¦  «         t?          j        ¦   «         |k     °ët          | ¦  «        S # t          $ rE}dd	l$}tK          d|› �d¬¦  «         | &                    ¦   «          t          | ¦  «        cY d	}~S d	}~ww xY w)u6  Tá»± Ä‘á»™ng chuyá»ƒn tab vÃ  Ä‘Æ°a cá»­a sá»• chá»‰ Ä‘á»‹nh lÃªn foreground vá»›i quyá»�n tÆ°Æ¡ng tÃ¡c an toÃ n.

    Sá»­ dá»¥ng ká»¹ thuáº­t AttachThreadInput káº¿t há»£p SetForegroundWindow vÃ  BringWindowToTop
    Ä‘á»ƒ Ä‘áº£m báº£o quyá»�n kÃ­ch hoáº¡t cá»­a sá»• ngay cáº£ khi tiáº¿n trÃ¬nh gá»�i Ä‘ang cháº¡y ná»�n hoáº·c
    khÃ´ng cÃ³ quyá»�n input focus trá»±c tiáº¿p. Tá»± Ä‘á»™ng khÃ´i phá»¥c náº¿u cá»­a sá»• Ä‘ang bá»‹ thu nhá»� (minimized).

    Args:
        hwnd: Handle cá»­a sá»• Win32 cáº§n Ä‘Æ°a lÃªn tiÃªu Ä‘iá»ƒm.
        timeout_ms: Thá»�i gian chá»� tá»‘i Ä‘a tÃ­nh báº±ng mili-giÃ¢y Ä‘á»ƒ xÃ¡c nháº­n focus (máº·c Ä‘á»‹nh 500ms).

    Returns:
        bool: True náº¿u cá»­a sá»• Ä‘Ã£ náº±m á»Ÿ foreground thÃ nh cÃ´ng, False náº¿u tháº¥t báº¡i hoáº·c khÃ´ng há»£p lá»‡.

    Thread-safety:
        Thread-safe. CÃ³ thá»ƒ gá»�i tá»« báº¥t ká»³ worker thread nÃ o.

    Example:
        >>> hwnd = find_poe2_window()
        >>> if hwnd and ensure_window_focus(hwnd):
        ...     print("Cá»­a sá»• POE2 Ä‘Ã£ sáºµn sÃ ng nháº­n phÃ­m/chuá»™t.")
    r
   Fr   ©Úis_window_on_virtual_displayTé	   éÿÿÿÿéC   NÚLockSetForegroundWindowé   i   ÚAllowSetForegroundWindowÚSwitchToThisWindowé   g     @�@g{®Gáz”?z [ensure_window_focus Exception] )Úflush)'r   r   r   r   r   Úkernel32r=   r+   Ú"src.common.virtual_display_managerr˜   rK   ÚIsIconicr   ÚGetForegroundWindowÚis_poe2_window_focusedÚ
ShowWindowÚSetWindowPosÚGetCurrentThreadIdr.   rm   ÚAttachThreadInputrŠ   rœ   ÚSystemParametersInfoWrž   rŸ   Úkeybd_eventÚBringWindowToTopÚSetForegroundWindowÚSetActiveWindowÚSetFocusÚtimerL   rM   rN   ÚsleepÚ	tracebackÚprintÚ	print_exc)r   r•   r   r¢   r˜   Ú
cur_threadÚfg_hwndÚ	fg_threadÚtarget_threadÚattached_fgÚattached_targetÚSPI_SETFOREGROUNDLOCKTIMEOUTÚSPIF_SENDCHANGEÚdeadlineÚfgÚ
target_pidÚfg_pidÚer³   s                      r   Úensure_window_focusrÃ   e  s²  € õ, 
„w�$‚€˜d€ØˆuåŒ]Ô!€FÝŒ}Ô%€Hå˜TÑ"Ô"Ð"à�?Š?˜4Ñ Ô ð ØˆuðØSÐSÐSÐSÐSÐSØ'Ð'¨Ñ-Ô-ð 	Ø×%Ò% dÑ+Ô+ð °F·O²OÀDÑ4IÔ4Ið Ø�tøøÝð ð ð Øˆðøøøð
 ×!Ò!Ñ#Ô# tÒ+Ð+Õ0FÀtÑ0LÔ0LÐ+ØˆtðF,à�?Š?˜4Ñ Ô ð 	'Ø×Ò˜d AÑ&Ô&Ð&Ð&à×Ò˜d AÑ&Ô&Ð&Ø×Ò˜D " a¨¨A¨qÐ2JÑKÔKÐKð ×0Ò0Ñ2Ô2ˆ
Ø×,Ò,Ñ.Ô.ˆØFMÐT�F×3Ò3°G¸TÑBÔBÐBÐSTˆ	Ø×7Ò7¸¸dÑCÔCˆàˆØˆØð 	V˜ yÒ0Ð0Ý˜v×7Ò7¸
ÀIÈtÑTÔTÑUÔUˆKØð 	^˜Z¨=Ò8Ð8Ý" 6×#;Ò#;¸JÈÐW[Ñ#\Ô#\Ñ]Ô]ˆOð	Ý�vÐ8Ñ9Ô9ð 2Ø×.Ò.¨qÑ1Ô1Ð1Ø+1Ð(Ø$ˆOØ×(Ò(Ð)EÀqÈ!È_Ñ]Ô]Ð]Ð]øÝð 	ð 	ð 	ØˆDð	øøøð	GÝ�vÐ9Ñ:Ô:ð 4Ø×/Ò/°Ñ3Ô3Ð3å�vÐ3Ñ4Ô4ð 6Ø×)Ò)¨$°Ñ5Ô5Ð5Ø×Ò˜t Q¨¨1Ñ-Ô-Ð-Ø×#Ò# DÑ)Ô)Ð)Ø×&Ò& tÑ,Ô,Ð,Ø×"Ò" 4Ñ(Ô(Ð(Ø�OŠO˜DÑ!Ô!Ð!Ø×Ò˜t Q¨¨1Ñ-Ô-Ð-àð K =ð KØ×(Ò(¨°]ÀEÑJÔJÐJØð G˜yð GØ×(Ò(¨°YÀÑFÔFÐFøøð ð K =ð KØ×(Ò(¨°]ÀEÑJÔJÐJØð G˜yð GØ×(Ò(¨°YÀÑFÔFÐFÐFðGð Gøøøõ ”9‘;”; *¨vÑ"5Ñ6ˆÝŒi‰kŒk˜HÒ$Ð$Ø×+Ò+Ñ-Ô-ˆBØ�TŠzˆzØ�tÝœÑ)Ô)ˆJØ×+Ò+¨Dµ&´,¸zÑ2JÔ2JÑKÔKÐKÝ”^Ñ%Ô%ˆFØ×+Ò+¨Bµ´¸VÑ0DÔ0DÑEÔEÐEØÔ !Ò#Ð#¨¬¸
Ô8HÒ(HÐ(HØ�tÝ% dÑ+Ô+ð Ø�tÝŒJ�tÑÔÐõ Œi‰kŒk˜HÒ$Ð$õ & dÑ+Ô+Ð+øÝð ,ð ,ð ,ØÐÐÐÝÐ4°Ð4Ð4¸DÐAÑAÔAÐAØ×ÒÑÔÐÝ% dÑ+Ô+Ð+Ð+Ð+Ð+Ð+Ð+øøøøð	,øøøsƒ   Á;B Â
B)Â(B)ÃDR( Ç(AH* È)R( È*
H7È4R( È6H7È7R( È;CM Ì
7R( Í:M;Í;AR( Ï
BR( ÑR( Ñ.9R( Ò(
S7Ò2:S2Ó,S7Ó2S7r|   Úsidec                 óz  — t           j        dk    s| sdS t          j        j        }|                     | ¦  «        sdS t          j                             ¦   «         }d}|                     |dt          j	        |¦  «        d¦  «        sBd|_
        d|_        |                     d¦  «        |_        |                     d¦  «        |_        |j        |j
        z
  }|j        |j        z
  }|dz  }|dk    r
|j
        |z   n|j
        }|j        }	|}
|}d}d	}t          |                     | d||	|
|||z  ¦  «        ¦  «        S )
uI  Tá»± Ä‘á»™ng Ä‘áº·t cá»­a sá»• game chiáº¿m ná»­a mÃ n hÃ¬nh (trÃ¡i hoáº·c pháº£i) Ä‘á»ƒ ngÆ°á»�i dÃ¹ng lÃ m viá»‡c bÃªn cÃ²n láº¡i.
    
    Args:
        hwnd: Handle cá»­a sá»• Win32 cá»§a game.
        side: 'right' (ná»­a pháº£i) hoáº·c 'left' (ná»­a trÃ¡i).
        
    Returns:
        bool: True náº¿u thÃ nh cÃ´ng.
    r
   Fé0   r   é   r�   r|   é   é@   )r   r   r   r   r   r+   r2   rx   r«   rM   r}   r   ÚGetSystemMetricsr|   r~   rm   r¨   )r   rÄ   r   r‚   ÚSPI_GETWORKAREAÚscreen_wÚscreen_hÚhalf_wÚnew_xÚnew_yÚnew_wÚnew_hÚSWP_NOZORDERÚSWP_SHOWWINDOWs                 r   Úsnap_window_to_halfrÕ   Þ  s;  € õ 
„w�$‚€˜d€ØˆuÝŒ]Ô!€FØ�?Š?˜4Ñ Ô ð ØˆuåŒ?×ÒÑ!Ô!€DØ€OØ×'Ò'¨¸½F¼LÈÑ<NÔ<NÐPQÑRÔRð 1ØˆŒ	ØˆŒØ×,Ò,¨QÑ/Ô/ˆŒ
Ø×-Ò-¨aÑ0Ô0ˆŒàŒz˜DœIÑ%€HØŒ{˜TœXÑ%€HØ˜‰]€Fà"&¨'¢/ /ˆDŒI˜ÑÐ°t´y€EØŒH€EØ€EØ€Eà€LØ€NÝ�×#Ò# D¨!¨U°E¸5À%ÈÐXfÑIfÑgÔgÑhÔhÐhr*   éR  é<   Útarget_xÚtarget_yc           	      óÄ  — t           j        dk    s| sdS t          j        j        }|                     | ¦  «        sdS t          j                             ¦   «         }|                     | t          j	        |¦  «        ¦  «        sdS |j
        |j        z
  }|j        |j        z
  }d}d}|                     | ||||||¦  «        }	t          | d¬¦  «         t!          |	¦  «        S )u{   Tá»± Ä‘á»™ng Ä‘á»‹nh vá»‹ cá»­a sá»• POE2 táº¡i vÃ¹ng an toÃ n trÃªn desktop (trÃ¡nh che khuáº¥t bá»Ÿi á»©ng dá»¥ng khÃ¡c).r
   Fr   rÉ   r”   )r•   )r   r   r   r   r   r+   r2   rx   ÚGetWindowRectrM   r|   r}   r~   r   r¨   rÃ   rm   )
r   rØ   rÙ   r   r‚   ÚwrI   ÚHWND_TOPrÔ   Úress
             r   Úposition_poe2_window_safelyrß     s×   € å	„w�$‚€˜d€ØˆuÝŒ]Ô!€FØ�?Š?˜4Ñ Ô ð ØˆuÝŒ?×ÒÑ!Ô!€DØ×Ò ¥f¤l°4Ñ&8Ô&8Ñ9Ô9ð ØˆuØŒ
�T”YÑ€AØŒ�d”hÑ€AØ€HØ€NØ
×
Ò
˜d H¨h¸À!ÀQÈÑ
WÔ
W€CÝ˜¨Ð-Ñ-Ô-Ð-Ý�‰9Œ9Ðr*   c                 ó(  — t           j        dk    rdS 	 t          j        j        }| r| dk    r| nt          ¦   «         }|rs	 ddlm}  ||¦  «        rPt          |¦  «         | 	                    |¦  «        r,| 
                    |¦  «        r|                     |¦  «        sdS n# t          $ r Y nw xY wt          ¦   «          |                     ¦   «         }|sE|rA| 	                    |¦  «        r,| 
                    |¦  «        r|                     |¦  «        sdS dS | �(| dk    r"t          |¦  «        t          | ¦  «        k    rdS | r| dk    r| nt          ¦   «         }|r™|dk    r“t          j        ¦   «         }|                     |t          j        |¦  «        ¦  «         t          j        ¦   «         }|                     |t          j        |¦  «        ¦  «         |j        dk    r|j        |j        k    rdS t          j        d¦  «        }|                     ||d¦  «         |j                             ¦   «         }|dv rdS |dk    rt          |¦  «        |k    rdS t          j        d	¦  «        }	|                     ||	d	¦  «         |	j                             ¦   «         }
d
|
v r\t          j        ¦   «         }|                     |t          j        |¦  «        ¦  «         |j        dk    rt1          |j        ¦  «        rdS dS # t          $ r Y dS w xY w)uë  Kiá»ƒm tra xem cá»­a sá»• game Path of Exile 2 hiá»‡n táº¡i cÃ³ Ä‘ang giá»¯ Foreground Focus hay khÃ´ng.
    
    Báº£o vá»‡ Focus Interlock: Ä�áº£m báº£o chuá»™t vÃ  bÃ n phÃ­m váº­t lÃ½ khÃ´ng bao giá»� bá»‹ bÆ¡m rÃ² rá»‰ sang
    mÃ n hÃ¬nh desktop hoáº·c cÃ¡c á»©ng dá»¥ng khÃ¡c cá»§a ngÆ°á»�i dÃ¹ng khi game bá»‹ unfocused.
    
    Args:
        hwnd: Handle cá»­a sá»• Win32 tÃ¹y chá»�n Ä‘á»ƒ kiá»ƒm tra cá»¥ thá»ƒ.
              Náº¿u None, tá»± Ä‘á»™ng kiá»ƒm tra GetForegroundWindow() vá»›i cÃ¡c ClassName Ä‘Ã£ biáº¿t
              ('POEWindowClass', 'POEC2_MainWindow') hoáº·c HWND tá»« find_poe2_window().
              
    Returns:
        bool: True náº¿u cá»­a sá»• POE2 Ä‘ang cÃ³ Focus trÃªn Foreground, ngÆ°á»£c láº¡i False.
    r
   Fr   r—   TNrY   )rG   rH   i   r@   )r   r   r   r   r   rv   r£   r˜   r=   r+   rK   r¤   r   r   r¥   r   rL   r.   rM   rN   rZ   r[   rC   r]   r   )r   r   Útarget_hwndr˜   r·   rÀ   rÁ   Ú	class_bufr`   Ú	title_bufÚ	title_vals              r   r¦   r¦     sk  € õ 
„w�$‚€ØˆuðAÝ”Ô%ˆØ#ÐI¨¨qª¨�d�dÕ7GÑ7IÔ7Iˆð ð 	ðØ[Ð[Ð[Ð[Ð[Ð[Ø/Ð/°Ñ<Ô<ð $Ý,¨[Ñ9Ô9Ð9Ø—’ {Ñ3Ô3ð $¸×8NÒ8NÈ{Ñ8[Ô8[ð $Ðdj×dsÒdsÐtñ  eAô  eAð $Ø#˜tøøÝð ð ð Ø�ðøøøõ 	"Ñ#Ô#Ð#Ø×,Ò,Ñ.Ô.ˆØð 	ð ð  ˜vŸš¨{Ñ;Ô;ð  À×@VÒ@VÐWbÑ@cÔ@cð  Ø—’ {Ñ3Ô3ð  Ø˜4Ø�5ð Ð  q¢ Ý�7‰|Œ|�s 4™yœyÒ(Ð(Ø�tð  $ÐI¨¨qª¨�d�dÕ7GÑ7IÔ7IˆØð 	˜;¨š?˜?ÝœÑ)Ô)ˆJØ×+Ò+¨K½¼ÀjÑ9QÔ9QÑRÔRÐRÝ”^Ñ%Ô%ˆFØ×+Ò+¨GµV´\À&Ñ5IÔ5IÑJÔJÐJØÔ !Ò#Ð#¨¬¸
Ô8HÒ(HÐ(HØ�tõ Ô0°Ñ5Ô5ˆ	Ø×Ò˜W i°Ñ5Ô5Ð5Ø”?×(Ò(Ñ*Ô*ˆØÐ=Ð=Ð=Ø�4ð ˜Š?ˆ?�s 7™|œ|¨{Ò:Ð:Ø�4õ Ô0°Ñ5Ô5ˆ	Ø×Ò˜g y°#Ñ6Ô6Ð6Ø”O×)Ò)Ñ+Ô+ˆ	Ø˜iÐ'Ð'Ý”^Ñ%Ô%ˆFØ×+Ò+¨GµV´\À&Ñ5IÔ5IÑJÔJÐJØŒ|˜aÒÐ¥K°´Ñ$=Ô$=ÐØ�tàˆuøÝð ð ð ØˆuˆuðøøøsX   ”+L Á AB" Â!L Â"
B/Â,L Â.B/Â/A(L Ä(L ÅB1L Ç8AL ÉL ÉB"L Ì
LÌL)N)r”   )r|   )rÖ   r×   )Ú__doc__r   Úctypes.wintypesr   r±   Útypingr   r   r   Úsrc.common.win32_processr   r   r   Ú__annotations__r   r,   rm   r=   r%   rv   r†   r‹   r“   rÃ   rÕ   rß   r¦   rB   r*   r   ú<module>rê      s;  ððð ð ð €€€Ø Ð Ð Ð Ø 	€	€	€	Ø €€€Ø (Ð (Ð (Ð (Ð (Ð (Ð (Ð (Ð (Ð (à 0Ð 0Ð 0Ð 0Ð 0Ð 0à&*Ð �h˜s”mÐ *Ð *Ñ *ð/ 8¨C¤=ð /ð /ð /ð /ðd Ð ð3 3ð 3¨4ð 3ð 3ð 3ð 3ðlFð F x°°S´	Ô':ð FÀcð Fð Fð Fð FðR'-˜#ð '- %¨¨S°#°sÐ(:Ô";ð '-ð '-ð '-ð '-ðT1˜ð 1 ð 1ð 1ð 1ð 1ðhv,ð v,˜cð v,¨sð v,¸Tð v,ð v,ð v,ð v,ðr#ið #i˜cð #i¨ð #i¸4ð #ið #ið #ið #iðLð  cð °Sð È#ð ÐW[ð ð ð ð ð&Rð R ¨#¤ð R¸$ð Rð Rð Rð Rð Rð Rr*   