Afin de prévenir les utilisateurs de postes Windows que j'ai pris la main sur leur machine, je souhaiterais afficher un message du style "Maintenance en cours" qui resterait en permanence par dessus toutes les autres fenêtres. Mais ce message ne doit pas m'empêcher d'interagir avec les fenêtres qui se trouvent derrière.
J'ai pas mal fouiné sur le forum Purebasic et j'ai trouvé quelque chose qui s'en approche bien que je n'ai pas un accès aux éléments "cachés" par le texte du message :
Code : Tout sélectionner
; OpenTextWindow(ID,Height,Thickness,Flag,Font$,Text$)
; Height = Font Height
; Thickness = Font Weight entre 0 et 1000
; Flag can be: #RGN_AND or #RGN_XOR
Procedure OpenTextWindow(ID, Height, Thickness, Flag, Font$, Text$)
	Protected RectRegion.Rect
	Protected verticalOffset = 15 ; pour décaler le texte de 15 pixels vers le bas sinon il chevauche la barre de titre de la GUI et l'affichage est foireux
	
	If OpenWindow(ID, 0, 0, 500, 500, Text$, #PB_Window_SystemMenu|#WS_POPUP) ; largeur et hauteur définies arbitrairement puisque calculées précisément par la suite
		SetForegroundWindow_(WindowID(ID)) ; semble inutile ?
		WindowDC= GetDC_(WindowID(ID))
		SetWindowColor(ID, #Red) ; couleur du texte
		; cette portion de code semble modifier la taille du hDC...
		hFont = CreateFont_(Height, 0, 0, 0, Thickness, 0, 0, 0, #DEFAULT_CHARSET, #OUT_CHARACTER_PRECIS, #CLIP_DEFAULT_PRECIS, #PROOF_QUALITY, 0, Font$)
		Font = SelectObject_(WindowDC, hFont)
		BeginPath_(WindowDC)
		TextOut_(WindowDC, 0, verticalOffset, Text$, Len(Text$)) 
		EndPath_(WindowDC)
		GetTextExtentPoint32_(WindowDC, Text$, Len(Text$), sz.SIZE) ; sz\cx contient la largeur en pixel du texte et sz\cy sa hauteur
		Region1 = PathToRegion_(WindowDC)
		GetRgnBox_(Region1, RectRegion)
		Region2 = CreateRectRgnIndirect_(RectRegion)
		CombineRgn_(Region2, Region2, Region1, Flag) 
		DeleteObject_(Region1)
		ReleaseDC_(WindowID(ID), WindowDC)
		SetWindowRgn_(WindowID(ID), Region2, 1)
; 		SelectObject_(WindowDC, Font) ; semble inutile ?
		; pour mettre au premier plan, centrer le texte et ajuster la GUI à la taille du texte
		SetWindowPos_(WindowID(ID), #HWND_TOPMOST, (GetSystemMetrics_(#SM_CXSCREEN)/2) - (sz\cx)/2, 0, sz\cx, sz\cy + verticalOffset, 0)
	Else
		ProcedureReturn 0
	EndIf
	ProcedureReturn 1
EndProcedure
If OpenTextWindow(0, 70, 300, #RGN_XOR, "Verdana", "Maintenance en cours")
	Repeat
		EventID = WaitWindowEvent()
	Until EventID = #PB_Event_CloseWindow
EndIfMerci par avance.