Problème boucle while + doevent avec prog dans le systray

mcleod06 Messages postés 2 Date d'inscription jeudi 24 février 2005 Statut Membre Dernière intervention 12 avril 2005 - 11 avril 2005 à 17:26
cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 - 12 avril 2005 à 19:18
bonsoir tt le monde!

alors voila mon problème :

mon prog s'exécute dans le systray et j'effectue une boucle while qui a pour sortie une interaction avec le menu deroulant du systray, le problème c'est que je n'arrive pas à entrer dans le menu, je n'ai pas la main malgré les doevents + sleep que j'ai pu mettre
J'aimerais aussi ne pas avoir à utiliser de threads, j'ai pas confiance niveau stabilité et compatibilité avec d'autres OS.
si quelqu'un a une petite idée ça serait sympa de me donner un coup de pouce!!

6 réponses

cboulas Messages postés 2641 Date d'inscription mercredi 2 juin 2004 Statut Membre Dernière intervention 8 janvier 2014 16
11 avril 2005 à 19:05
Salut, pourquoi ne pas utiliser un timer qui vérifierais une valeur boolean que la boucle déterminerais, exemple :

Dim Value as Boolean

Sub toto....
   do while
      if x=y then
         Value=True
         exit do
      end if
   loop
End Sub

Sub Timer......
   if Value then msgbox("Valeur à True")
End sub


Parce que là vu que ta boucle tourne en rond, elle ne te laisse pas la main, car tu sature le proc.


Chris...
Web : Firstruner - eMail : [mailto:support@firstruner.com Support]&nbs
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
11 avril 2005 à 19:29
Regarde la source de Dark sur le systray tu trouvera peut-etre des réponses

http://www.vbfrance.com/code.aspx?ID=27709



Il existe près d'une centaine de sources sur ce site traitant du
systray regarde-les, tu trouvera probablement un bug dans ton code.




Si le cerveau était assez simple pour que nous puissions le comprendre,

nous serions assez bête pour ne pas le comprendre malgré tout.
cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 21
11 avril 2005 à 23:41
Salut,

Le menu affiché dans le systray est celui d'une de tes forms (voire d'une mdiForm) il suffit, à mon avis que tu joues avec la propiété visible des items de ce menu. Du genre : frm_Main.mnuOuvrir.Visible = false.

Loup Gris
crenaud76 Messages postés 4172 Date d'inscription mercredi 30 juillet 2003 Statut Membre Dernière intervention 9 juin 2006 28
12 avril 2005 à 00:09
Des Doevents, je veux bine, cela va aider l'appli à détecter un evt, mais des Sleep !!! Cela va faire dormir ton appli et bloquer toute détection d'EVT justment !! A banir dans une boucle interruptible par l'utilisateur !!!

Christophe R

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
mcleod06 Messages postés 2 Date d'inscription jeudi 24 février 2005 Statut Membre Dernière intervention 12 avril 2005
12 avril 2005 à 17:27
erf merci beaucoup pour vos réponses mais ca marche toujours pas...si je mets un bouton à l'extérieur de mon icone systray j'arrive à sortir de la boucle mais c'est l'interaction avec le systray qu'il n'arrive pas à prendre en charge pourtant avant de lancer le prog, tout se passe bien, menu deroulant etc, mais des que je le lance plus possible de faire quoi que ce soit sur l'icone du systray :/
j'ai cherché dans les propriétés de ma form sans succés et frm_Main.mnuOuvrir.Visible = false
ne fait que rendre invisible mon menu ouvrir (je cherche mais je ne vois pas l'interet ^^)
desolé de vous poser tant de problémes mais je sèche completement là, je vois pas de solutions à part peut etre une propriete ou une fonction du systray que je ne connais pas.
cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 21
12 avril 2005 à 19:18
Bon, alors un tit exemple que j'utilise :

Dans un module, tu colles ça :

Private Const NIM_ADD = &H0
Private Const NIM_MODIFY = &H1
Private Const NIM_DELETE = &H2
Private Const NIF_MESSAGE = &H1
Private Const NIF_ICON = &H2
Private Const NIF_TIP = &H4
Private Const WM_MOUSEMOVE As Long = &H200
Private Const WM_LBUTTONDOWN = &H201
Private Const WM_LBUTTONDBLCLK = &H203
Private Const WM_RBUTTONUP = &H205


Private Type NOTIFYICONDATA
cbSize As Long
hwnd As Long
uId As Long
uFlags As Long
ucallbackMessage As Long
hIcon As Long
szTip As String * 64
End Type


Private Declare Function SetForegroundWindow _
Lib "user32.dll" _
( _
ByVal hwnd As Long _
) As Long

Private Declare Function Shell_NotifyIcon _
Lib "shell32" Alias "Shell_NotifyIconA" _
( _
ByVal dwMessage As Long, _
pnid As NOTIFYICONDATA _
) As Boolean

Private nid As NOTIFYICONDATA


Public Sub Creation_TrayIcon()


' Définition des options de l'icone Tray
With nid
.cbSize = Len(nid)
.hwnd = frm_Main.hwnd
.uId = vbNull
.uFlags = NIF_ICON Or NIF_TIP Or NIF_MESSAGE
.ucallbackMessage = WM_MOUSEMOVE
.hIcon = frm_Main.Icon
.szTip = "Programme en cours d'exécution" & vbNullChar
End With

' Créer l'icone Tray
Shell_NotifyIcon NIM_ADD, nid


End Sub


Public Sub Ouvrir_Fermer(Etat As Boolean)


frm_Main.mnuOuvrir.Visible = Not Etat
frm_Main.mnuFermer.Visible = Etat
frm_Main.Visible = Etat

End Sub


Public Sub Continuer_Suspendre(Etat As Boolean)


frm_Main.mnuContinuer.Visible = Not Etat
frm_Main.mnuSuspendre.Visible = Etat

nid.szTip = IIf(Etat, "Le programme est en cours d'exécution" & vbNullChar, "Le programme est suspendu" & vbNullChar)

Shell_NotifyIcon NIM_MODIFY, nid


End Sub


' Réception des appels en provenance de l'icone Tray
Public Sub Appels_Tray(X As Single)

' La valeur de X peux varier suivant le choix du scalemode
Select Case IIf(frm_Main.ScaleMode = vbPixels, X, X / Screen.TwipsPerPixelX)
Case WM_RBUTTONUP 'Afficher le menu contextuel
SetForegroundWindow frm_Main.hwnd
frm_Main.PopupMenu frm_Main.mnuSysTray
Case WM_LBUTTONDBLCLK 'Afficher la fenetre
Ouvrir_Fermer True
End Select


End Sub


Public Sub Kill_Icone_Tray()
Shell_NotifyIcon NIM_DELETE, nid
End Sub

Public Sub Quitter()


If (MsgBox("Voulez-vous vraiment quitter l'application ?", vbQuestion + vbYesNo + vbDefaultButton2, "") = vbYes) Then
Unload frm_Main
End If

End Sub
Et dans un form (frm_Main pour l'exemple) tu crées un menu "SysTray" (mnuSysTray) avec visible false avec les items "Ouvrir" (mnuOuvrir, visible true), "Fermer" (mnuFermer, visible = false), "Suspendre" (mnuSuspendre, visible = true), "Continuer" (mnuContinuer, visible = false), "Quitter" (mnuQuitter, visible = true). Bien entendu, tous sont enable = true.

Code des différents items :

Private Sub mnuOuvrir_Click()
Ouvrir_Fermer True
End Sub


Private Sub mnuFermer_Click()
Ouvrir_Fermer False
End Sub


Private Sub mnuContinuer_Click()
Continuer_Suspendre True
End Sub


Private Sub mnuSuspendre_Click()
Continuer_Suspendre False
End Sub


Private Sub mnuQuitter_Click()
Quitter
End Sub

Et, pour terminer :

Private Sub Form_Unload(Cancel As Integer)
Kill_Icone_Tray
End Sub

J'espère que ça t'aidera.

Loup Gris
Rejoignez-nous