Forcer une fenêtre toujours au dessus d'une autre

Programmation d'applications complexes
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Forcer une fenêtre toujours au dessus d'une autre

Message par Le Soldat Inconnu »

Salut,

Je cale sur un petit problème (enfin petit, tordu plutôt)

Voici l'idée :

J'ai 2 fenêtres ouvertes, fenêtre non PB, il s'agit de fenêtre d'un programme externe.
Et je souhaite gardé une fenêtre toujours au dessus d'une autre.

Pour cela, j'utilise
SetWindowLongPtr_(Fenetre1, #GWL_HWNDPARENT, Fenetre2)
et j'ai toujours la fenêtre 2 au dessus de la 1
en fait, je rend la fenêtre 1 enfant de la fenêtre 2

ça marche très bien sauf que, lorsque je veux inverser l'ordre des fenêtres, je me retrouve avec aucune fenêtre dans la barre des tâches jusqu'à ce que je reclique sur une fenêtre.
Et c'est ça le souci, ma fenêtre ne doit pas disparaître de la barre des tâches. (la fenêtre enfant de l'autre sera forcément non visible dans la barre des tâches mais la fenêtre parent est elle aussi non visible dans la barre des taches)


Voici mon programme d'essai :

Exécuter
Attendre 3 secondes
2 explorateurs s'ouvrent
une fenêtre au premier plan avec un bouton "inverser" apparaît
quand on clique sur "inverser", on inverse l'ordre des fenêtres (vous pouvez cliquer sur les fenêtres, l'ordre est conservée) mais je ne vois plus mes explorateurs dans la barre des tâches.

Merci de votre aide

Code : Tout sélectionner

; Auteur : Le Soldat Inconnu
; Version de PB : 4.50

Global id, id2

Procedure Inverser()
	; On inverse l'ordre des fenêtres
	
	SetWindowLongPtr_(id, #GWL_HWNDPARENT, 0)
	Temporaire = id2
	id2 = id
	id = Temporaire
	SetWindowLongPtr_(id, #GWL_HWNDPARENT, id2)
	SetWindowPos_(id2, id, 0, 0, 0, 0, #SWP_NOMOVE | #SWP_NOSIZE | #SWP_NOACTIVATE)
	
EndProcedure


RunProgram("explorer.exe", "c:\", "")
Delay(1000)
id2 = GetForegroundWindow_()
ShowWindow_(id2, #SW_SHOWNORMAL)

RunProgram("explorer.exe", "c:\users", "")
Delay(1000)
id = GetForegroundWindow_()
ShowWindow_(id, #SW_SHOWNORMAL)

If OpenWindow(0, 0, 0, 300, 150, "Groupe Exploreur", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget) = 0
	End
EndIf

ButtonGadget(0, 20, 20, 100, 24, "Inverser")

SetWindowLongPtr_(id, #GWL_HWNDPARENT, id2)

StickyWindow(0, 1)

Repeat
	Event = WaitWindowEvent(50)
	
	Select Event
		Case #PB_Event_Gadget
			Select EventGadget()
				Case 0
					
					Inverser()
					
			EndSelect
			
		Case #WM_MOUSEMOVE
			If GetForegroundWindow_() <> WindowID(0)
				If WindowFromPoint_(DesktopMouseX() | DesktopMouseY() << 32) = GadgetID(0)
					If Depart = 0
						
						Inverser()
						
					EndIf
					Depart = 1
				Else
					Depart = 0
				EndIf
			EndIf
	EndSelect
	
Until Event = #PB_Event_CloseWindow
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Forcer une fenêtre toujours au dessus d'une autre

Message par Kwai chang caine »

Bon encore une fois je vais tenter ma chance, en fin de compte 100% des gagnants au LOTO ont joué :lol:
Je suis peut être encore à coté de la plaque, mais j'ai ajouté un code de TsSoft à ton code et l'on voit les deux fenêtres dans la barre des taches

On peut aussi les faire alterner, si on déplace les appels, mais j'ai eu un problème au démarrage, ce n'était pas la bonne qui apparaissait :(
Je pense que toi tu va savoir mettre les appels ou bon endroit pour que ce soit la bonne qui apparaisse :D
Enfin, si ça peut t'aider pour une fois :mrgreen:

Code : Tout sélectionner

; Auteur : Le Soldat Inconnu
; Version de PB : 4.50
   
Global id, id2

Procedure HideFromTaskBar(hWnd.l, Flag.l)
  Protected TBL.ITaskbarList

  CoInitialize_(0)
  If CoCreateInstance_(?CLSID_TaskBarList, 0, 1, ?IID_ITaskBarList, @TBL) = #S_OK
    TBL\HrInit()
    If Flag
      TBL\DeleteTab(hWnd)
    Else
      TBL\AddTab(hWnd)
    EndIf
    TBL\Release()
  EndIf
  CoUninitialize_()

  DataSection
    CLSID_TaskBarList:
    Data.l $56FDF344
    Data.w $FD6D, $11D0
    Data.b $95, $8A, $00, $60, $97, $C9, $A0, $90
    IID_ITaskBarList:
    Data.l $56FDF342
    Data.w $FD6D, $11D0
    Data.b $95, $8A, $00, $60, $97, $C9, $A0, $90
  EndDataSection
EndProcedure
 
Procedure Inverser()
   ; On inverse l'ordre des fenêtres
   
   SetWindowLongPtr_(id, #GWL_HWNDPARENT, 0)
   Temporaire = id2
   id2 = id
   id = Temporaire
   SetWindowLongPtr_(id, #GWL_HWNDPARENT, id2)
   SetWindowPos_(id2, id, 0, 0, 0, 0, #SWP_NOMOVE | #SWP_NOSIZE | #SWP_NOACTIVATE)
   HideFromTaskbar(id,0)
   HideFromTaskbar(id2,0)
   
EndProcedure
 
RunProgram("explorer.exe", "c:\", "")
Delay(1000)
id2 = GetForegroundWindow_()
ShowWindow_(id2, #SW_SHOWNORMAL)


RunProgram("explorer.exe", "c:\Documents and Settings", "")
Delay(1000)
id = GetForegroundWindow_()
ShowWindow_(id, #SW_SHOWNORMAL)

HideFromTaskbar(id,0)
HideFromTaskbar(id2,0)

If OpenWindow(0, 0, 0, 300, 150, "Groupe Exploreur", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget) = 0
   End
EndIf

ButtonGadget(0, 20, 20, 100, 24, "Inverser")

SetWindowLongPtr_(id, #GWL_HWNDPARENT, id2)

StickyWindow(0, 1)


Repeat
   Event = WaitWindowEvent(50)
   
   Select Event
      Case #PB_Event_Gadget
         Select EventGadget()
            Case 0
               
               Inverser()
               
         EndSelect
         
      Case #WM_MOUSEMOVE
         If GetForegroundWindow_() <> WindowID(0)
            If WindowFromPoint_(DesktopMouseX() | DesktopMouseY() << 32) = GadgetID(0)
               If Depart = 0
                  
                  Inverser()
              
               EndIf
               Depart = 1
            Else
               Depart = 0
            EndIf
         EndIf
   EndSelect
   
Until Event = #PB_Event_CloseWindow

ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Re: Forcer une fenêtre toujours au dessus d'une autre

Message par Le Soldat Inconnu »

Trop fort :D Merci
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Forcer une fenêtre toujours au dessus d'une autre

Message par Kwai chang caine »

J'suis trop content d'avoir pu t'aider 8O
Merci à toi 8)
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Re: Forcer une fenêtre toujours au dessus d'une autre

Message par Le Soldat Inconnu »

ça a décoincé ce problème mais c'est le souk sur autre chose. Co...erie de Windows :mrgreen:
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Répondre