[VB6]Catcher les messages windows (du type WM_....) (OnToolTipShow)

Catcher les messages windows (du type WM_....) (OnToolTipShow) [VB6] - VB/VBA/VBS - Programmation

Marsh Posté le 18-10-2002 à 09:55:16    

Comment intercepter les messages windows sous VB ?
 
Merci
 
 :hello:


Message édité par [SDF]Poire le 22-10-2002 à 14:16:14

---------------
Des bons sites pour Delphi? http://forum.hardware.fr/forum2.php3?post=16838&cat=10 -- informaticien -- http://www.z0rglub.com/phpwebgallery/ -- Delphi :love:
Reply

Marsh Posté le 18-10-2002 à 09:55:16   

Reply

Marsh Posté le 18-10-2002 à 12:54:35    

:bounce:


---------------
Des bons sites pour Delphi? http://forum.hardware.fr/forum2.php3?post=16838&cat=10 -- informaticien -- http://www.z0rglub.com/phpwebgallery/ -- Delphi :love:
Reply

Marsh Posté le 18-10-2002 à 15:38:47    

:bounce:  :bounce:


---------------
Des bons sites pour Delphi? http://forum.hardware.fr/forum2.php3?post=16838&cat=10 -- informaticien -- http://www.z0rglub.com/phpwebgallery/ -- Delphi :love:
Reply

Marsh Posté le 18-10-2002 à 15:43:28    

Y a pas de hook sous VB?  :D


---------------
Informaticien.be - Lancez des défis à vos amis
Reply

Marsh Posté le 18-10-2002 à 15:43:56    

euh enfin, tu veux faire quoi ?  :o


---------------
Informaticien.be - Lancez des défis à vos amis
Reply

Marsh Posté le 18-10-2002 à 15:57:43    

veux faire comme sous Delphi  :D


---------------
Des bons sites pour Delphi? http://forum.hardware.fr/forum2.php3?post=16838&cat=10 -- informaticien -- http://www.z0rglub.com/phpwebgallery/ -- Delphi :love:
Reply

Marsh Posté le 18-10-2002 à 16:09:24    

cad?
un hook?
 
=> API alors hein  :sarcastic:


---------------
Informaticien.be - Lancez des défis à vos amis
Reply

Marsh Posté le 18-10-2002 à 16:15:31    

pas vraiment un hook
 
procedure bidule(message truc); message machin;
 
enfin tu vois


---------------
Des bons sites pour Delphi? http://forum.hardware.fr/forum2.php3?post=16838&cat=10 -- informaticien -- http://www.z0rglub.com/phpwebgallery/ -- Delphi :love:
Reply

Marsh Posté le 18-10-2002 à 16:17:08    


Ah ouai je vois
 
La je sais pas  :sweat:


---------------
Informaticien.be - Lancez des défis à vos amis
Reply

Marsh Posté le 18-10-2002 à 16:20:00    

zion a écrit a écrit :

 
Ah ouai je vois
 
La je sais pas  :sweat:  




Beh moi non + :'(
et avec API C la merde (hook) ... (je pige po C le bourdel)
 
tout ça pour faire l'OnShowTip de Application ds Delphi  :cry:  
VB sucks  :gun:


---------------
Des bons sites pour Delphi? http://forum.hardware.fr/forum2.php3?post=16838&cat=10 -- informaticien -- http://www.z0rglub.com/phpwebgallery/ -- Delphi :love:
Reply

Marsh Posté le 18-10-2002 à 16:20:00   

Reply

Marsh Posté le 18-10-2002 à 16:57:42    

Faut que tu "subclass" ta fenetre
 
http://www.vbaccelerator.com/
-> Articles
-> Subclassing Without The Crashes
 
c'est une dll (t'as les sources si tu veux intégrer ca dans ton projet) qui te permet d'attacher des messages et ca t'appelle une fonction spéciale pour les messages attachés.
tu te retrouves avec une sorte de WndProc pour tes messages attachés.

Reply

Marsh Posté le 18-10-2002 à 17:00:15    

Pq faire simple quand on peu faire compliqué...
 
Je voudrais pas trop de trucs externe...
 
Mais comment vs faite pour coder sans jamais utiliser les messages ?  :sweat:  
C naze on peu rien faire avec VB  :(


---------------
Des bons sites pour Delphi? http://forum.hardware.fr/forum2.php3?post=16838&cat=10 -- informaticien -- http://www.z0rglub.com/phpwebgallery/ -- Delphi :love:
Reply

Marsh Posté le 18-10-2002 à 17:04:56    

[SDF]Poire a écrit a écrit :

Pq faire simple quand on peu faire compliqué...
 
Je voudrais pas trop de trucs externe...
 
Mais comment vs faite pour coder sans jamais utiliser les messages ?  :sweat:  
C naze on peu rien faire avec VB  :(  




 
Si je me rappelle bien il y a un autre truc beaucoup plus simple.
 
manque de bol, je viens de virer vb6 et je suis entrain de mettre vb.net
 
je vais essayer de retrouver ça dans un de mes listing

Reply

Marsh Posté le 18-10-2002 à 19:53:32    

bossamiral2 a écrit a écrit :

 
 
Si je me rappelle bien il y a un autre truc beaucoup plus simple.
 
manque de bol, je viens de virer vb6 et je suis entrain de mettre vb.net
 
je vais essayer de retrouver ça dans un de mes listing




ça serait cool merci :)
 
 :hello:


---------------
Des bons sites pour Delphi? http://forum.hardware.fr/forum2.php3?post=16838&cat=10 -- informaticien -- http://www.z0rglub.com/phpwebgallery/ -- Delphi :love:
Reply

Marsh Posté le 19-10-2002 à 00:39:55    

Vi, c'est du subclassing, exemple :
 

Code :
  1. ' Dans un module
  2. Option Explicit
  3. ' Nos constantes
  4. Public Const WM_COMMAND = &H111
  5. Public Const WM_USER = &H400
  6. Public Const WM_QUIT = &H12
  7. Public Const GWL_WNDPROC = (-4)
  8. ' Nos Apis
  9. Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
  10. Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
  11. Public Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
  12. Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
  13. ' identification de notre fonction de rappel (type CALLBACK en C WIN32)
  14. Public m_OldWindowProc As Long
  15. '----------------------------------------------------------------------------------------------------
  16. ' Sous classement de l'application pour répondres aux messages
  17. '----------------------------------------------------------------------------------------------------
  18. Public Function WindowProc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
  19.     Select Case Msg
  20.         Case WM_QUIT:
  21.             MsgBox "bye ! ;)"
  22.             Exit Function
  23.        
  24.         Case WM_COMMAND:
  25.             Form1.List1.AddItem "WM_COMMAND::wParam = " & Hex(wParam)
  26.            
  27.         Case WM_USER:
  28.             Form1.List1.AddItem "WM_USER::lParam = " & Hex(lParam)
  29.                    
  30.         Case Else:
  31.             ' CPU utilisé à 100 %, un sleep s'impose ou dans un thread
  32.             'Form1.List1.AddItem "WM_MSG = " & Hex(msg)
  33.            
  34.     End Select
  35.     ' Envoye les autres messages a la fonction original de la fenetre
  36.     WindowProc = CallWindowProc(m_OldWindowProc, hwnd, Msg, wParam, lParam)
  37.        
  38. End Function
  39. ' Dans ta form : rajoute une listbox, et différents éléments (boutons, checkbox, scrollbar ...) et joue avec
  40. Option Explicit
  41. Private Sub Form_Load()
  42.    
  43.     ' on met notre fonction de rappel dans la liste des autres fonctions que windows
  44.     ' doit traiter pour l'envoye/reception de messages
  45.     m_OldWindowProc = SetWindowLong(Me.hwnd, GWL_WNDPROC, AddressOf WindowProc)
  46. End Sub
  47. Private Sub Form_Unload(Cancel As Integer)
  48.     ' on arrete tout
  49.     Call SetWindowLong(hwnd, GWL_WNDPROC, m_OldWindowProc)
  50.     ' évite certains plantage occasionnels
  51.     Call SendMessage(hwnd, WM_QUIT, ByVal 0&, ByVal 0&)
  52. End Sub


 
Note : à lancer depuis l'executable. (pas depuis l'IDE)

Reply

Marsh Posté le 20-10-2002 à 15:54:44    

KarLKoX a écrit a écrit :

Vi, c'est du subclassing, exemple :
 

Code :
  1. ' Dans un module
  2. Option Explicit
  3. ' Nos constantes
  4. Public Const WM_COMMAND = &H111
  5. Public Const WM_USER = &H400
  6. Public Const WM_QUIT = &H12
  7. Public Const GWL_WNDPROC = (-4)
  8. ...
  9. Private Sub Form_Unload(Cancel As Integer)
  10.     ' on arrete tout
  11.     Call SetWindowLong(hwnd, GWL_WNDPROC, m_OldWindowProc)
  12.     ' évite certains plantage occasionnels
  13.     Call SendMessage(hwnd, WM_QUIT, ByVal 0&, ByVal 0&)
  14. End Sub


 
Note : à lancer depuis l'executable. (pas depuis l'IDE)




 
Merci je teste ça lundi au boulo
 :hello:


---------------
Des bons sites pour Delphi? http://forum.hardware.fr/forum2.php3?post=16838&cat=10 -- informaticien -- http://www.z0rglub.com/phpwebgallery/ -- Delphi :love:
Reply

Marsh Posté le 20-10-2002 à 16:28:29    

en fait, la dll du site que j'ai indiqué, tu peux inclure les sources dans ton projet, c assez facile.
ca fait un peu la meme chose que l'exemple de code donné, mais en mieux. (lis l'article, tu comprendras pourquoi ca peut foirer dans certains cas, et donc pourquoi faut faire comme le mec a fait)
J'ajouterai que le mec de vbaccelerator est un putain de guru en prog windows....

Reply

Marsh Posté le 21-10-2002 à 11:06:58    

voilou
ds un module G :

Option Explicit
 
Public Const WM_COMMAND = &H111
Public Const WM_USER = &H400
Public Const WM_QUIT = &H12
Public Const GWL_WNDPROC = (-4)
Public Const WM_NOTIFY = &H4E
 
Public Const TTN_FIRST = (-520) ' #define TTN_FIRST               (0U-520U)
Public Const TTN_SHOW = TTN_FIRST - 1 ' #define TTN_SHOW
 
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Public Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
 
Public m_OldWindowProc As Long
 
Public fs, a
 
Public Function WindowProc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    Select Case Msg
        Case WM_QUIT:
            MsgBox "bye ! ;)"
            Exit Function
           
        Case WM_NOTIFY
            MsgBox "notify"
             
        Case TTN_SHOW:
            Form1.StatusBar1.SimpleText = "test"
               
        Case Else:
            ' CPU utilisé à 100 %, un sleep s'impose ou dans un thread
            'Form1.List1.AddItem "WM_MSG = " & Hex(msg)
    End Select
   
    ' Envoye les autres messages a la fonction original de la fenetre
    WindowProc = CallWindowProc(m_OldWindowProc, hwnd, Msg, wParam, lParam)
  End Function


 
ds ma form G :

Private Sub Form_Load()
    Randomize
    m_OldWindowProc = SetWindowLong(Me.hwnd, GWL_WNDPROC, AddressOf WindowProc)
End Sub
 
Private Sub Form_Unload(Cancel As Integer)
    Call SetWindowLong(hwnd, GWL_WNDPROC, m_OldWindowProc)
    Call SendMessage(hwnd, WM_QUIT, ByVal 0&, ByVal 0&)
End Sub


 
Lorsque une ToolTip apparait G ni le msg WM_NOTIFY ni TTN_SHOW qui est catché...
Ou est le pb ?
(ça catch bien des msg G testé...)
Mauvaise déclaration pour les messages ?
 
 :hello:


---------------
Des bons sites pour Delphi? http://forum.hardware.fr/forum2.php3?post=16838&cat=10 -- informaticien -- http://www.z0rglub.com/phpwebgallery/ -- Delphi :love:
Reply

Marsh Posté le 21-10-2002 à 11:26:56    

mmhh je viens de lire la MSDN et ca s'utilise pas comme ca.
Il faut que tu geres les "sous messages" de WM_NOTIFY. Lorsque tu recoies WM_NOTIFIE et que tu veux gérer les tooltips, tu as en lparam un pointeur sur une structure NMHDR qui ressemble a ca (en C) :
 

Code :
  1. typedef struct tagNMHDR {
  2.     HWND hwndFrom;
  3.     UINT idFrom;
  4.     UINT code;
  5. } NMHDR;


 
en VB (pas testé) :
 

Code :
  1. type tagNMHDR
  2.     hwndFrom    as Long
  3.     idFrom      as Long
  4.     code        as Long
  5. end type


 
Une fois ce pointeur récupéré, tu dois tester si le membre hwndFrom correspond bien au hwnd de ton application (me.hwnd en VB). Ensuite tu n'as plus qu'a faire un Select Case sur le membre code, code = TTN_SHOW dans ton cas.
J'ai volontairement pas donné le code mais si tu fais ca dans cet ordre, ca doit marcher, pis si tu arrives vraiement pas, je serais la ;)

Reply

Marsh Posté le 21-10-2002 à 11:30:39    

KarLKoX a écrit a écrit :

mmhh je viens de lire la MSDN et ca s'utilise pas comme ca.
Il faut que tu geres les "sous messages" de WM_NOTIFY. Lorsque tu recoies WM_NOTIFIE et que tu veux gérer les tooltips, tu as en lparam un pointeur sur une structure NMHDR qui ressemble a ca (en C) :
 

Code :
  1. typedef struct tagNMHDR {
  2.     HWND hwndFrom;
  3.     UINT idFrom;
  4.     UINT code;
  5. } NMHDR;


 
en VB (pas testé) :
 

Code :
  1. type tagNMHDR
  2.     hwndFrom    as Long
  3.     idFrom      as Long
  4.     code        as Long
  5. end type


 
Une fois ce pointeur récupéré, tu dois tester si le membre hwndFrom correspond bien au hwnd de ton application (me.hwnd en VB). Ensuite tu n'as plus qu'a faire un Select Case sur le membre code, code = TTN_SHOW dans ton cas.
J'ai volontairement pas donné le code mais si tu fais ca dans cet ordre, ca doit marcher, pis si tu arrives vraiement pas, je serais la ;)




Je C ça  
Le pb C qu'il catch même po le WM_NOTIFY  :cry:  
 
Merci de ton aide
(suis sous VB6/Win98)


---------------
Des bons sites pour Delphi? http://forum.hardware.fr/forum2.php3?post=16838&cat=10 -- informaticien -- http://www.z0rglub.com/phpwebgallery/ -- Delphi :love:
Reply

Marsh Posté le 21-10-2002 à 13:50:11    

:bounce:


---------------
Des bons sites pour Delphi? http://forum.hardware.fr/forum2.php3?post=16838&cat=10 -- informaticien -- http://www.z0rglub.com/phpwebgallery/ -- Delphi :love:
Reply

Marsh Posté le 21-10-2002 à 15:23:51    

Je suis au taf, ze peut pas tester pour l'instant.
Sinon, essaye de sous classer un bouton qui a un tooltip juste pour voir ce qui se passe ... (pense a passer l'hwnd du bouton dans SetWindowLong).

Reply

Marsh Posté le 22-10-2002 à 09:21:39    

KarLKoX a écrit a écrit :

Je suis au taf, ze peut pas tester pour l'instant.
Sinon, essaye de sous classer un bouton qui a un tooltip juste pour voir ce qui se passe ... (pense a passer l'hwnd du bouton dans SetWindowLong).




Ce qui se passe C que ça me crash le programme  :D  
 
Personnu a un exemple simple qui marche ?


Message édité par [SDF]Poire le 22-10-2002 à 10:27:27

---------------
Des bons sites pour Delphi? http://forum.hardware.fr/forum2.php3?post=16838&cat=10 -- informaticien -- http://www.z0rglub.com/phpwebgallery/ -- Delphi :love:
Reply

Marsh Posté le 22-10-2002 à 10:15:12    

? Peut-être http://www.experts-exchange.com/Pr [...] 19306.html
 
Sinon
 
http://www.google.fr/search?q=catc [...] l=fr&meta=
 
Y a MSGBLAST.VBX mais pour VB2 et 3 (donc 16 bits).

Reply

Marsh Posté le 22-10-2002 à 11:08:06    

G testé avec le truc de VBaccelerator (leur exemple) et ça marche pas non +
pourtant d'aprés la doc quand un tooltip s'affiche il rise un WM_NOTIFY
Mais est-ce que G la bonne valeur pour le message ?


---------------
Des bons sites pour Delphi? http://forum.hardware.fr/forum2.php3?post=16838&cat=10 -- informaticien -- http://www.z0rglub.com/phpwebgallery/ -- Delphi :love:
Reply

Marsh Posté le 22-10-2002 à 13:04:05    

Ca doit être un coup de VB6 !! Heureusement que je suis resté à la version 3 16 bits :D.
 
Dans l'aide/doc VB6, ils n'en causent pas ? C'est peut-être "(des)intégré" voire natif ?
 
Up !

Reply

Marsh Posté le 22-10-2002 à 13:11:49    

carbon_14 a écrit a écrit :

Ca doit être un coup de VB6 !! Heureusement que je suis resté à la version 3 16 bits :D.
 
Dans l'aide/doc VB6, ils n'en causent pas ? C'est peut-être "(des)intégré" voire natif ?
 
Up !




Parler de ça ds l'aide ?  :lol:  
C microsoft qui a fait l'aide hein...  :D


---------------
Des bons sites pour Delphi? http://forum.hardware.fr/forum2.php3?post=16838&cat=10 -- informaticien -- http://www.z0rglub.com/phpwebgallery/ -- Delphi :love:
Reply

Marsh Posté le 22-10-2002 à 14:11:19    

:bounce:


---------------
Des bons sites pour Delphi? http://forum.hardware.fr/forum2.php3?post=16838&cat=10 -- informaticien -- http://www.z0rglub.com/phpwebgallery/ -- Delphi :love:
Reply

Marsh Posté le 22-10-2002 à 19:20:03    

Windows c'est Krosoft, VB aussi. Pourquoi on pourrait pas prévoir de catcher les WM_xx depuis VB ??
Les gens qui veulent tout faire qu'avec VB, faut bien qu'ils s'en sortent.
 
NB : j'ai découvert les WM_xx que depuis que j'ai basculé de VB à BC ! Avant, connaissais pas. Pas pro & autodidacte => suis excusable.
 
Up !

Reply

Marsh Posté le 22-10-2002 à 19:32:03    

Moi non + je pige po...
C super bien et super utile... (surtout ds la prog evénementielle) je pige pas comment les programmeurs peuvent se passer de ça :D
Avec Delphi ça m'aurait pris 10mn...


---------------
Des bons sites pour Delphi? http://forum.hardware.fr/forum2.php3?post=16838&cat=10 -- informaticien -- http://www.z0rglub.com/phpwebgallery/ -- Delphi :love:
Reply

Marsh Posté le 22-10-2002 à 22:00:38    

Les VBistes ne s'occupent que des objets qu'ils créent et laissent le système agir.
Je suis passé au BC car j'avais des pbs entre mes DLL et VB car j'allais à rebrousse VB pour l'affichage direct => pas tj bien.
 
En C, rapide aussi la gestion des WM_ (ai Delphi mais pas encore appris).
 
Up !!

Reply

Marsh Posté le 23-10-2002 à 13:05:05    

perso j'y tiens à la gestion des objets, que ce soit des classes, forms, usercontrols, etc...  Si tu laisses faire VB et que le code est plus ou moins mal torché, ça amène des surprises.
 
Vous me direz, programme dans un autre langage, et je répondrai que j'aimerais bien, mais au boulot, pas trop le choix.  Et le pire, j'y ai pris goût  :pt1cable:


---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
Reply

Marsh Posté le 23-10-2002 à 15:03:45    

Y en a qui exècrent VB. Ca permet de faire des tas de trucs très rapidement, faut juste être soigneux au niveau des variables...
Quand on a besoin de rapidité d'éxécution : VC, BC, ou DLL pour VB.
Rapidité de design/tests (pas de compil) : VB.
 
Ca aide pas beaucoup tout ça à capturer les WM_xx...

Reply

Marsh Posté le 23-10-2002 à 15:05:18    

drasche a écrit a écrit :

perso j'y tiens à la gestion des objets, que ce soit des classes, forms, usercontrols, etc...  Si tu laisses faire VB et que le code est plus ou moins mal torché, ça amène des surprises.
 
Vous me direz, programme dans un autre langage, et je répondrai que j'aimerais bien, mais au boulot, pas trop le choix.  Et le pire, j'y ai pris goût  :pt1cable:




Idem sauf que j'y prend pas goût
Mais j'aime mieux ça que du Java  :D


---------------
Des bons sites pour Delphi? http://forum.hardware.fr/forum2.php3?post=16838&cat=10 -- informaticien -- http://www.z0rglub.com/phpwebgallery/ -- Delphi :love:
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed