XL 2016 VBA - Déclarations des fonctions l'API Windows

Dudu2

XLDnaute Barbatruc
Bonjour,

Je voudrais avoir la confirmation de la manière de déclarer les fonctions de l'API Windows selon les constantes de compilation prédéfinies. Avec l'exemple de GetParent().

J'ai vu ce type de déclaration...
VB:
#If VBA7 Then
    #If Win64 Then
        Declare PtrSafe Function GetParent Lib "user32" (ByVal hwnd As LongPtr) As LongPtr
    #Else
        Declare PtrSafe Function GetParent Lib "user32" (ByVal hwnd As Long) As Long
    #End If
#Else
    Declare Function GetParent Lib "user32" (ByVal hwnd As Long) As Long
#End If

Mais la doc Windows dit:
Les variables LongPtr (long integer sur les systèmes 32 bits, longLong integer sur les systèmes 64 bits)
Donc ceci devrait suffire non ?
VB:
#If VBA7 Then
    Declare PtrSafe Function GetParent Lib "user32" (ByVal hwnd As LongPtr) As LongPtr
#Else
    Declare Function GetParent Lib "user32" (ByVal hwnd As Long) As Long
#End If

D'autre part, question subsidiaire, dans cette page par ailleurs très utile, je vois ça:
VB:
#If Win64 Then
    Declare PtrSafe Function GetWindowLongPtr Lib "user32" Alias "GetWindowLongPtrA" (ByVal hwnd As LongPtr, ByVal nIndex As Long) As LongPtr
#Else
    Declare PtrSafe Function GetWindowLongPtr Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As LongPtr, ByVal nIndex As Long) As LongPtr
#End If

Qu'est-ce qui est la "vraie" référence à la fonction ? GetWindowLongPtr ou GetWindowLongPtrA / GetWindowLongA?


Merci par avance.
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
j'avais commencé un classeur exemple
avec des codes très courts
comme tu peux le voir je n'ai pas de soucis avec la user32

barre de titre facon Oldwindow
pas de bouton ou 1 ou 2 ou 3
icon dans la caption
skin par image (la bulle dudu2)
etc..etc...
j'en ai tellement
d'autre plus que j'ai moins montré comme par exemple rendre une frame dans un userform VRAIMENT!! transparente
et je suis sur que j'ai pas fait le tour encore
ma préférée c'est le userform2 facon Oldwindow avec son petit bouton fermer tout carré c'est simple et élégant je trouve

d'autre plus droles comme inverser les coté des bouton et caption
bref des tas d'exemples j'ai produis
lol
demo.gif
 

Dudu2

XLDnaute Barbatruc
Je crois que ce serait bien d'avoir d'abord la liste des fonctions API brutes en macro4 (hors de tout contexte applicatif de mise en œuvre) avec quand même une explication des paramètres ou une référence à la doc MS de la fonction API correspondante.

Après, dans une 2ème temps, les utilisations que tu en as faites c'est autre chose que tu pourrais regrouper selon le thème.
 

patricktoulon

XLDnaute Barbatruc
allez je suis d'humeur généreuse ce soir
on commence par les plus simples et couramment utilisées
getactivewindow et setwindowlongA

VB:
'Api GetActiveWindow
'codage
' hwnd = ExecuteExcel4Macro("CALL(""user32"",""GetActiveWindow"",""JCC"")")         'handle fenetre active


'Api SetWindowLongA application de modification sur fenetre
'codage
' ExecuteExcel4Macro ("CALL(""user32"",""SetWindowLongA"",""JJJJJ""," & hwnd & ", " & -16 & ", " & dwNewLong & ")")

'dwNewLong peut etre un des nombres ci dessous
'&H94C80080  'Normal à l'origine (juste le bouton fermer)
'&H94CA0080  'seulement le bouton reduire
'&H94C90080  'seulement le bouton agrandir
'&H94CB0080  'seulement les deux boutons agrandir & reduire
'&H94CC0080  'seulement l'elasticité
'&H94CE0080  'seulement l bouton reduire et l'élasticité
'&H94CD0080  'seulement le bouton agranfir et l'élasticité
'&H94C00080  'pas de bouton dans la barre de titre
'&H94080080  'pas de cadre pas de barre de titre
'&H140F0101  'pas de barre de titre mais le cadre et elasticié
'&H1010080   'barre de titre et cadre facon  Old Windows
'&H400100    'bouton et titre inversé avec le gwstyle(-20)
voila 2 lignes dans une sub ou l'activate de l'userform et voilà
 

Staple1600

XLDnaute Barbatruc

patricktoulon

XLDnaute Barbatruc
@Dudu2
quelques exemples dont je suis sur
VB:
' syntaxe de codage:
' CALL (nom_dll, nom_fonction, chaîne_type, func_arguments1, ..., func_argumentsN)

'1° nom_dll - le nom de la DLL, qui contient la fonction souhaitée. Ce nom doit contenir le chemin d'accès complet
' si la DLL ne se trouve pas dans votre dossier Windows, Système ou dans le dossier spécifié dans la variable d'environnement PATH.

'2° nom_fonction - nom de la fonction.

'3° type_string - chaîne de texte qui identifie le type de données de la valeur de retour et les types de données de tous les paramètres. Le premier caractère type_string définit la valeur de retour.

'4°  func_arguments1, ..., func_argumentsN - paramètres de fonction. Leurs types doivent respecter type_string. Il peut être transmis jusqu'à 27 paramètres.

'Types de données pour type_string: argument(chaîne_type)

'B - nombre à virgule flottante de 8 octets (IEEE), transféré par valeur, type C double.

'C - Chaîne terminée par zéro (null) (longueur max. = 255 caractères), transférée par référence, type C char *

'F - Chaîne terminée par zéro (null) (longueur max. = 255 caractères), transférée par référence (modifier sur place) , Type C char *

'J - entier signé de 4 octets de large, transféré par valeur, type C long int

'P - structure de données OPER d'Excel, transféré par référence, type C OPER *

'R - structure de données XLOPER d'Excel, transféré par référence, type C XLOPER *
'******************************************************************************************************************************
autement dit par exemple "JJJ" veux dire long,long,long
en fait ca reprends les type d'argument comme dans la déclaration plus un qui est le RETURN
 

patricktoulon

XLDnaute Barbatruc
Ben c'est brouillon je prends jamais le temps de finir c'est pour ca que je le montre pas
je cumule les exemples que j'arrive à créer et finaliser ,c'est déjà pas mal

en se moment je travaille sur setTimer et killtimer d'ailleurs
j'arrive a l'enclancher j'ai bien un ID mais c'est l'addressof qui est plus compliqué a mettre en place
le kill c'est bon aussi
je sais pas si c'est possible je n'ai pas tout testé
 

Dudu2

XLDnaute Barbatruc
Ok @patricktoulon, merci pour ce récap des codes. Je pense que ce serait bien d'avoir quelque part (en tous cas de mon point de vue) une liste de fonctions pré-construites. C'est toujours galère de trouver les bons codes.

Mais comme là on part sur 2 sujets différents, je te contacterai en discussion.
 

Dudu2

XLDnaute Barbatruc
Pour revenir au sujet initial...
La définition de PtrSafe indique qu'en VBA7 le Declare fonctionne en 32 bits et en 64 bits.
Mais selon cette même définition, en 64 bits:
- les Long doivent être déclarés en LonLong
- Les Handles doivent être déclarés en LongPtr

Ces 2 assertions sont presque contradictoires car si un LongLong est bien spécifique d'un 64 bits, un LongPtr amène une souplesse (voir sa définition) qui en fait automatiquement un Long en 32 bits et un LonLong en 64 bits.

Rien ne relie un Handle au type LongPtr (et c'est bien normal, c'est un simple Long en VBA6 et donc un LongLong en VBA7 64 bits), si ce n'est l'acronyme Ptr qui laisse à penser qu'il s'agit d'un Pointeur / Descripteur de processus / fenêtre / autre.
Mais un LongPtr n'a absolument rien à voir avec un Pointeur, c'est un Long en 32 bits et un LongLong en 64 bits, c'est tout ! Et en plus automatiquement sans qu'on ait rien à faire.

Donc, si j'ai bien compris, partout où on trouve un Long en 32 bits VBA6 on devrait mettre un LongPtr en VBA7, Handle ou pas ! Mais en pratique je ne le vois QUE pour les Handles. En et VBA7 quand le Win64 est évoqué (64 bits), je ne vois nulle part de LongLong.
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
re
je ne le vois QUE pour les Handles.

et les contextes!!!!

ensuite et c'est la ou le bas blaisse c'est que longptr n'est pas un vrai type
alors que les fonctions dans les dll sont codé en long
donc ce qui est dis dans l'encart
1665170454245.png

est purement théorique mais ne fonctionne pas dans la réalité
LOL
donc je te déconseille de mettre longptr a tout bout champs en 32 bits

seule l’expérience et l'utilisation (la tienne et celle des autres ) des fonctions te permettrons de te faire une librairie de déclarations
 

Dudu2

XLDnaute Barbatruc
Certes, mais une documentation du constructeur / éditeur est en principe une référence. Sinon ça sert à rien de documenter.
Le retour d'expérience est évidemment le meilleur outil, à condition de bien maitriser ce qu'on fait.
Et lorsqu'on développe dans un environnement donné, on n'a pas forcément la possibilité de tester dans les autres, et il y en a 3:
- VBA6 32 bits
- VBA7 32 bits
- VBA7 64 bits
Donc c'est un joyeux b*rdel pour savoir comment faire ces foutues déclarations.
 

Discussions similaires

  • Résolu(e)
Microsoft 365 32 ou 64 bits
Réponses
46
Affichages
1 K

Statistiques des forums

Discussions
314 422
Messages
2 109 447
Membres
110 482
dernier inscrit
ilyxxxh