Page 1 sur 1
Trou dans une fenêtre sans pouvoir cliquer au travers
Publié : ven. 18/févr./2011 20:57
par Le Soldat Inconnu
Salut,
Une bizarrerie sur Windows 7
J'ai fais une fenêtre avec un trou pour voir les fenêtres dessous sauf qu'il est impossible de cliquer sur la fenêtre de dessous.
Code : Tout sélectionner
If OpenWindow(0, 0, 0, 800, 600, "Groupe Exploreur", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget) = 0
End
EndIf
SetLayeredWindow(WindowID(0))
SetLayeredWindowAttributes(WindowID(0), -1, $FF00FE)
OpenWindow(1, 0, 0, 200, 200, "Trou", #PB_Window_BorderLess, WindowID(0))
SetWindowColor(1, $FF00FE)
SetParent_(WindowID(1), WindowID(0))
Style = GetWindowLongPtr_(WindowID(1), #GWL_STYLE)
SetWindowLongPtr_(WindowID(1), #GWL_STYLE, (Style | #WS_CHILDWINDOW) & ~#WS_TILEDWINDOW)
SetWindowPos_(WindowID(1), 0, 100, 100, 300, 300, 0)
Repeat
Event = WaitWindowEvent()
Select Event
Case #PB_Event_Menu
Select EventMenu() ; Menus
EndSelect
Case #PB_Event_Gadget
Select EventGadget() ; Gadgets
EndSelect
EndSelect
Until Event = #PB_Event_CloseWindow
ça le fait sur d'autre version de windows ?
Et si je veux pouvoir cliquer au travers, comment dois-je procéder ?

Parce que j'en ai besoin
Re: Trou dans une fenêtre sans pouvoir cliquer au travers
Publié : ven. 18/févr./2011 21:08
par boddhi
Sous XP SP3, ça fonctionne correctement...
La fenêtre du dessous reprend bien le focus...
Je vais tester sous Vista
Re: Trou dans une fenêtre sans pouvoir cliquer au travers
Publié : ven. 18/févr./2011 21:11
par boddhi
Bon, bah fonctionne pas sous Vista SP2
Re: Trou dans une fenêtre sans pouvoir cliquer au travers
Publié : ven. 18/févr./2011 21:23
par Le Soldat Inconnu
pff, si quelqu'un a une solution autre que d'utiliser des régions ( SetWindowRgn_ ), je suis preneur
Re: Trou dans une fenêtre sans pouvoir cliquer au travers
Publié : ven. 18/févr./2011 21:30
par boddhi
J'ai remarqué un comportement étrange de la fenêtre, je ne sais pas si il y a un lien ou si c'est une conséquence logique, je te le signale toutefois :
Une fois la fenêtre affichée, lorsque tu cliques sur une fenêtre située en dessous mais hors de la fenêtre "Groupe Exploreur", le raccourci dans la barre des tâches ne réagit pas correctement lorsque tu veux ramener cette dernière au premier plan.
Il faut cliquer plusieurs fois dessus pour qu'elle revienne au premier plan alors que ce n'est pas le cas pour toute autre fenêtre...
Et cela aussi bien sous XP que sous Vista.
Re: Trou dans une fenêtre sans pouvoir cliquer au travers
Publié : ven. 18/févr./2011 21:49
par nico
marche sur vista sp2 32bits,
t'es obliger d'utiliser une fenetre sinon essaye avec un gadget image.
Re: Trou dans une fenêtre sans pouvoir cliquer au travers
Publié : dim. 20/févr./2011 21:12
par Le Soldat Inconnu
Salut Nico,
ce n'est pas mieux avec un imagegadget ou containergadget.
Bref je cale.
Code : Tout sélectionner
; Auteur : Le Soldat Inconnu
; Version de PB : 4.50
If OpenWindow(0, 0, 0, 800, 600, "Groupe Exploreur", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget) = 0
End
EndIf
RunProgram("explorer.exe", "C:\", "")
Delay(2000)
id = GetForegroundWindow_()
SetParent_(id, WindowID(0))
Style = GetWindowLongPtr_(id, #GWL_STYLE)
SetWindowLongPtr_(id, #GWL_STYLE, (Style | #WS_CHILDWINDOW) & ~#WS_TILEDWINDOW)
SetLayeredWindow(WindowID(0))
SetLayeredWindowAttributes(WindowID(0), -1, $FF00FE)
CreateImage(1, 300, 300, 24)
StartDrawing(ImageOutput(1))
Box(0, 0, 300, 300, $FF00FE)
StopDrawing()
ImageGadget(1, 0, 0, 300, 300, ImageID(1))
; ContainerGadget(1, 100, 100, 300, 300, #PB_Container_BorderLess)
; SetGadgetColor(1, #PB_Gadget_BackColor, $FF00FE)
; CloseGadgetList()
; OpenWindow(1, 0, 0, 200, 200, "Trou", #PB_Window_BorderLess, WindowID(0))
; SetWindowColor(1, $FF00FE)
;
; SetParent_(WindowID(1), WindowID(0))
; Style = GetWindowLongPtr_(WindowID(1), #GWL_STYLE)
; SetWindowLongPtr_(WindowID(1), #GWL_STYLE, (Style | #WS_CHILDWINDOW) & ~#WS_TILEDWINDOW)
; SetWindowPos_(WindowID(1), 0, 100, 100, 300, 300, 0)
Repeat
Event = WaitWindowEvent()
Select Event
Case #PB_Event_Menu
Select EventMenu() ; Menus
EndSelect
Case #PB_Event_Gadget
Select EventGadget() ; Gadgets
EndSelect
Case #PB_Event_SizeWindow
SetWindowPos_(id, GadgetID(1), 0, 0, WindowWidth(0), WindowHeight(0), 0)
EndSelect
Until Event = #PB_Event_CloseWindow
Re: Trou dans une fenêtre sans pouvoir cliquer au travers
Publié : lun. 21/févr./2011 17:37
par nico
J'ai essayé ce code hier, ça ne marchait pas et aujourd'hui; ça roule!
J'avais déjà remarquer des problèmes avec cette api.
Doit y avoir un truc, mais quoi, j'ai pas trouvé!
Re: Trou dans une fenêtre sans pouvoir cliquer au travers
Publié : jeu. 24/févr./2011 12:42
par nico
Je viens de réessayer ton premier code et je me suis aperçu qu'en changeant la couleur de transparence à:
FF00FF
cela fonctionnait!
Il y a d'autre couleur de transparence qui pose problème comme le blanc!
Sinon, pour le 2ème code, celui ci fonctionne chez moi:
Code : Tout sélectionner
; Auteur : Le Soldat Inconnu
; Version de PB : 4.50
ProcedureDLL SetLayeredWindow(WindowID) ; Mettre l'attribut WS_EX_LAYERED à la fenêtre
SetWindowLong_(WindowID, #GWL_EXSTYLE, GetWindowLong_(WindowID, #GWL_EXSTYLE) | #WS_EX_LAYERED) ; Mettre l'attribut WS_EX_LAYERED à la fenêtre
EndProcedure
ProcedureDLL SetLayeredWindowAttributes(WindowID.l, Alpha.l, Color.l) ; Transparence et forme de la fenêtre
Protected Parametre.l
If Alpha > 0
Parametre | #LWA_ALPHA
Else
Alpha = 255
EndIf
If Color > 0
Parametre | #LWA_COLORKEY
Else
Color = 0
EndIf
SetLayeredWindowAttributes_(WindowID, Color, Alpha, Parametre)
EndProcedure
Procedure WinCallback(hWnd, uMsg, wParam, lParam)
; Nous pouvons tester dans la callback les paramètres renseignés automatiquement par windows
If uMsg = #WM_NCHITTEST
Debug "popo"
ProcedureReturn #HTTRANSPARENT
EndIf
ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure
; Auteur : Le Soldat Inconnu
; Version de PB : 4.50
If OpenWindow(0, 0, 0, 800, 600, "Groupe Exploreur", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget) = 0
End
EndIf
SetLayeredWindow(WindowID(0))
SetLayeredWindowAttributes(WindowID(0), -1, $FF00FF)
RunProgram("explorer.exe", "C:\", "")
Delay(5000)
id = GetForegroundWindow_()
SetParent_(id, WindowID(0))
Style = GetWindowLongPtr_(id, #GWL_STYLE)
SetWindowLongPtr_(id, #GWL_STYLE, (Style | #WS_CHILDWINDOW) & ~#WS_TILEDWINDOW)
If CreateImage(1, 300, 300, 32)
If StartDrawing(ImageOutput(1))
Box(0, 0, 300, 300, $FF00FF)
StopDrawing()
EndIf
EndIf
ImageGadget(1, 0, 0, 300, 300, ImageID(1))
SetWindowPos_(GadgetID(1),id,0,0,0,0,3)
Repeat
Event = WaitWindowEvent()
Select Event
Case #PB_Event_Menu
Select EventMenu() ; Menus
EndSelect
Case #PB_Event_Gadget
Select EventGadget() ; Gadgets
EndSelect
Case #PB_Event_SizeWindow
SetWindowPos_(id, GadgetID(1), 0, 0, WindowWidth(0), WindowHeight(0), 0)
EndSelect
Until Event = #PB_Event_CloseWindow
Dis moi si ça résoud ton problème?
Re: Trou dans une fenêtre sans pouvoir cliquer au travers
Publié : jeu. 24/févr./2011 13:21
par Ar-S
Je confirme en 7x64 ça marche, par contre la fenêtre explorer met un bon moment à se transformer pour faire apparaitre le carré transparent.
Re: Trou dans une fenêtre sans pouvoir cliquer au travers
Publié : sam. 26/févr./2011 15:30
par Le Soldat Inconnu
pour le délai, c'est normal

c'est codé par un cochon.
Sinon, bien vu pour le coup de la couleur
C'est vraiment bizarre ça
Re: Trou dans une fenêtre sans pouvoir cliquer au travers
Publié : dim. 27/févr./2011 19:19
par nico
De rien, on a toujours besoin d'un meilleur codeur que soi!
