XL 2016 Démo pour positionner un UserForm ou ContextMenu sur la grille (Toute version)

Lu76Fer

XLDnaute Occasionnel
P.J. :
  • GetScreenPosDemo.xlsm : la démo
  • GetScreenPosDemo.xls : la conversion pour Excel 2003

Cette démo permet de montrez comment positionner un UserForm ou un Menu Contextuel sur une position de la grille
La fonction permettant de convertir une position de la grille en position écran et toutes les fonctions associées sont contenues dans le module 'Lib' et les fonctions assurant la compatibilité avec Excel 2003 dans le module 'LibV11'
Avec ce problème, c'est l'occasion de montrer comment assurer la compatibilité avec toutes les versions depuis 2003 avec la constante de précompilation classique VBA7 mais qui ne répond pas au problème du passage de la version 2003 à 2007. Dans ce cas il faut utiliser du simple code :
VB:
XLS2003 = IIf(Val(Application.Version) < 12, True, False)

La fonction permettant d'obtenir la position écran à partir du coin Haut-Gauche d'une cellule est GetScreenGridPos et GetScreenGridPosV11 pour la version Excel 2003.
Remarque : pour plus de détails sur la version XLS 2003 voir le sujet "Calculer la position sur l'écran d'une position sur la grille (XL 2003)" sur le Forum d'"excel-downloads.com"

Les fonctions pane.PointsToScreenPixelsX et pane.PointsToScreenPixelsY d'Excel assure déjà plutôt bien cette fonction (disponible depuis la version Excel 2007) mais comporte une imprécision variant de 1 (zoom à 100%) à 4 (zoom à 400%) pixels qui est corrigé par cette fonction reprenant le principe de l'algorithme développé par Pijaku en éliminant les 2 à 3% de cas d'echec de sa fonction et en améliorant la performance.
Source : voir le sujet "Déterminer les coordonnées en pixels, par rapport à l'écran, du coin supérieur gauche d'une cellule Excel" sur le forum du site "www.developpez.net"
Ce que j'ai corrigé ce sont les cas ou la position déterminée au départ est située en dehors de la grille et qui concerne les cellules du pourtour de la grille. Pour retrouver la grille je me déplace en diagonale en direction de la grille plutôt que de façon rectiligne. Une fois la grille trouvée je cherche le coin de la cellule en me déplaçant de façon rectiligne.
VB:
Public Function GetScreenGridPos(ByVal noPane As Integer, ByVal cellTopLeft As Range) As ScreenPos
Dim cel As Range, x As Long, y As Long, crtPane As Pane
Dim wayHor As Integer, wayVert As Integer, state As Byte, totIt As Byte
    Set crtPane = ActiveWindow.Panes(noPane)
    With crtPane
        'Repérer la 1ère ligne et la 1ère colonne du volet
        wayHor = IIf(cellTopLeft.Column = .ScrollColumn, 1, -1)   'Sens Hor
        wayVert = IIf(cellTopLeft.row = .ScrollRow, 1, -1)    'Sens Vert
        x = .PointsToScreenPixelsX(cellTopLeft.Left)
        y = .PointsToScreenPixelsY(cellTopLeft.Top)
        Do
            Set cel = ActiveWindow.RangeFromPoint(x, y)
            If cel Is Nothing Then
                If (state And 2) Then state = state + 2
                x = x + wayHor: y = y + wayVert
            Else
                If state < 3 Then
                    If cel.Left < cellTopLeft.Left Then
                        state = IIf(state = 2, 4, 1)
                        x = x + 1
                    Else
                        Select Case state
                        Case 0: wayHor = 1: wayVert = 0: state = 2
                        Case 1: state = 4
                        Case 2: x = x - 1
                        End Select
                    End If
                End If
                If state > 3 Then
                    If cel.Top < cellTopLeft.Top Then
                        state = IIf(state = 6, 8, 5)
                        y = y + 1
                    Else
                        Select Case state
                        Case 4: wayHor = 0: wayVert = 1: state = 6
                        Case 5: state = 8
                        Case 6: y = y - 1
                        End Select
                    End If
                End If
            End If
            totIt = totIt + 1: If totIt = 20 Then state = 9
        Loop Until state > 7
    End With
    'State = 9 : retour=(0,0)
    GetScreenGridPos.x = IIf(state = 8, x, 0)
    GetScreenGridPos.y = IIf(state = 8, y, 0)
End Function
Le deuxième élément important à calculer est le coefficient permettant de passer d'une grandeur en pixel vers une grandeur en point :
J'ai créer une variable globale 'PxToPt' que je calcule au moment de l'initialisation.
Il existe plusieurs façon de calculer ce coefficient, dont une qui utilise des fonctions systèmes et permet aussi de connaître la résolution de l'écran.
Cf la fonction 'GetScreenData' sur le sujet "Calculer la position sur l'écran d'une position sur la grille (XL 2003)" sur le Forum d'"excel-downloads.com".
Sinon il existe ce calcul très simple que j'ai testé avec toute les valeurs entières de zoom entre 10 et 400 et fonctionne très bien :
VB:
Sub SetPxToPt()
    With ActiveWindow
        PxToPt = Round(11520 / (.Panes(1).PointsToScreenPixelsX(57600 / .Zoom) - .Panes(1).PointsToScreenPixelsX(0))) / 20
    End With
End Sub
Cette macro ne peut être utilisée sous Excel 2003 car pane.PointsToScreenPixelsXouY n'existait pas et il y a donc la macro 'SetPxToPtV11' qui détermine le taux par tatonnement. Elle cherche la plus petite hauteur d'une ligne (1 pixel) et interroge excel pour savoir quel est cette hauteur en point.

Les modules 'exemple' permettant de tester les fonctions ci-dessus
Le module 'Ex1' : il met à disposition un menu contextuel qui permet de changer le nombre de volet, le zoom, de changer d'algo pour tester GetScreenGridPos et GetScreenGridPosV11 ...
Le module 'Ex2' :
Il est possible d'afficher le Userform1 depuis le menu contextuel mais dans certaines versions Excel (ou windows), l'affichage du menu contextuel déborde un peu par rapport à la position d'affichage.
La fonction 'SwapWindowStyle', utilisant des fonctions système permet de modifier l'apparence du Userform en le transformant en simple rectangle, est une solution au problème ci-dessus. Accessible depuis le menu avec le bouton 'Basculer en Style Simple'.

Retirer la compatibilité avec Excel 2003 :
  • Il faut supprimer le module 'LibV11'
  • Dans le module 'Lib' :
Il faut modifier la macro 'InitLib' en remplaçant
Code:
Call InitLibV11
par
Code:
SetPxToPt
Il faut retirer, dans la fonction 'GetScreenGridPos', la partie en commentaire 'COMP2003'
La fonction 'GetGapSize' n'a pas forcément d'utilité sauf cas particulier et peut être retiré aussi
 

Pièces jointes

  • GetScreenPosDemo.xls
    177.5 KB · Affichages: 15
  • GetScreenPosDemo.xlsm
    106.5 KB · Affichages: 27
Dernière édition:

patricktoulon

XLDnaute Barbatruc
Bonjour
l'api SetForeagroundWindow etant une des plus ancienne api windows
et etant capricieuse selon les version excel et donc vb(6/7)(32/64)
je ne saurais que te conseiller d'utiliser plutôt l'api SetWindowPos
qui non seulement sert à positionner un userform mais aussi a le mettre définitivement en premier plan
avec son argument flag on peut gérer les conditions de premier plan (par rapport à excel /toute autre fenêtre )
je peux aussi te proposer des constantes
à fin de te libérer de getwindowlong
il y a aussi le soucis de DrawmenuBar qui depuis XP SP3 redessine la barre en bas
je donne l'astuce avec
dans ton exemple par exemple se serait
( et pour le coup je t'ajoute aussi le déplacement avec la souris du userform en restant appuyé dessus )
VB:
'**********************************************************************************
' __        _____  ___   .  ___         _____  ___             ___
'|__|  /\     |   |   |  | |     | /      |   |   | |   | |   |   | |\  |
'|    /__\    |   |---   | |     |/\      |   |   | |   | |   |   | | \ |
'|   /    \   |   |   \  | |___  |  \     |   |___| |___| |__ |___| |  \|
'
'***********************************************************************************
'**********************************************************************************************
'      fixer le UserForm au premier plan et sans barre de titre
'en utilisant les api SetWindowLong et SetWindowPos
'auteur:patricktoulon
'compatible VB7 32/64 bits
'**********************************************************************************************
'les valeurs utilisables pour modifier la composition
'&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é( elasticité=le resize avec la souris )
'&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)
'**********************************************************************************************

Private Declare PtrSafe Function GetActiveWindow Lib "user32" () As LongPtr
Private Declare PtrSafe Function SetWindowLongA Lib "user32" (ByVal hwnd As LongPtr, ByVal nIndex As Long, ByVal dwNewLong As LongPtr) As LongPtr
Private Declare PtrSafe Function DrawMenuBar Lib "user32" (ByVal hwnd As LongPtr) As Long
Private Declare PtrSafe Function SetWindowPos Lib "user32" (ByVal hwnd As LongPtr, ByVal hWndInsertAfter As LongPtr, ByVal X As Long, ByVal Y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long

'et j'ajoute la possibilité de déplacer la fenêtre userform avec la souris en restant appuyé dessus
'ça peut être utile quand on supprime la barre de tire :) :)
Private Declare PtrSafe Function ReleaseCapture Lib "user32" () As Long
Private Declare PtrSafe Function SendMessageA Lib "user32" (ByVal hwnd As LongPtr, ByVal wMsg As Long, ByVal wParam As LongPtr, lParam As Any) As LongPtr

Private Sub Label1_Click()
    Unload Me
End Sub

'EXEMPLE
Private Sub UserForm_Activate()
    Premier_Plan
End Sub

Sub Premier_Plan()
    Dim hwnd&, H#
    hwnd = GetActiveWindow
    H = Me.InsideHeight + 3    'memo du insideheight +ombre 100% transparente sur W10

    SetWindowLongA hwnd, -16, &H94080080    ' supprime la barre de titre

    DrawMenuBar hwnd    'redessine le hdc mais a pour effet de rajouter la dim de la barre de titre en bas de l'userform(voir le voyant rouge )
    'pour y remedier(si tu veux )
    'Me.Height = H ' et tu peux supprimer l'api DrawMenuBar


    SetWindowPos hwnd, -1, 0&, 0&, 0&, 0&, (&H1 Or &H2 Or &H40)    'positionne le userform au même endroit mais en premier plan
End Sub


'userform déplacable avec la souris
Private Sub UserForm_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    hwnd = GetActiveWindow
    ReleaseCapture
    SendMessageA hwnd, &HA1, 2&, 0
End Sub
exemple fichier joint
 

Pièces jointes

  • userform sans barre de titre en premier plan.xlsm
    16.9 KB · Affichages: 14

Lu76Fer

XLDnaute Occasionnel
Bonsoir Patrick,
Merci pour toutes ces sources je vais regarder tout cela car ce n'est pas vraiment une partie que je maîtrise ... Je vais voir si je peux simplifier cette partie du code. Je n'ai pas eu d'anomalie dans les tests sur Excel 2003,2007 et 2016 et je souhaite que cela reste simple pour éviter les Bugs.
Merci !
 

patricktoulon

XLDnaute Barbatruc
pas de soucis
pour info chez moi 2013 32 bits le setforgroundwindow ,je le dejoue les doigts dans le nez
comme je le disais cette api est vielle très très vielle ;)
elle devrait même plus être dispos sur Windows
le shell32.dll ou user32.dll ne gèrent plus tout seul les fenêtre depuis VISTA
il y a la wmapi.dll qui s'en mêle maintenant depuis vista et depuis seven elle a pris du galon
c'est elle qui gère l'affichage avec le thème paramétré dans windows ce qui rend obsolète plusieurs api de la user32 ou la shell32

perso je l'ai banni de tout mes module api
 

Lu76Fer

XLDnaute Occasionnel
pas de soucis
pour info chez moi 2013 32 bits le setforgroundwindow ,je le dejoue les doigts dans le nez
comme je le disais cette api est vielle très très vielle ;)
elle devrait même plus être dispos sur Windows
le shell32.dll ou user32.dll ne gèrent plus tout seul les fenêtre depuis VISTA
il y a la wmapi.dll qui s'en mêle maintenant depuis vista et depuis seven elle a pris du galon
c'est elle qui gère l'affichage avec le thème paramétré dans windows ce qui rend obsolète plusieurs api de la user32 ou la shell32

perso je l'ai banni de tout mes module api
Bonjour Patrick,
J'ai du me plonger dans l'API Windows et les problèmes de déclaratif, personnellement je travaille sur une version Excel 2016, 64 Bits et j'ai donc mis en place des instructions de précompilation pour gérer aussi les versions 64 bits ...
Au final j'ai gardé simplement la constante VBA7 car avec les fonctions que j'utilise il n'y a strictement aucun impact sur le résultat et l'ajout de la constante Win64 ajoute de la confusion au code dans mon cas. Etant sur une version 64 bits, je suis sûr de moi du coup. Il est a noté aussi que même l'objet Application renvoie un type Long et non LongLong lorsque l'on regarde la valeur de son instance window : Application.Hwnd.
Bref, voici aussi une petite remarque vu que tu travailles sur une version 32 bits, tu n'as pas pu voir que le code suivant ne peut pas être compilé sur une version 64 bits :
VB:
hwnd = GetActiveWindow
'Il faut forcer la conversion en Long pour que la compilation se fasse sur version 64 bits :
hwnd = CLng(GetActiveWindow)
En lisant la doc sur la fonction 'SetWindowLong' j'ai vu qu'il fallait toujours l'associer avec 'SetWindowPos' qui permet de prendre en compte les changements opérés par la fonction SetWindowLong de façon effective. Merci de m'avoir mis sur la voie !
Pour initialiser l'instance window de mon UserForm j'utilise comme tu me la montré la fonction GetActiveWindow dès l'init comme ça plus besoin de Set ou GetForegroundWindow. Il est a noté qu'il est important du coup de neutraliser l'évènement 'UserForm_QueryClose' par un Cancel qui détruit la fenêtre et simplement caché la fenêtre dans ce cas : Me.Hide.
J'ai supprimer la fonction 'GetWindowLong' qui alourdie mon code car j'ai constaté que quelque soit la version d'Excel on a toujours la même valeur pour un UserForm :
VB:
Private Const STD_WINUF = &H84C80080

Par contre pour la fonction 'DrawMenuBar' je n'ai rien trouvé qui soit efficace pour faire le job correctement et je ne rien trouvé de dissuasif dans son utilisation sur tous les forums de discussion.
La fonction a une double utilité, elle force à redessiner l'UserForm et force le recalcul de la largeur et la hauteur de la fenêtre ce qui permet de recalculer les grandeur afin d'avoir toujours les mêmes valeurs pour InsideWidth et InsideHeight.
Conclusion : à moins de trouver mieux je vais continuer à utiliser cette fonction.

Merci encore pour ta contribution !
Excellente fin de journée Patrick.
 

patricktoulon

XLDnaute Barbatruc
Par contre pour la fonction 'DrawMenuBar' je n'ai rien trouvé qui soit efficace pour faire le job correctement et je ne rien trouvé de dissuasif dans son utilisation sur tous les forums de discussion.
La fonction a une double utilité, elle force à redessiner l'UserForm et force le recalcul de la largeur et la hauteur de la fenêtre ce qui permet de recalculer les grandeur afin d'avoir toujours les mêmes valeurs pour InsideWidth et InsideHeight.
Conclusion : à moins de trouver mieux je vais continuer à utiliser cette fonction.
oui et non
oui c'est ce qu'elle est sensé faire
et non car le redraw s'opère sur la surface occupé par le userform et !! sa caption
du coup le inside ne peut plus être le même
la seule solution (celle que j'utilise) est de calculer avant le setwindowlong le insideheight
et a la place du redraw je soustrait cette dimension

démonstration avec et sans recalcul
ici juste le drawmenubar
a gauche le userform modifié a droite un autre userform (le même en tout point sans modif
on voit bien qu'après le label rouge il y a encore un espace alors que la fin du userform à la base est juste en dessous de ce label
on voit bien aussi que le inside a la même dimension que l'userform complet a la base

1696846643977.png


maintenant avec le calcul
et la on voit bien que le insidewidth est resté le même
1696846813645.png


donc
comme tu vois j'ai bloqué l'api drawmenubar
je me sert du calcul
VB:
Sub Premier_Plan()
    Dim H#
    HwnD = GetActiveWindow
    H = Me.InsideHeight + 3    'memo du insideheight +ombre 100% transparente sur W10

    SetWindowLongA HwnD, -16, &H94080080    ' supprime la barre de titre

    '**************************************************************************
    'DrawMenuBar HwnD    'redessine le hdc mais a pour effet de rajouter la dim de la barre de titre en bas de l'userform(voir le voyant rouge )

    'pour y remedier(si tu veux )

    Me.Height = H    ' et tu peux supprimer l'api DrawMenuBar
    '**************************************************************************


    SetWindowPos HwnD, -1, 0&, 0&, 0&, 0&, (&H1 Or &H2 Or &H40)    'positionne le userform au même endroit mais en premier plan
End Sub

pour le vba7/vba6
oui si tu veux garde que le vba7
mais attention ne prends pas ca pour une règle d'or
certaine api se déclarent vraiment différemment en 64/32

on est plusieurs a s’être cassés la tête sur cette fonction drawmenubar et cela depuis VISTA
a ce jour personne n'a trouvé le moyen de corriger cette fonction
 
Dernière édition:

Lu76Fer

XLDnaute Occasionnel
oui et non
oui c'est ce qu'elle est sensé faire
et non car le redraw s'opère sur la surface occupé par le userform et !! sa caption
du coup le inside ne peut plus être le même
la seule solution (celle que j'utilise) est de calculer avant le setwindowlong le insideheight
et a la place du redraw je soustrait cette dimension

démonstration avec et sans recalcul
ici juste le drawmenubar
a gauche le userform modifié a droite un autre userform (le même en tout point sans modif
on voit bien qu'après le label rouge il y a encore un espace alors que la fin du userform à la base est juste en dessous de ce label
on voit bien aussi que le inside a la même dimension que l'userform complet a la base

Regarde la pièce jointe 1180627

maintenant avec le calcul
et la on voit bien que le insidewidth est resté le même
Regarde la pièce jointe 1180628

donc
comme tu vois j'ai bloqué l'api drawmenubar
je me sert du calcul
VB:
Sub Premier_Plan()
    Dim H#
    HwnD = GetActiveWindow
    H = Me.InsideHeight + 3    'memo du insideheight +ombre 100% transparente sur W10

    SetWindowLongA HwnD, -16, &H94080080    ' supprime la barre de titre

    '**************************************************************************
    'DrawMenuBar HwnD    'redessine le hdc mais a pour effet de rajouter la dim de la barre de titre en bas de l'userform(voir le voyant rouge )

    'pour y remedier(si tu veux )

    Me.Height = H    ' et tu peux supprimer l'api DrawMenuBar
    '**************************************************************************


    SetWindowPos HwnD, -1, 0&, 0&, 0&, 0&, (&H1 Or &H2 Or &H40)    'positionne le userform au même endroit mais en premier plan
End Sub

pour le vba7/vba6
oui si tu veux garde que le vba7
mais attention ne prends pas ca pour une règle d'or
certaine api se déclarent vraiment différemment en 64/32

on est plusieurs a s’être cassés la tête sur cette fonction drawmenubar et cela depuis VISTA
a ce jour personne n'a trouvé le moyen de corriger cette fonction
Je procède de la même manière mais grâce à DrawMenuBar je n'ai pas à définir la taille de mon UserForm en ajoutant 3 (memo du insideheight +ombre 100% transparente sur W10). J'ai ajouter une image dans mon UserForm pour m'assurer que je n'avais pas ce problème que tu décris au dessus.
Voici le code :
VB:
Function SwapUFwinStyle(winObj As Object) As Boolean
Dim hWnd As Long, updStyle As Long
Dim newInsWidth As Single, newInsHeight As Single, isVis As Boolean
    With winObj
        ' Vérifie que l'instance 'fenêtre' de l'objet est initialisée
        hWnd = .HWinInst: If hWnd = 0 Then Exit Function
        newInsWidth = .InsideWidth: newInsHeight = .InsideHeight    ' Mémorise les dimensions internes
        isVis = .Visible
        SetWindowLong hWnd, GWL_STYLE, IIf(.IsSimpleStyle, STD_WINUF Or WS_CAPTION, STD_WINUF And Not WS_CAPTION)
        .IsSimpleStyle = Not (.IsSimpleStyle)
        DrawMenuBar hWnd    'Force le redessinage et surtout la mise à jour des dimensions
        ' Corrige les dimensions internes
        .Width = .Width - .InsideWidth + newInsWidth
        .Height = .Height - .InsideHeight + newInsHeight
        'Prend en compte les changements opérés avec SetWindowLong
        SetWindowPos hWnd, 0, 0, 0, 0, 0, &H117 Or IIf(isVis, &H40, &H80)
        DoEvents
        SwapUFwinStyle = .IsSimpleStyle
    End With
End Function
newInsWidth et newInsHeight me permettent de garder en mémoire la taille et ensuite de forcer le redimensionnement juste après l'appel à DrawMenuBar. Résultat parfait sous Excel 2003, 2007, 2016 et Windows 2007 & 2010. Je n'ai vu aucun effet de bord avec cette fonction ...
Je sais sinon qu'il n'y a que très peu de fonction qui ont besoin d'être adaptés en version 64 bits mais qu'elles existent mais il y a un formalisme officiel inutile au niveau des déclarations car la plupart des fonctions n'en ont pas l'utilité. J'ai préféré avoir une démarche rigoureuse justement pour voir ...
 

Lu76Fer

XLDnaute Occasionnel
re
Je l'avais déjà testé mais si j'enlève la fonction selon le cas cela distord mon image ou sinon ma zone de travail se retrouve élargie en hauteur. Il y a nécessité de redessiner l'objet et après avoir cherché une fonction je n'ai trouvé que celle-ci. Dans ma démo je dois aussi pouvoir remettre la barre de titre et tout fonctionne mais pas sans DrawMenuBar.
Si tu veux je te laisse ma nouvelle version, tu pourras tester...
 

Pièces jointes

  • GetScreenPosDemo2.xlsm
    130.1 KB · Affichages: 2

patricktoulon

XLDnaute Barbatruc
re
j'ai pris ton userform et vider tout son code et mis celui ci
VB:
Private Declare PtrSafe Function GetActiveWindow Lib "user32" () As LongPtr
Private Declare PtrSafe Function SetWindowLongA Lib "user32" (ByVal HwnD As LongPtr, ByVal nIndex As Long, ByVal dwNewLong As LongPtr) As LongPtr
Private Declare PtrSafe Function SetWindowPos Lib "user32" (ByVal HwnD As LongPtr, ByVal hWndInsertAfter As LongPtr, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long

Private Sub Label1_Click()
Unload Me
End Sub

'EXEMPLE
Private Sub UserForm_Activate()
    Premier_Plan
End Sub

Sub Premier_Plan()
    Dim H#
    HwnD = GetActiveWindow
    H = Me.InsideHeight + ((Me.Width - Me.InsideWidth))  'memo du insideheight +ombre 100% transparente sur W10
    SetWindowLongA HwnD, -16, &H94080080    ' supprime la barre de titre
       Me.Height = H ' et tu peux supprimer l'api DrawMenuBar
    SetWindowPos HwnD, -1, 0&, 0&, 0&, 0&, (&H1 Or &H2 Or &H40)    'positionne le userform au même endroit mais en premier plan
End Sub
résultat aucune déformation
1696867363265.png
 

patricktoulon

XLDnaute Barbatruc
re
et chez moi ce que tu a( en plus ) avec ma version je l'ai (en moins )avec ta version (l'image est coupée)
on revient a une autre discussion que j'ai eu avec un autre membre
les versions 32/64 bits fonctionnent différemment avec la user32.dll
il n'y a donc pas de solution universelles sans utiliser l’appel à la wmapi.dll qui nouspermet d'intérroger dans l’instante la config user32/wmapi.dll
 

Discussions similaires

Statistiques des forums

Discussions
314 962
Messages
2 114 787
Membres
112 247
dernier inscrit
VENTABREN