Page 1 sur 1

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

Publié : dim. 24/avr./2011 16:45
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

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

Publié : dim. 24/avr./2011 17:24
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


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

Publié : dim. 24/avr./2011 18:22
par Le Soldat Inconnu
Trop fort :D Merci

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

Publié : dim. 24/avr./2011 21:09
par Kwai chang caine
J'suis trop content d'avoir pu t'aider 8O
Merci à toi 8)

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

Publié : dim. 24/avr./2011 23:02
par Le Soldat Inconnu
ça a décoincé ce problème mais c'est le souk sur autre chose. Co...erie de Windows :mrgreen: