Probleme SSTab

Signaler
Messages postés
572
Date d'inscription
mardi 30 avril 2002
Statut
Membre
Dernière intervention
4 mai 2020
-
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
-
Slu



j essaie d utiliser un SSTab malheureusement j utilise egalement des Hotkey....

quand les Hotkey sont actifs je ne peux plus passer d un onglet a l autre dans mon sstab !!



Qqn a une soluce ?

Herve

16 réponses

Messages postés
572
Date d'inscription
mardi 30 avril 2002
Statut
Membre
Dernière intervention
4 mai 2020

up



help !!

Herve
Messages postés
572
Date d'inscription
mardi 30 avril 2002
Statut
Membre
Dernière intervention
4 mai 2020

personne n a de soluce?

Herve
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
47
je n'utilise pas les HotKey, tu peux donner un exemple ou un bout de code pour que je puisse me mettre dans le contexte stp?
PCPT
Messages postés
572
Date d'inscription
mardi 30 avril 2002
Statut
Membre
Dernière intervention
4 mai 2020

Voici la fonction qui "apparement" bloque l utilisation du SSTab



Private Sub ProcessMessages()

Dim Message As msg



Do While Not bCancel 'répéter tant que bCancel ne vaut pas True

WaitMessage 'en attente de message



'vérifie si c'est un HOTKEY-message

If PeekMessage(Message, Me.hwnd, WM_HOTKEY, WM_HOTKEY, PM_REMOVE) Then


Select Case
Message.wParam


Case Is = &HBFFE&


If (FRM_Main.WindowState = vbNormal) Then


FRM_Main.WindowState = vbMinimized


FRM_Main.Visible = False

Else


FRM_Main.WindowState = vbNormal


FRM_Main.Visible = True


FRM_Main.SetFocus

End If

Case Is = &HBFFD&

Me.Hide

CheckDB


Me.Visible = True

End Select

End If

'laisse les progs travailler

DoEvents

Loop

End Sub


Herve
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
47
umm.
ok, donc j'en déduit que cette fonction est dans une classe ou un module
...
çà va te paraître stupide, mais comme je n'ai que çà sous les yeux :
dans ton Else de &HBFFE&
(apparté : &HBFFE& = 49150, ok, mais je ne sais pas à quelle constante çà correspond...)

tu ne devrais pas mettre bCancel = False??
pourquoi continuer d'intercepter les message d'état fenêtre...
enfin, je vois que çà avec ton post

et également, en général, mais je ne suis que débutant dans ces procédures, après ce genre de fonctions, il faut un CallBack pour donner la suite du message (en l'occurrence, après le Loop)

PCPT
Messages postés
572
Date d'inscription
mardi 30 avril 2002
Statut
Membre
Dernière intervention
4 mai 2020

j ai recupere le code ici :



http://www.vbfrance.com/code.aspx?id=2594



et j ai fais un exemple avec un SStab :



http://www.megaupload.com/?d=37GEB2EV


Herve
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
47
pour ton second lien, je n'ai que la page d'accueil...

bon, l'idée est la suivante :
ta form se charge
tu ne mets pas le focus sur ta sstab (j'ai testé avec un txtbox)

quand tu changes d'onglet, soit tu click, soit tu tabules pour aller sur le sstab

donc tu auras les évènements KeyDown, KeyPress, MouseDown, MouseClick (ceux qui nous importent)
au "Down", tu passes ton Booléen à True, et tu arrêtes la procédure, et au Click et KeyPress, tu le repasses à False + procédure.
le problème est que le Hwnd n'est plus accessible, et donc le VbKeyF n'est plus utilisable (la procédure complète en fait). à ce moment, tu dois passer par un module, pour créer une sorte d'identifiant unique, pour qu'au même hWnd, à 2 utilisations différentes, 2ID soient générés...
je sais pas si c'est clair...

voilà, t'as le principe et çà fonctionne. pour l'ID, regarde ma source AfTimer, tu y verras peut-être plus clair

PCPT
Messages postés
572
Date d'inscription
mardi 30 avril 2002
Statut
Membre
Dernière intervention
4 mai 2020

Le prob c que je n accede meme pas a l evenement clic du SSTab



voici mon code test : 1 form + un SSTab !





Private Const MOD_ALT = &H1

Private Const MOD_CONTROL = &H2

Private Const MOD_SHIFT = &H4

Private Const PM_REMOVE = &H1

Private Const WM_HOTKEY = &H312



Private Type POINTAPI

x As Long

y As Long

End Type



Private Type msg

hwnd As Long

Message As Long

wParam As Long

lParam As Long

time As Long

pt As POINTAPI

End Type



Private Declare Function RegisterHotKey Lib "user32" (ByVal hwnd As
Long, ByVal ID As Long, ByVal fsModifiers As Long, ByVal vk As Long) As
Long

Private Declare Function UnregisterHotKey Lib "user32" (ByVal hwnd As Long, ByVal ID As Long) As Long

Private Declare Function PeekMessage Lib "user32" Alias "PeekMessageA"
(lpMsg As msg, ByVal hwnd As Long, ByVal wMsgFilterMin As Long, ByVal
wMsgFilterMax As Long, ByVal wRemoveMsg As Long) As Long

Private Declare Function WaitMessage Lib "user32" () As Long

Private bCancel As Boolean



Private Sub Form_Load()

ret = RegisterHotKey(Me.hwnd, &HBFFA&, MOD_CONTROL + MOD_SHIFT, vbKeyA)

bCancel = False

Show

ProcessMessages

End Sub



Private Sub ProcessMessages()

Dim Message As msg

Do While Not bCancel 'répéter tant que bCancel ne vaut pas True

WaitMessage 'en attente de message

'vérifie si c'est un HOTKEY-message

If PeekMessage(Message, Me.hwnd, WM_HOTKEY, WM_HOTKEY, PM_REMOVE) Then

Select Case Message.wParam

Case Is = &HBFFA&


Form1.Caption = "HOTKEY " & Now

End Select

End If

'laisse les progs travailler

DoEvents

Loop

End Sub



Private Sub Form_Unload(Cancel As Integer)

bCancel = True

Call UnregisterHotKey(Me.hwnd, &HBFFA&)

End Sub












Herve
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
47
ok, peut-être me suis-je mal expliqué :

en supposant ton sstab nommé SSTab1

copie çà dans ton code :

Private Sub SSTab1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
Debug.Print "MouseDown"
End Sub
Private Sub SSTab1_Click(PreviousTab As Integer)
Debug.Print "MouseClick"
End Sub

quand tu click sur un onglet, l'évènement MouseDown est reçu.
la procédure HotKey empêche le MouseClick qui aurait du venir après le MouseUp

donc à la réception du MouseDown, tu arrêtes la procédure HotKey.
le MouseUp est ensuite reçu, puis le Click
le Click quant à lui, change ton onglet, et dans cet évènement, tu relances la procédure de HotKey

c'est plus clair?
PCPT
Messages postés
572
Date d'inscription
mardi 30 avril 2002
Statut
Membre
Dernière intervention
4 mai 2020

oui ca marche pour le prob du sstab mais etranger maintenant plus moyen de quitter l app ...il ne rentre plus dans Form_Unload

Herve
Messages postés
572
Date d'inscription
mardi 30 avril 2002
Statut
Membre
Dernière intervention
4 mai 2020

n y a t il pas moyen de recupere, dans la boucle "Do While Not bCancel " le Clic du sstab et de le renvoyer sur le sstab ?

Herve
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
47
déclarations :
Dim SSTabException As Boolean

processMessages
Do While ((Not bCancel) And (Not SSTabException))

evenements
Private Sub SSTab1_Click(PreviousTab As Integer)
SSTabException = False
Debug.Print "Click = SStab FALSE"
Call ProcessMessages 'le process message est un WHILE. donc à partir du moment ou on l'aura passé le Booleen SSTabException à TRUE, la procédure s'arrêtera...
End Sub


Private Sub SSTab1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
SSTabException = True
Debug.Print "Down = SStab TRUE"
End Sub

il reste toujours le souci pour UnLoad....
PCPT
Messages postés
572
Date d'inscription
mardi 30 avril 2002
Statut
Membre
Dernière intervention
4 mai 2020

j ai essaye cela :



If PeekMessage(Message,
Me.hwnd, 513, 513, PM_REMOVE) Then 'capture du
clic


SSTab1.Tab = 2

SSTab1.SetFocus

End If



mais ca ne marche pas ....le sstab a l affichage reste sur le tab 0 ...mais la valeur est bien tab = 2 !

Herve
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
47
faut te suivre....fait moi plaisir, déclare WM_LBUTTONDOWN &H201 ' 513
çà sera plus facile pour les lecteurs

avec ton code en plus, chez moi, çà marche une fois sur 5, des fois le click droit, des fois le gauche, et quand ensuite, je presse Ctrl + Shift + A, "Erreur : un objet est requis"

t'as essayé ce que j'ai mis avant?
PCPT
Messages postés
572
Date d'inscription
mardi 30 avril 2002
Statut
Membre
Dernière intervention
4 mai 2020

ok



mais ou tu as trouve la valeur de WM_LBUTTONDOWN ???
dans l aide ils parlent de PM_QS_INPUT .... je n ai pas trouve la valeur de la variable !!! dans l aide il n y a rien



oui ca marche ce que tu avais mis.


Herve
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
47
pour avoir le nom des constantes, (VB6 pro), tu as "visionneuse d'API" qui contient déjà pas mal de constantes.
ensuite, tu peux en trouver encore sur www.Progotop.com et sur www.Allapi.net

tu peux également lancer Spy++, fourni avec VB6 pro toujours, et intercepter les messages. presques toutes les constantes (voire toutes) y sont. il te reste ensuite à lire la valeur en long, et soit l'enregistrer en constante, doit la convertir en hexa et enregistrer.

rassure toi, cette technique barbare n'est pas si souvent utile, énormément de constantes sont accessibles. il faut juste beaucoup chercher ;)

bon, bah si ma méthode fonctionne, content de t'avoir aidé ;)
reste plus qu'à valider
(dispo si besoin)

PCPT