Problème boucle while + doevent avec prog dans le systray
mcleod06
Messages postés2Date d'inscriptionjeudi 24 février 2005StatutMembreDernière intervention12 avril 2005
-
11 avril 2005 à 17:26
cs_CanisLupus
Messages postés3757Date d'inscriptionmardi 23 septembre 2003StatutMembreDernière intervention13 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!!
cboulas
Messages postés2641Date d'inscriptionmercredi 2 juin 2004StatutMembreDernière intervention 8 janvier 201416 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_CanisLupus
Messages postés3757Date d'inscriptionmardi 23 septembre 2003StatutMembreDernière intervention13 mars 200620 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.
crenaud76
Messages postés4172Date d'inscriptionmercredi 30 juillet 2003StatutMembreDernière intervention 9 juin 200629 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 ?
mcleod06
Messages postés2Date d'inscriptionjeudi 24 février 2005StatutMembreDernière intervention12 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.
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