Page 1 sur 2
détection souris dans fenetre ou bureau
Publié : jeu. 28/févr./2008 20:37
par venom
bonsoiir,
voila je cherche mais je ne trouve pas comment faire pour que mon programme détecte si ma souris est dans ma fenetre ou sur mon bureau ( hors de ma fenetre ).
en claire
quand mon curseur est sur le bureau ma fenetre fait 600x100 et quand mon curseur est sur ma fenetre elle passe en 600x200.
bon tester mon code vous comprenderai mieu

.
sa fonctionne mais que dans un sens

ou dans les 2 sens mais seulement qu'avec un gadget.
Code : Tout sélectionner
;- Window Constants
Enumeration
#Window_0
EndEnumeration
ExamineDesktops()
DesktopName(0)
window = OpenWindow(#Window_0, 0, 0, 600, 100, "test souris", #PB_Window_SystemMenu | #PB_Window_TitleBar | #PB_Window_ScreenCentered)
If CreateGadgetList(WindowID(#Window_0))
ButtonGadget(8, 10, 10, 200, 20, "reduire")
EndIf
Repeat
EventID = WaitWindowEvent()
Select EventID
Case #WM_MOUSEMOVE
Select WindowFromPoint_(DesktopMouseX(), DesktopMouseY()); On regarde le gadget qui est sous la souris
Case WindowID(#Window_0)
ResizeWindow(#Window_0, WindowX(#Window_0), WindowY(#Window_0), 600, 200)
Case GadgetID(8)
ResizeWindow(#Window_0, WindowX(#Window_0), WindowY(#Window_0), 600, 100)
EndSelect
EndSelect
If EventID = #PB_Event_Gadget
Select EventGadget()
EndSelect
EndIf
Until EventID = #PB_Event_CloseWindow
ps: tester en passant le curseur de la souris sur le bouton vous comprendrai mieux.
désolé pour la comprehention mais je n'arrive pas trop a expliquer

.
@++
Publié : jeu. 28/févr./2008 20:56
par nico
T'es obligé de passer par un timer car i n'y a pas d'évènement qui t'indique quand la souris quitte la fenêtre.
Publié : jeu. 28/févr./2008 21:04
par Octavius
Et un truc dans ce genre ?
Code : Tout sélectionner
;- Window Constants
Enumeration
#Window_0
EndEnumeration
ExamineDesktops()
DesktopName(0)
window = OpenWindow(#Window_0, 0, 0, 600, 100, "test souris", #PB_Window_SystemMenu | #PB_Window_TitleBar | #PB_Window_ScreenCentered)
Procedure CursorDetection()
Width=WindowWidth(#Window_0)
Height=WindowHeight(#Window_0)
WinX=WindowX(#Window_0)
WinY=WindowY(#Window_0)
X=DesktopMouseX()
Y=DesktopMouseY()
Debug WinX
Debug WinY
Debug X
Debug Y
If ( X>WinX Or X>WinX+Width ) And ( Y>WinY And Y<WinY+Height )
ProcedureReturn 1
Else
ProcedureReturn 0
EndIf
EndProcedure
Repeat
If CursorDetection()=1
ResizeWindow(#Window_0,#PB_Ignore,#PB_Ignore,#PB_Ignore,200)
Else
ResizeWindow(#Window_0,#PB_Ignore,#PB_Ignore,#PB_Ignore,100)
EndIf
EventID = WaitWindowEvent()
Select EventID
Case #PB_Event_Gadget
Select EventGadget()
EndSelect
EndSelect
Until EventID = #PB_Event_CloseWindow
Publié : jeu. 28/févr./2008 21:14
par venom
T'es obligé de passer par un timer car i n'y a pas d'évènement qui t'indique quand la souris quitte la fenêtre
ok merci de tes conseille dommage qu'il n'y a pas de fonction pour la sortie d'une fenetre
merci aussi Octavius
si je comprend ton code, cette ligne:
( X>WinX Or X>WinX+Width ) And ( Y>WinY And Y<WinY+Height )
sa renvoie si le curseur est bien dans la fenêtre. si il est hors de cette distance la fenêtre réduire c'est bien sa ?
@++
Publié : jeu. 28/févr./2008 21:20
par Octavius
Oui c'est ça, mais j'ai trouvé une petite amélioration à ce sujet, ça marche mieux et c'est plus simple :
Code : Tout sélectionner
;- Window Constants
Enumeration
#Window_0
EndEnumeration
ExamineDesktops()
DesktopName(0)
window = OpenWindow(#Window_0, 0, 0, 600, 100, "test souris", #PB_Window_SystemMenu | #PB_Window_TitleBar | #PB_Window_ScreenCentered)
Procedure CursorDetection()
Width=WindowWidth(#Window_0)
Height=WindowHeight(#Window_0)
WinX=WindowX(#Window_0)
WinY=WindowY(#Window_0)
X=WindowMouseX(#Window_0)
Y=WindowMouseY(#Window_0)
If X<0 Or Y<0
ProcedureReturn 0
Else
ProcedureReturn 1
EndIf
EndProcedure
Repeat
If CursorDetection()=1
ResizeWindow(#Window_0,#PB_Ignore,#PB_Ignore,#PB_Ignore,200)
Else
ResizeWindow(#Window_0,#PB_Ignore,#PB_Ignore,#PB_Ignore,100)
EndIf
EventID = WaitWindowEvent()
Select EventID
Case #PB_Event_Gadget
Select EventGadget()
EndSelect
EndSelect
Until EventID = #PB_Event_CloseWindow
Ya encore un petit soucis, c'est que ça marche pas si tu bouges ta souris trop vite. La solution pour remédier à ce détail c'est effectivement d'utiliser un timer.
Publié : jeu. 28/févr./2008 21:27
par Octavius
Bon ça y est j'ai réglé le problème avec le timer, voici la version finale, je pense que c'est exactement ce que tu voulais, non ?
TADAAAAA!! :
Code : Tout sélectionner
;- Window Constants
Enumeration
#Window_0
EndEnumeration
ExamineDesktops()
DesktopName(0)
window = OpenWindow(#Window_0, 0, 0, 600, 100, "test souris", #PB_Window_SystemMenu | #PB_Window_TitleBar | #PB_Window_ScreenCentered)
Procedure CursorDetection()
If WindowMouseX(#Window_0)<0 Or WindowMouseY(#Window_0)<0
ResizeWindow(#Window_0,#PB_Ignore,#PB_Ignore,#PB_Ignore,100)
Else
ResizeWindow(#Window_0,#PB_Ignore,#PB_Ignore,#PB_Ignore,200)
EndIf
EndProcedure
SetTimer_(WindowID(#Window_0),0,10,@CursorDetection())
Repeat
EventID = WaitWindowEvent()
Select EventID
Case #PB_Event_Gadget
Select EventGadget()
EndSelect
EndSelect
Until EventID = #PB_Event_CloseWindow
Publié : jeu. 28/févr./2008 21:47
par venom
oui merci c'est exactement sa en plus sa fonctionne super bien avec un timer et le code est encore plus court merci a toi et nico pour le timer

.
@++
Publié : jeu. 28/févr./2008 22:04
par nico
Attention, la procédure de rappel du timer est celle ci:
CursorDetection(hwnd.l,uMsg.l,idEvent.l,dwTime.l) et non CursorDetection()
Voir MSDN
Publié : jeu. 28/févr./2008 22:50
par Octavius
Effectivement, pourtant ça marche sans problème ?! Aurais-tu une explication ? Y a-t-il un risque que ça bug dans certaines circonstances ?
Publié : ven. 29/févr./2008 9:39
par Kwai chang caine
Si ça peut vous servir.
Moi dans un de mes programmes, j'ai fait comme ça :
Code : Tout sélectionner
;- Window Constants
Enumeration
#Window_0
EndEnumeration
ExamineDesktops()
OpenWindow(#Window_0, 0, 0, 600, 100, "test souris", #PB_Window_SystemMenu | #PB_Window_TitleBar | #PB_Window_ScreenCentered)
Repeat
EventID = WindowEvent()
Delay(10)
If DesktopMouseX() < WindowX(#Window_0) Or DesktopMouseY() < WindowY(#Window_0) Or DesktopMouseX() > WindowX(#Window_0) + WindowWidth(#Window_0) Or DesktopMouseY() > WindowY(#Window_0) + WindowHeight(#Window_0)
ResizeWindow(#Window_0,#PB_Ignore,#PB_Ignore,#PB_Ignore,100)
Else
ResizeWindow(#Window_0,#PB_Ignore,#PB_Ignore,#PB_Ignore,200)
EndIf
Select EventID
EndSelect
Until EventID = #PB_Event_CloseWindow
Publié : ven. 29/févr./2008 9:54
par Ar-S
Excellent ces petits codes, ça va bien me servir

Publié : ven. 29/févr./2008 12:29
par lionel_om
Par contre la fenêtre peut être réduite, donc faut aussi tester si la fenêtre est affichée ou réduite...
Du moins si des traitements spéciaux sont à prendre en compte
Lio

Publié : ven. 29/févr./2008 16:09
par venom
oui c'est pas mal non plus Kwai chang caine

sa evite de crée une procedure et un timer.bien jouer
@++
Publié : ven. 29/févr./2008 16:28
par beauregard
Kwai chang caine a écrit :
merci

bien pratique cette commande ExamineDesktops...
par contre pour un jeu ou tout autre opération graphique, la commande Delay est à bannir...
Publié : ven. 29/févr./2008 18:31
par Kwai chang caine
par contre pour un jeu ou tout autre opération graphique, la commande Delay est à bannir...
Je ne savais pas, il faut dire que je ne fais jamais de jeu, je suis serieux moi
Le bleme c'est que si on met pas un delay, j'ai l'impression que ça occupe pas mal le proce, a cause du windowevent()
Etant donné qu'avec ça il attend pas une action la boucle tourne tout le temps.
Mais si on met un waitwindowevent alors la ça marche plus, car comme il attend un evenement fenetre et qu'on est plus dedans, il peux toujours attendre

En attendant chez moi ça tourne, quand j'aurais changé trois fois mon proce, peut etre que j'installerais un timer
