XL 2016 SetTimer incompatible version excel

carlos

XLDnaute Impliqué
Supporter XLD
Bonjour,
en désinstallant excel 2007 pour excel 2016 mes fichier utilisant la déclaration suivante ne marchent plus : TimerID = SetTimer(0, 0, Interval, AddressOf Chrono)
1576157419894.png

J'ai beau mettre ptrsafe et longptr cela ne résout rien.
Auriez vous une proposition?
Carlos
 

Pièces jointes

  • Chronometrer une classe V 1.2.xls
    100.5 KB · Affichages: 16

patricktoulon

XLDnaute Barbatruc
re
oui exact longlong

comme je disais il serait bien de tester le return de l'api
VB:
Option Explicit
#If win64 Then
    Private Declare ptrsafe Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Longptr
#Else
    Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
#End If
Sub Test()
    #If win64 Then
        Const CapacitéAdressage = 64
    #Else
        Const CapacitéAdressage = 32
    #End If
    MsgBox "Sur mon système à capacité d'adressage de " & CapacitéAdressage & " bits," _
         & vbLf & "avec l'expression Application.hWnd, le return handle  est de type " & TypeName(Application.Hwnd) & "." & vbCrLf & vbCrLf & _
           "par contre avec l'api FindWindowA le type est " & TypeName(FindWindow(vbNullString, Application.Caption))
End Sub
 

Dranreb

XLDnaute Barbatruc
Oui mais si vous la déclarez comme renvoyant un LongPtr elle va renvoyer un LongLong, et comme renvoyant un Long elle va renvoyer un Long, inexact peut être, amputé de bits de poids fort, mais un Long quand même, si elle ne plante pas. C'est pour ça que je préfère qu'on teste le type d'un handle fixé par les développeurs d'Excel !
 

patricktoulon

XLDnaute Barbatruc
re
bonjour carlos
ben voila tu a ta réponse et nous aussi je pense (je m'en doutais un peu a vrai dire)
application.hwnd donne bien un long(par conversion vba) alors que dans l'api settimer on attend un longlong en argument quand on est en 64

donc sert toi de l'api findwindowA ou getactivewindow(déclaration en 64 bien sur) ;)

peut être pourrais tu convertir le long avec ClngLng(=longlong)
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Bonjour.
En tout cas j'ai ce que je voulais savoir. Les handle doivent bien être déclarés As LongPtr.
C'est ce que j'ai fait dans le classeur joint. Dites moi si tous les dispositif fonctionnent normalement. Si c'est le cas on vas résoudre votre problème avec un objet Rythmeur, après avoir glissé/déplacé vers votre projet le module standard MRythmeur et le module de classe Rythmeur.
 

Dranreb

XLDnaute Barbatruc
Mais… qu'est ce qui se passe encore ? Je viens de relire le poste #17 (je l'avais mal lu parce que pollué par des suggestions absurdes de patricktoulon). Donc Application.hWnd est bien toujours long même en 64 bits ?? je supprime ma pièce jointe du poste précédent.
Testez celle du poste #10 et dites moi si tout fonctionne.
 

patricktoulon

XLDnaute Barbatruc
re
Absurde!!??
pas du tout!!!!!!! j'essai de dire mais en vain visiblement de ne pas utiliser application.hWnd
ce qui est absurde
c'est de faire "ByVal hWnd As Longptr," dans timeproc et dans cette meme sub essayer de killer le timer avec application.hwnd qui lui est en long
alors que l'id du timer est certainement en en longlong pour 64
et il y a la même chose dans stopperythmeur
 

patricktoulon

XLDnaute Barbatruc
d'accords @Dranreb peux tu me dire sincèrement a quoi te sert le hwnd dans timeproc ;)

VB:
Private Sub TimerProc(ByVal hWnd As Long, ByVal uMsg As Long, ByVal Idt As Long, ByVal Tic As Long)
    On Error Resume Next
    TRythmeurs(Idt).MéthodeRésevéeÀTimerProc Tic
    If Err Then KillTimer Application.hWnd, Idt:=Idt
End Sub
LOL

QUE LES choses soient claires
(ByVal hWnd As Long, ) et application.hWnd
ne sont pas les même VARIABLES handle même si en 32 bits il correspondent
D'AUTANT PLUS QUE TU L'UTILISE MEME PAS DANS TA TIMEPROC
 

Statistiques des forums

Discussions
312 152
Messages
2 085 798
Membres
102 980
dernier inscrit
brossadan