#include #include #include #include ; Variables globales Global $GUI_size[2] = [1200, 900] ; Dimension de la fenêtre globale Global $GUI_header = 25 ; hauteur du header (titre) de la fenêtre, qui permettra de quitter et de déplacer proprement la fenêtre Global $GUI_border = 10 ; écart en pixel entre les fenêtres VNC Global $VNC_size[2] = [0, 0] ; Dimension de chaque fenêtre VNC Global $GUI_grid[2] = [1, 1] ; grille, sera redéfinie par les valeurs dans le fichier de config ; Fichier de config et données Global $CFG_file = @ScriptDir&"\"&"Config.ini", $DATA[1][8] = [[0]] ; cf plus bas pour la SdD du tableau $DATA Local $sections = IniReadSectionNames($CFG_file) If Not @error And IsArray($sections) Then For $i = 1 To $sections[0] Local $gridX = Number(IniRead($CFG_file, $sections[$i], "X", "0")) Local $gridY = Number(IniRead($CFG_file, $sections[$i], "Y", "0")) If $gridX*$gridY <> 0 Then ; Ajout d'une ligne dans le tableau $DATA $DATA[0][0] = $DATA[0][0]+1 ReDim $DATA[$DATA[0][0]+1][UBound($DATA, 2)] $DATA[$DATA[0][0]][0] = 0 ; DATA[][0] = control $DATA[$DATA[0][0]][1] = 0 ; DATA[][1] = window $DATA[$DATA[0][0]][2] = 0 ; DATA[][2] = PID $DATA[$DATA[0][0]][3] = IniRead($CFG_file, $sections[$i], "Name", "?") ; DATA[][3] = alias $DATA[$DATA[0][0]][4] = IniRead($CFG_file, $sections[$i], "IP", "127.0.0.1") & ":" & IniRead($CFG_file, $sections[$i], "Port", "5900") ; DATA[][4] = adress $DATA[$DATA[0][0]][5] = IniRead($CFG_file, $sections[$i], "Pass", "?") ; DATA[][5] = pass $DATA[$DATA[0][0]][6] = $gridX ; DATA[][6] = gridX $DATA[$DATA[0][0]][7] = $gridY ; DATA[][7] = gridY EndIf ; Procédure pour déterminer la taille max de la grille If $GUI_grid[0] < $DATA[$i][6] Then $GUI_grid[0] = $DATA[$i][6] If $GUI_grid[1] < $DATA[$i][7] Then $GUI_grid[1] = $DATA[$i][7] Next EndIf ; Recherche de la taille des VNCs en fonction des données recueillies $VNC_size[0] = ($GUI_size[0]-$GUI_border)/$GUI_grid[0] - $GUI_border $VNC_size[1] = ($GUI_size[1]-2*$GUI_border-$GUI_header)/$GUI_grid[1] - $GUI_border #Region ### DEBUG _ArrayDisplay($DATA) _ArrayDisplay($GUI_grid) _ArrayDisplay($VNC_size) #EndRegion ; GUI principale Global $GUI = GUICreate("VNC Monitor", 1200, 900, Default, Default, 0x80800000) ; $WS_POPUP = 0x80000000 ; $WS_BORDER = 0x00800000 Global $GUI_titre = GUICtrlCreateLabel("VNC Monitor ("&$GUI_grid[0]&"x"&$GUI_grid[1]&")", $GUI_border, $GUI_border, $GUI_size[0]-3*$GUI_border-$GUI_header, $GUI_header) GUICtrlSetBkColor($GUI_titre, -2) ; $GUI_BKCOLOR_TRANSPARENT = -2 GUICtrlSetFont($GUI_titre, 15, 800) GUICtrlSetStyle($GUI_titre, 0x0101) ; $SS_NOTIFY = 0x0100 ; $SS_CENTER = 0x0001 Global $GUI_quitter = GUICtrlCreateButton("X", $GUI_size[0]-$GUI_border-$GUI_header, $GUI_border, $GUI_header, $GUI_header) GUICtrlSetFont($GUI_quitter, 15, 800) ; Création des éléments graphiques For $i = 1 To $DATA[0][0] $DATA[$i][0] = GUICtrlCreateLabel($DATA[$i][3], ($GUI_border+$VNC_size[0])*($DATA[$i][6]-1)+$GUI_border, ($GUI_border+$VNC_size[1])*($DATA[$i][7]-1)+2*$GUI_border+$GUI_header, $VNC_size[0], $VNC_size[1]) GUICtrlSetBkColor($DATA[$i][0], 0xFF6633) ; ### DEBUG Création d'une fenêtre bidon pour remplacer les fenêtres VNC $DATA[$i][1] = GUICreate($DATA[$i][3]) GUISetState(@SW_SHOW, $DATA[$i][1]) WinSetOnTop($DATA[$i][1], "", True) GUISwitch($GUI) Next ; Affichage de la fenêtre GUISetState(@SW_SHOW, $GUI) ; Déplacement des fenêtres relocateWindows() setShellHook(True) ; Fonction d'arrêt avec sécurité Global $stop = False Func stop() If $stop Then Exit $stop = True EndFunc HotKeySet("{F4}", "stop") ; Boucle de traitement While Not $stop $msg = GUIGetMsg() Switch $msg Case 0 ; Rien Case $GUI_titre ; Désactivation des hooks puis des fenêtres setShellHook(False) For $i = 1 To $DATA[0][0] WinSetState($DATA[$i][1], "", @SW_HIDE) Next ; Déplacement _SendMessage($GUI, 0x0112, 0xF012, 0) ; $WM_SYSCOMMAND = 0x0112 WinActivate($GUI) ; Réactivation des hooks et des fenêtres relocateWindows(True) setShellHook(True) Case $GUI_quitter, -3 ; $GUI_EVENT_CLOSE = -3 $stop = True EndSwitch Wend ; Désactivation des hooks avant fermeture setShellHook(False) Exit ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Déplacement des fenêtres au moment opportun Func relocateWindows($reactivate = False) Local $posG = WinGetPos($GUI) For $i = 1 To $DATA[0][0] WinMove($DATA[$i][1], "" _ , $posG[0] + ($GUI_border+$VNC_size[0])*($DATA[$i][6]-1)+$GUI_border _ , $posG[1] + ($GUI_border+$VNC_size[1])*($DATA[$i][7]-1)+2*$GUI_border+$GUI_header _ , $VNC_size[0], $VNC_size[1]) If $reactivate Then WinSetState($DATA[$i][1], "", @SW_SHOW) Next EndFunc ; Fonction hook pour la gestion des focus Func WM_SHELLHOOK($hWnd, $iMsg, $wParam, $lParam) Switch $hWnd Case $GUI Switch $wParam Case $HSHELL_WINDOWACTIVATED, $HSHELL_RUDEAPPACTIVATED Local $focus = focus() ConsoleWrite($focus&@CRLF) For $i = 1 To $DATA[0][0] WinSetState($DATA[$i][1], "", $focus?@SW_SHOW:@SW_HIDE) Next EndSwitch EndSwitch EndFunc ;==>WM_SHELLHOOK ; Fonction de test si le focus est dans une fenêtre à gérer (GUI principale ou bien une fenêtre VNC) Func focus() If WinActive($GUI) Then Return $GUI For $i = 1 To $DATA[0][0] If WinActive($DATA[$i][1]) Then Return $DATA[$i][1] Next Return 0 EndFunc ; Fonction d'activation/désactivation des hooks Func setShellHook($flag) If $flag Then GUIRegisterMsg(_WinAPI_RegisterWindowMessage('SHELLHOOK'), 'WM_SHELLHOOK') _WinAPI_RegisterShellHookWindow($GUI) Else _WinAPI_DeregisterShellHookWindow($GUI) GUIRegisterMsg(_WinAPI_RegisterWindowMessage('SHELLHOOK'), '') EndIf EndFunc