re
Je ne comprends pas trop ce que vous calculez avec FindWindows (j'ai pas trop compris), mais l problème vient du contour de l'userform, non ????
Peut-être me trompe-je, mais voyez sans correctif et n'importe quelle zoom
Pièce jointe 294144
Version imprimable
re
Je ne comprends pas trop ce que vous calculez avec FindWindows (j'ai pas trop compris), mais l problème vient du contour de l'userform, non ????
Peut-être me trompe-je, mais voyez sans correctif et n'importe quelle zoom
Pièce jointe 294144
(.Width - .InsideWidth) / 2)= ce que j'ai à retirer au left
Pour moi cela fonctionne bien, n'importe quel zoomCode:
1
2
3
4
5
6
7
8
9
10 Sub test() With CreateObject("WScript.Shell"): ppx = .RegRead("HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics\AppliedDPI") / 72: End With Zooom = ActiveWindow.Zoom / 100 With UserForm1 plus =(.Width - .InsideWidth) / 2) .Show 0 .Top = ActiveWindow.PointsToScreenPixelsY(ActiveCell.Top * ppx * Zooom) / ppx .Left = (ActiveWindow.PointsToScreenPixelsX(ActiveCell.Left * ppx * Zooom) / ppx) - plus End With End Sub
A Nicolas
Oui, mais ton image donne a penser que là, tu es avec un userform totalement plat (sans effets aero).
non non, l'aéro est bien activé, je me suis servi de la fonction avec les apis pour tirer les contours du userform
(j'arrive plus a mettre la main dessus avec tout les test qui on été fait) , et parti avec un test tout simple
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13 Sub Aligne_forme_simple() Dim PtToPx#, Zooom@ Zooom = ActiveWindow.Zoom / 100 PtToPx = ((ActiveWindow.ActivePane.PointsToScreenPixelsX(ActiveSheet.[a1].Width) - ActiveWindow.ActivePane.PointsToScreenPixelsX(0)) / ActiveSheet.[a1].Width) / Zooom With UserForm1 .Show 0 .Top = (ActiveWindow.ActivePane.PointsToScreenPixelsY(ActiveCell.Top) / PtToPx) .Left = (ActiveWindow.ActivePane.PointsToScreenPixelsX(ActiveCell.Left) / PtToPx) End With End Sub
Je suggère la lecture attentive de ces deux liens
https://fr.wikipedia.org/wiki/Desktop_Window_Manager
https://msdn.microsoft.com/fr-fr/lib...(v=vs.85).aspx
Pour commencer à comprendre
Je m'incline et vous laisse poursuivre sur votre piste :oops: :oops:
Bonjour
oui jacques c'est dwm.exe qui s'en charge je cherche de ce coté depuis un moment déjà mais je sais pas si on peut le gérer ou utiliser en VBA
en C# oui je le sais
en batch c'est net stop uxsms pour démarrer ou net stop uxsms pour l'arrêter en mode administrateur
et pour le décalage W10 toute version si j'enlève les 3 points SWM_BORDERWIDTH( déterminable dans getsystemmetricS la 32 il me semble)que j'ai avec W7 2007 et que je multiplie par ppx et je les soustrait je tombe pile poil pour w 10
jacques ce qui me conforte dans ton 2d lien c'est qu'il est bien précisé que la déstructuration des paramètres (pas tous) n'ont pas d'effet sur W10 je suis tenté de penser que j'ai raison depuis un moment
window 10 a bien les bordures de W7 mais ells sont occultées ou pris en compte dans les calculs quand même ce que je pense depuis un moment déjà
FrançaisCitation:
Disabling DWM Composition
Note As of Windows 8, the information in this section is no longer valid.
DWM can no longer be programmatically disabled, nor is it disabled
when an application attempts to draw to the primary display surface.
The following information applies to only Windows 7 and earlier systems.
.Citation:
Désactivation de la composition de DWM
Remarque À partir de Windows 8, les informations contenues dans cette section ne sont plus valides.
DWM ne peut plus être désactivé par programmation, et il n'est pas désactivé
quand une application tente de dessiner sur la surface d'affichage principale.
Les informations suivantes s'appliquent uniquement aux systèmes Windows 7 et antérieurs
n'est pas la traduction exacte, qui estCitation:
Remarque À partir de Windows 8, les informations contenues dans cette section ne sont plus valides.
"Prenez note de ce que les indications données dans cette section ne sont plus valables en ce qui concerne Windows 8"
(juste pour que les choses soient précises).
c'est valable pour W10 aussi
vous aviez testé celle ci
normalement si je ne me trompe pas au pire il devrait avoir "1 point " de défaut du a l'itération du premier tour même si c'est bon d'entrée de jeuCode:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long Private Declare Function WindowFromPoint Lib "user32" (ByVal xpoint As Long, ByVal ypoint As Long) As Long Sub test_userform_replace() 'récuperation du coefficient ppx(pixel to point) With CreateObject("WScript.Shell"): ppx = .RegRead("HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics\AppliedDPI") / 72: End With With ActiveWindow 'recuperation des point X/Y avec pointstoscreenpixels x = (.ActivePane.PointsToScreenPixelsX([d3].Left)) / ppx: Y = (.ActivePane.PointsToScreenPixelsY([d3].Top)) / ppx With UserForm1: .Show 0: handle1 = FindWindow(vbNullString, UserForm1.Caption) 'hwnd de l'userform(caption) .Left = x: .Top = Y: 'positionnement selon pointstoscreenpixels handlex = WindowFromPoint(((x) * ppx), ((Y + 10) * ppx)) 'récupération du handle vraiment présent sous les points de pointstoscreenpixel ' si on est dessus le userform alors on est soit trop court soit pilepoil sinon on est plus loin que les points c = IIf(handlex = handle1, 1, -1): a = 0 'donc on ajoutera (1) si dessus on enlèvera(-1) si on est en dehors incrémenté dans un do loop 'do loop pour le left: on limite la boucle a 20 itérations en cas de raté pour eviter de boucler infiniment Do: a = a + 1: .Left = .Left + c: Loop Until WindowFromPoint((x * ppx), (Y * ppx)) <> handlex Or a = 20 ' on a donc le x(left exact)maintenant on fait exactement pareil pour le top(Y) x = .Left * ppx: handlex = WindowFromPoint((x * ppx), (Y * ppx)) 'on reprend donc le handlex avec le x exact du userform et le y de pointstoscreenpixel c = IIf(handlex = handle1, 1, -1): a = 0 ' on fait pareil que pour le x si dessus 1 sinon -1 ici on limitera aussi la boucle a 20 itérations Do: a = a + 1: .Top = .Top + c: Loop Until WindowFromPoint((x * ppx), (Y * ppx)) <> handlex Or a = 20 End With End With End Sub
je ne prends pas en considération les version
le principe est juste capter le handle de départ au même cordonnées si c'est le userform c= 1 sinon -1
et dans les deux do loop (left/top) je bouje le userform jusqu'à que les coordonnées me donne un autre handle
Bonjour Patrick,
voila le résult
Pièce jointe 294224
il faut mettre des espions pour a dans chaque do loop pour voir si il est capté au depart
comme toi tu est plus bas et plus loin au depart il est possible que le premier do loop monte a 20
Je ne sais pas quel regard vous posez sur les choses.
Le mien est on ne peut plus clair --->>
1) Excel n'a rien à voir dans cet aspect-là : savoir positionner précisément une " image " crée par aero en un point spécifié de l'écran. Excel ou pas Excel !
On y parvient si cette " image " est une fenêtre Windows à part entière et je vois mal comment on peut y parvenir si tel n'est pas le cas.
2) dwm.exe ne me semble pas avoir d'autre finalité que de dessiner l' "image" Aero. Je vois mal en quoi il permettrait de déplacer cette " image "
3) je n'ai pas aero et ne peut donc fouiller à la recherche d'une éventuelle API spécifique à cet outil et qui abriterait éventuellement des fonctions permettant un déplacement.
Je me retrouve donc dans la position de celui qui, lisant sur la toile, tente comme il le peut et sans pouvoir tester, de déterminer ce qui pourrait permettre ce déplacement de l' "image " aero elle même.
En l'état actuel des choses, je ne peux que tenter sur la base de suppositions.
Ce ne sera qu'après ces tentatives de prise de connaissances/aero que je maintiendrai mon "test sur le 6" (surtout s'il est dit que l' "image" est une fenêtre Windows à part entière ou qu'au moins un doute persiste à ce sujet) ou qu'au contraire mes recherches conduisent à la découverte que cette "image aero" n'est pas une fenêtre Windows à part entière.
Voilà, Messieurs.
que dit le message
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long Private Declare Function WindowFromPoint Lib "user32" (ByVal xpoint As Long, ByVal ypoint As Long) As Long Sub test_userform_replace() 'récuperation du coefficient ppx(pixel to point) With CreateObject("WScript.Shell"): ppx = .RegRead("HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics\AppliedDPI") / 72: End With With ActiveWindow 'recuperation des point X/Y avec pointstoscreenpixels x = (.ActivePane.PointsToScreenPixelsX([d3].Left)) / ppx: Y = (.ActivePane.PointsToScreenPixelsY([d3].Top)) / ppx With UserForm1: .Show 0: handle1 = FindWindow(vbNullString, UserForm1.Caption) 'hwnd de l'userform(caption) .Left = x: .Top = Y: 'positionnement selon pointstoscreenpixels handlex = WindowFromPoint(((x) * ppx), ((Y + 10) * ppx)) 'récuperation du handle vraiment present sous les points de pointstoscreenpixel ' si on est dessus le userform alors on est soit trop court soit pilepoil sinon on est plus loin que les points c = IIf(handlex = handle1, 1, -1): a = 0 'donc on ajoutera (1) si dessus on enlèvera(-1) si on est en dehors incrementé dans un do loop 'do loop pour le left: on limite la boucle a 20 iteration en cas de raté pour eviter de boucler infiniment Do: a = a + 1: .Left = .Left + c: Loop Until WindowFromPoint((x * ppx), (Y * ppx)) <> handlex Or a = 20 texte = "pour le left C= " & c & " et a = " & a & vbCrLf ' on a donc le x(left exact)maintenant on fait exactement pareil pour le top(Y) x = .Left * ppx: handlex = WindowFromPoint((x * ppx), (Y * ppx)) 'on reprend donc le handlex avec le x exact du userform et le y de pointstoscreenpixel c = IIf(handlex = handle1, 1, -1): a = 0 ' on fait pareil que pour le x si dessus 1 sinon -1 ici on limitera aussi la boucle a 20 itérations Do: a = a + 1: .Top = .Top + c: Loop Until WindowFromPoint((x * ppx), (Y * ppx)) <> handlex Or a = 20 texte = texte & "pour le top C= " & c & " et a = " & a End With End With MsgBox texte End Sub
on a tres bien compris ton point de vueCitation:
1) Excel n'a rien à voir dans cet aspect-là : savoir positionner précisément une " image " crée par aero en un point spécifié de l'écran. Excel ou pas Excel !
mais au vue de tout les tests on voit bien que aero n'est pas gérable alors on déplace le userform
si tu préfère on pourrait changer le titre
posé le userform la ou se trouve la cellule a l'écran
ca semble confirmer ce que j'ai dis plus haut
l'écart que tu a a gauche est pile poil celui des bordures W7 tu a donc bien des bordures mais elles sont occultées(transparence)
je vois que ca
mon switch est finalement bien plus simple hein !!?
juste par curiosité
que dis le message ici
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 Sub test_userform_replace333() 'récuperation du coefficient ppx(pixel to point)par le dpi With CreateObject("WScript.Shell"): ppx = .RegRead("HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics\AppliedDPI") / 72: End With With ActiveWindow 'recuperation des point X/Y avec pointstoscreenpixels Z = .Zoom / 100 ppxL = ((.ActivePane.PointsToScreenPixelsX([d3].Width) + 1) - (.ActivePane.PointsToScreenPixelsX(0) + 1)) / (([d3].Width) + 1) / (Z + 0.01) x = (.ActivePane.PointsToScreenPixelsX([d3].Left) / ppxL) x2 = (.ActivePane.PointsToScreenPixelsX([d3].Left) / ppx) MsgBox "difference en pixel " & x - x2 & vbCrLf & " diiference en points " & (x - x2) / ppx With UserForm1: '.Show 0: '.Left = (x + 1) / ppxL: .Top = (Y + 1) / ppxL: 'positionnement selon pointstoscreenpixels End With End With End Sub
Il n'est pas certain, Patrick qu'une telle démarche aboutisse. Plusieurs raisons à cela, parmi lesquelles :
- chou blanc si pas fenêtre Windows à part entière
- si (dit plus haut) fenêtre Windows à part entière : gaffe à ce que retourne Findwindows qui s'appuie sur un caption qui peut être identique pour les deux fenêtres et sera retenue la 1ère trouvée et non forcément celle du userform lui-même.
Moi, je n'ai pas aero, mais toi oui : des essais avec enumwindows te conduiront PEUT-ETRE à y voir plus clair ! Je les ferais, si j'étais toi et sur ta machine.
Par ailleurs : la librarie utilisée par aero semble être la librairie dwmapi.dll. Il n'est pas interdit de penser qu'il serait utile de s'intéresser à la DwmExtendFrameIntoClientArea qu'elle contient entre autres fonctions. ;) Je ne peux le faire (sans aero).
jacques enumwindow me sort que la Windows par la caption userform (findwindow) + toute les autres mais je ne chope pas le handle intérieurCitation:
Par ailleurs : la librarie utilisée par aero semble être la librairie dwmapi.dll. Il n'est pas interdit de penser qu'il serait utile de s'intéresser à la DwmExtendFrameIntoClientArea qu'elle contient entre autres fonctions. :wink: Je ne peux le faire (sans aero).
pour la dll je sais mais je n'ai aucune idée de comment et si on peut travailler avec dans vba
je vais chercher en C# ca m'aide souvent a trouver la syntaxe de la déclaration en vba
Pièce jointe 294243
oui la c'est la debandade avec W10 tout est faussé sur W10
prend le nombre en pixel est fait l'opération avec une calculette :ptdr:
Bonjour,
Jacques, tu sais que je n'y connais pas grand chose, mais si on obtient 2 hwnd n'y a t'il pas moyen de les "regrouper" dans un sens ou dans l'autre avec api SetParent?
bonjour pijaku
c'est quoi l'utilité de les regrouper le maitre serait le parent en l'occurrence ici le cadre(caption) et c'est sur lui que l'on se base
les regrouper ne ne veut pas dire que l'on obtienne un 3eme handle correspondant au tout du moins a ma connaissance
d'ailleur ils sont déjà parent sinon on déplacerait que le cadre avec la souris
"parent" n'est pas le terme exact, PatrickCitation:
d'ailleur ils sont déjà parent sinon on déplacerait que le cadre avec la souris
Lorsque aero est activé, il traite automatiquement la fenêtre window en cours et lui "colle au cul" (pardonne cette expression imagée). L'image créée par aero n'est pas un "parent" ni une "fille" de la fenêtre traitée, mais une espèce d' "associé" actif dans les deux sens (que l'on déplace l' "image" ou la fenêtre du Userform, l'autre suit). L'interactivité entre les deux est omniprésente.
Bonjour Franck
Je devine le sens de ta pensée, mais ....
Si tu donnais à une fenêtre la parenté d'une autre fenêtre tu obtiendrais au sein d'une fenêtre une fenêtre fille elle-même soumise à son tour à l'intervention de aero !
non jacques !Citation:
Si tu donnais à une fenêtre la parenté d'une autre fenêtre tu obtiendrais au sein d'une fenêtre une fenêtre fille elle-même soumise à son tour à l'intervention de aero !
j'ai plusieurs fois fait le test avec la fenêtre du bandeau de téléchargement IE qui n'a pas de caption et il n'en a toujours pas après être devenu l'enfant de l'application excel
Et pourquoi en aurait-il un ?Citation:
j'ai plusieurs fois fait le test avec la fenêtre du bandeau de téléchargement IE qui n'a pas de caption et il n'en a toujours pas après être devenu l'enfant de l'application excel
Je n'ai jamais dit qu'il en aurait un ! une fenêtre enfant vient telle quelle dans la fenêtre parent. Elle ne change pas !
a l'affichage la fentre soumise a la parenté par l'api setparent ne change pas du tout la je peut l'affirmer a 100% par contre
j'utilise le sendmessage et le déplacement du le curseur pour les boutons et les dimensions restent identiques
je retrouverais mon post a ce sujet dans la contrib de marc pour le telechargement automatique
Et qu'est ce que cela a à voir ?
Et où ai-je dit le contraire ?
La fenêtre traitée devient fille de la fenêtre parent et reste telle qu'elle était. Point barre. Si elle était sans caption, elle devient fille sans caption.
Test tout bête : les deux userforms ne doivent pas être en modal (bien évidemment)
Je ne laisse un caption au départ QUE pour pouvoir utiliser FindWindows. Une fois son handle connu, j'enlève son caption.
Rappel : passer en enfant d'un parent une fenêtre n'a en aucun cas pour résultat de donner à la fenêtre enfant le handle de la fenêtre parent.Code:
1
2
3
4
5
6
7
8
9
10 UserForm2.Show UserForm1.Show hwnd1 = FindWindow(vbNullString, UserForm1.Caption) hwnd2 = FindWindow(vbNullString, UserForm2.Caption) UserForm2.Caption = "" SetParent hwnd2, hwnd1 UserForm2.Top = 0 UserForm2.Left = 0 MsgBox "voilà. userform2 est dans userform1 sans caption" & vbCrLf & "on va le reepasser sur le bureau, maintenant" SetParent hwnd2, 0
bon ben t'a tout faux
Pièce jointe 294342Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long Private Declare Function WindowFromPoint Lib "user32" (ByVal xpoint As Long, ByVal ypoint As Long) As Long Public Declare Function SetParent Lib "user32" (ByVal hWndChild As Long, ByVal hWndNewParent As Long) As Long Public Declare Function GetParent Lib "user32" (ByVal hWnd As Long) As Long Sub test() With CreateObject("WScript.Shell"): ppx = .RegRead("HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics\AppliedDPI") / 72: End With With UserForm1 .Show 0 handle_Caption = FindWindow(vbNullString, UserForm1.Caption) handle_interieur = WindowFromPoint((.Left + 30) * ppx, (.Top + 30) * ppx) Debug.Print handle_Caption Debug.Print handle_interieur Debug.Print GetParent(handle_interieur) End With End Sub
comme tu n'a pas W7 tu ne fait que suputer des idées fausse par ce que tu te base sur xp il n'ont pas le même noyau bien que tout deux sont dérivé du noyeau NT
Ca, alors !
Qu'est-ce que c'est que ce code ? Il ne correspond à rien de sensé !
Et ne correspond en rien, ni de près ni même de très loin, ni à mes tests, ni même à un test raisonnable !
Ton "t'as tout faux" est ici totalement incompréhensible.
Peux-tu me dire clairement, techniquement et apec précision en quoi ton code contredit :
citation :
Et où ton test (ton code) traite l' "image" aero ? Dis-moi !Citation:
"parent" n'est pas le terme exact, Patrick
Lorsque aero est activé, il traite automatiquement la fenêtre window en cours et lui "colle au cul" (pardonne cette expression imagée). L'image créée par aero n'est pas un "parent" ni une "fille" de la fenêtre traitée, mais une espèce d' "associé" actif dans les deux sens (que l'on déplace l' "image" ou la fenêtre du Userform, l'autre suit). L'interactivité entre les deux est omniprésente.
qu'est ce que tu raconte
les deux handle sont bien identifiés et le getparent donne pareil que le finfwindow
tu veux un windowfrompoint sur la caption pour voir?
y a pas de soucis mais je t'ai déjà montré plus tôt dans la discussion que ca ramenait le même handle que findwindow
insensé c'est la meilleur celle la :ptdr:
tu peux dire ce que tu veux y a pas d'erreur
resultatCode:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long Private Declare Function WindowFromPoint Lib "user32" (ByVal xpoint As Long, ByVal ypoint As Long) As Long Public Declare Function SetParent Lib "user32" (ByVal hWndChild As Long, ByVal hWndNewParent As Long) As Long Public Declare Function GetParent Lib "user32" (ByVal hWnd As Long) As Long Sub test() With CreateObject("WScript.Shell"): ppx = .RegRead("HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics\AppliedDPI") / 72: End With With UserForm1 .Show 0 handle_Caption = FindWindow(vbNullString, UserForm1.Caption) handle_Caption_by_W_f_point = WindowFromPoint((.Left + 5) * ppx, (.Top + 5) * ppx) handle_interieur = WindowFromPoint((.Left + 30) * ppx, (.Top + 30) * ppx) Debug.Print "findwindow " & handle_Caption Debug.Print "windowfrompoint caption " & handle_Caption_by_W_f_point Debug.Print "windowfrompoint interieur " & handle_interieur Debug.Print "parent du handle_interieur " & GetParent(handle_interieur) End With End Sub
Citation:
findwindow 460368
windowfrompoint caption 460368
windowfrompoint interieur 787932
parent du handle_interieur 460368
coucou
je sais pas ce que vous cherchez mais voila résultats du dernier test à Patrick
Citation:
findwindow 3673540
windowfrompoint caption 3673540
windowfrompoint interieur 331764
parent du handle_interieur 3673540
Peux-tu me dire clairement, techniquement et apec précision en quoi ton code contredit :
citation :
Et où ton test (ton code) traite l' "image" aero ? Dis-moi !Citation:
"parent" n'est pas le terme exact, Patrick
Lorsque aero est activé, il traite automatiquement la fenêtre window en cours et lui "colle au cul" (pardonne cette expression imagée). L'image créée par aero n'est pas un "parent" ni une "fille" de la fenêtre traitée, mais une espèce d' "associé" actif dans les deux sens (que l'on déplace l' "image" ou la fenêtre du Userform, l'autre suit). L'interactivité entre les deux est omniprésente.
Je n'y vois que des relevés concernant non cette "image" aero, mais le userform lui-même !
en quoi il le contredit??
ben ma fois tu prétends que c'est une association moi je te dis qu'il sont fils et père sinon getparent ne le donnerait pas
tu déraille ou quoi
tiens pour m'amuser je le sort des coucougnettes de son papa
allez
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long Private Declare Function WindowFromPoint Lib "user32" (ByVal xpoint As Long, ByVal ypoint As Long) As Long Public Declare Function SetParent Lib "user32" (ByVal hWndChild As Long, ByVal hWndNewParent As Long) As Long Public Declare Function GetParent Lib "user32" (ByVal hwnd As Long) As Long Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) Sub testballade_userform() With CreateObject("WScript.Shell"): ppx = .RegRead("HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics\AppliedDPI") / 72: End With With UserForm1 .Show 0 handle_Caption = FindWindow(vbNullString, UserForm1.Caption) handle_Caption_by_W_f_point = WindowFromPoint((.Left + 5) * ppx, (.Top + 5) * ppx) handle_interieur = WindowFromPoint((.Left + 30) * ppx, (.Top + 30) * ppx) Debug.Print "findwindow " & handle_Caption Debug.Print "windowfrompoint caption " & handle_Caption_by_W_f_point Debug.Print "windowfrompoint interieur " & handle_interieur Debug.Print "parent du handle_interieur " & GetParent(handle_interieur) handle_application = Application.hwnd SetParent handle_interieur, handle_application SetWindowPos handle_interieur, 0, (UserForm1.Left - 300) * ppx, (UserForm1.Top * ppx), 300, 300, 0 End With End Sub
Bonjour Nicolas
Ce test ne nous apprend rien.
Il ne fait qu'afficher ce que nous savons depuis kala-kala : l' "intérieur" d'un userform est fille du userform.
Et ?
Quoi de neuf là-dedans ?
Et qu'est-ce que cela a à voir avec l' "image" créée par aero ?
Seule est traitée dans ce code la fenêtre de l'userform. Pas la "création" faite par aero ...;)
Quel rapport avec (citation à nouveau) :
Citation:
"parent" n'est pas le terme exact, Patrick
Lorsque aero est activé, il traite automatiquement la fenêtre window en cours et lui "colle au cul" (pardonne cette expression imagée). L'image créée par aero n'est pas un "parent" ni une "fille" de la fenêtre traitée, mais une espèce d' "associé" actif dans les deux sens (que l'on déplace l' "image" ou la fenêtre du Userform, l'autre suit). L'interactivité entre les deux est omniprésente.
tu sais quoi?
installe toi au moins W7 après on parlera
et entre parenthèses "l'image d'aero" correspond exactement a ce qui est affiché contrairement a ce que tu crois
mon test plus haut dans la discussion le prouve puisque je trouve les écart dans le do loop avec windowfrompoints et que quand je repositionne le usf avec cet écart je suis pile poil
je te le redis installe toi W7 et fait tes test avec après tu pourra parler
Je n'ai nul besoin, Patrick, d'installer WIN 7 pour raisonner.
Tout ce que l'on pourrait tirer comme conclusion de ton code/test est que l' "image aero" n'est pas une fenêtre Windows à part entière (ce qui aurait pour effet que le WindowsFromPoint traiterait ce que l"image aero" recouvre, à savoir le UserForm lui-même). Et si tel était le cas, toute démarche en vue d'en connaître les dimensions et la position serait vaine, comme je l'ai dit et redit .
Je vais te laisser digérer cet aspect ... ;)