a „oeÍã@sddlZddlZddlZddlZddlZddlZddlZddlZddlZddl Z dd„Z dd„Z dd„Z dd d „Z d d „ZiZe  dd ej¡Ze  ee j¡Ze d¡Zze ed¡ZWn ejyÖe ed¡ZYn0dae eeƒdƒesúe d¡qêere ¡e d¡qúdS)éNcCsr|tjtjfvrt |¡nR|tjkrn|tjkrZt |d¡}td|ƒt |¡t |ƒn|tj krnt |¡dS)z1Handles messages from the desktop name dialog boxéHznew desktop name: N) Úwin32conÚWM_CLOSEÚ WM_DESTROYÚwin32guiZ DestroyWindowÚ WM_COMMANDÚIDOKZGetDlgItemTextÚprintÚcreate_desktopÚIDCANCEL)ÚhwndÚmsgZwparamZlparamÚ desktop_name©rú;C:\Program Files\Certbot\pkgs\win32\Demos\desktopmanager.pyÚdesktop_name_dlgprocs        rc CsÚtjttjttjti}tjtjBtjBtjB}t   t   d¡dd|dgddtj dtjtjBtjBtjBgddtjd tjtjBtjBgd d d d tjgddddtjgg||¡}t  |d¡t  |d¡}t  |d¡t  |¡dS)zECreate a dialog box to ask the user for name of desktop to be createdNzOne ugly dialog box !)édréÈrrZButtonZCreate)é rééz Never mind)é-ré2rZStaticz Desktop name:éG)ré(éFrZEditÚr)éKréZrT)rrrrrZ WS_BORDERZ WS_VISIBLEZ WS_CAPTIONÚ WS_SYSMENUrZCreateDialogIndirectÚwin32apiÚGetModuleHandlerZ WS_TABSTOPZ BS_HOLLOWZBS_DEFPUSHBUTTONr Z EnableWindowZ GetDlgItemZSetFocus)Z parent_hwndZmsgsÚstyleÚhZhcontrolrrrÚget_new_desktop_name!sVýÿþýÿ ÿþýû ûìç   r$c Cs@tda| ¡d|}t ¡}t d¡|_||_tj tj Btj B|_ t  dtj¡|_tj|_t|_t |¡}tjtjB}t |d|tjddtjtjdd|jd¡ }t |¡tjtjBtjB}|t|tjdtd|f}|t|<d} | s&zt  dd¡} Wqætj!y"t"j#t$ %d ¡Yqæ0qæt &tj'|¡t (¡dS) zRRuns as a thread on each desktop to create a new tray icon and handle its messageséZPythonDesktopManagerNrZdm_rzDesktop Manager (%s)Z Shell_TrayWndgà?))ÚidZSetThreadDesktoprZWNDCLASSr r!Z hInstanceZ lpszClassNamerZ CS_VREDRAWZ CS_HREDRAWZCS_GLOBALCLASSr"Z LoadCursorZ IDC_ARROWZhCursorZ COLOR_WINDOWZ hbrBackgroundÚ icon_wndprocZ lpfnWndProcZ RegisterClassZ WS_OVERLAPPEDrZ CreateWindowZ CW_USEDEFAULTZ UpdateWindowZNIF_ICONZ NIF_MESSAGEZNIF_TIPZWM_USERÚhiconÚ window_infoZ FindWindowÚerrorÚ tracebackÚ print_excÚtimeÚsleepÚShell_NotifyIconZNIM_ADDZ PumpMessages) ÚhdeskrZwindowclassnameZwcZ windowclassr"r ÚflagsZ notify_infoZ tray_foundrrrÚnew_iconQsX   õ úr2r%c Cs´t ¡}d|_zt |dtj|¡}WnDtjyht  ¡t   ¡}t  d|¡t   d| ¡d¡YdS0|r˜t ¡}||_t dddddtjdd|¡ }t t||f¡}| ¡dS)zyCreates a new desktop and spawns a thread running on it Will also start a new icon thread on an existing desktop r%rNzDesktop creation failedz Explorer.exeTzc:\)Ú pywintypesZSECURITY_ATTRIBUTESZbInheritHandleÚ win32serviceZ CreateDesktoprÚMAXIMUM_ALLOWEDr*r+r,ÚioÚStringIOr Z MessageBoxÚgetvalueÚ win32processZ STARTUPINFOZ lpDesktopZ CreateProcessZCREATE_NEW_CONSOLEÚ_threadÚstart_new_threadr2Ú SwitchDesktop)rZstart_explorerZsar0ZerrbufÚsZprc_infoÚthrrrr …s8 ÿ ÷ r c CsÈ|tjkr´t |¡t ddtj¡}t |tj¡}t  ¡}|  ¡}t  ¡}t |ƒ} t d| dƒD]`} tj} || d ¡dvr| tjBtjB} || d|krª| tjB} t || | || d¡qbt |tj| dd¡t |tj| dd¡t ¡\} } t |tjtjBtjB| | d|d¡} t ¡t |¡| | dkrJt|ƒnf| | dkr„t d¡t tjt|¡t|=t  !¡n,| dkr°t "|| dddtj¡}| !¡dSt #||||¡SdS) zWindow proc for the tray iconsrTr%)ZwinlogonZ disconnectzCreate new ...éZExitN)$rZWM_LBUTTONDOWNrZSetForegroundWindowr4ÚOpenInputDesktopr5ÚGetUserObjectInformationÚUOI_NAMEZGetProcessWindowStationZ EnumDesktopsZCreatePopupMenuÚlenÚrangeZ MF_STRINGÚlowerZ MF_GRAYEDZ MF_DISABLEDZ MF_CHECKEDZ AppendMenuZ GetCursorPosZTrackPopupMenuZTPM_LEFTBUTTONZ TPM_RETURNCMDZ TPM_NONOTIFYÚPumpWaitingMessagesZ DestroyMenur$ZPostQuitMessager/Z NIM_DELETEr)Úorigin_desktopr<Z OpenDesktopZ DefWindowProc)r r ZwpZlpZ curr_desktopZcurr_desktop_nameZwinstaZdesktopsÚmZ desktop_cntÚdZmf_flagsÚxÚyr0rrrr'©sZ  ÿ  ù      ÿr'Té‡é)r%)r:r6r-r+r3r rrr9r4rr$r2r r'r)r@r5rGrArBZorigin_desktop_namer!ZhinstZLoadIconr(r*r&Ústrr.rFrrrrÚs>04 $7ÿ