Merci NICOLAS, mais ta capture d'écran m'interpelle. Est-ce vraiment là un userform en mode aero activé ?
Version imprimable
Merci NICOLAS, mais ta capture d'écran m'interpelle. Est-ce vraiment là un userform en mode aero activé ?
J'avais un doute du coup, mais le test fait précedement était activé
et désactivé ça donne ça
apparence identique sur l'affichageCitation:
curseur tout contre handle obtenu = 856290
curseur sur le userform apparent handle obtenu = 7603792
FINDWINDOWS handle obtenu = 4590018
Curseur dans la barre de titre handle obtenu = 4590018
@Nicolas :
curseur tout contre handle obtenu = 856290 ==> hwnd de l'application qui est derrière l'userform
curseur sur le userform apparent handle obtenu = 7603792 ==> hwnd de la partie de l'userform qui réagit aux événement Mouse_Move (par exemple)
FINDWINDOWS handle obtenu = 4590018 ==> hwnd de l'usf
Curseur dans la barre de titre handle obtenu = 4590018 ==> hwnd de la bordure
bonjour
je l'ai dis hier que findwindow ramenait le même que windowfrompoint(x,y) sur la caption
alors comme windowfrompoint dans un do loop a tâtonner me permet de trouver la différence
essayez avec getwindowrect pour déterminer le rect.left et rect.top ( quoi que il me semble déjà avoir essayé )
après si il faut vraiment et que l'on a bien 2 handle (caption,Inside)
on peut faire un getwindowrect sur Inside
avec getsystemmetric 46 si je me souviens bien on a le borderwidth que l'on ajoute et le comparer avec la position qu'il devrait avoir
mais malheureusement findwindowhex sur handle userform ou handle trouver par caption ne ramène rien ;0 nada
c'est balo!!!
Désolé, Patrick, mais ce que tu dis n'as absolument rien à voir, si l'on ne fait pas le test manuellement et proprement.
Bon.
Après ma siestita, je proposerai un dernier test, fait encore différemment et --->>
- s'il montre que l'image crée par directx est une fenêtre à part entère -->> sauvés
- s'il montre au contraire qu'il ne s'agit que d'une image et non d'une fenêtre à part entère --->> terminé : il n'y aura AUCUNE solution.
re
Pièce jointe 293841Code:
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 Declare Function GetWindowRect Lib "user32" (ByVal hwnd As Long, lpRect As RECT) As Long Type RECT: Left As Long: Top As Long: Right As Long: Bottom As Long: End Type Sub test_userform_replace2222() Dim rect1 As RECT, rect1bis As RECT, rect2 As RECT 'With CreateObject("WScript.Shell"): ppx = .RegRead("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\ThemeManager\LastLoadedDPI") / 72: End With With CreateObject("WScript.Shell"): ppx = .RegRead("HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics\AppliedDPI") / 72: End With With ActiveWindow X = (.ActivePane.PointsToScreenPixelsX([D3].Left)) / ppx Y = (.ActivePane.PointsToScreenPixelsY([D3].Top)) / ppx With UserForm1: .Show 0: .Left = X: .Top = Y: handle1 = FindWindow(vbNullString, UserForm1.Caption): handle1bis = handle1 handle1bis = WindowFromPoint(X * ppx - 1, Y * ppx - 1) handleinside = WindowFromPoint(X + 10, Y + 10) End With End With GetWindowRect handle1, rect1 GetWindowRect handle1bis, rect1bis GetWindowRect handleinside, rect2 texte = "handle (userform par findwindow) " & handle1 & vbCrLf & "handle inside " & handleinside & vbCrLf & "handle1(userform par windowfrompoint " & handle1bis texte = texte & vbCrLf & "----------------------------" & vbCrLf & "avec api getwindowrect" texte = texte & vbCrLf & "left handle (userform)par findwindow " & rect1.Left & vbCrLf & "left handle (userform)par windowfrompoint " & rect1bis.Left & vbCrLf & _ "left handleinside " & rect2.Left & vbCrLf & "position left cellule D3 par pointstoscreenpixel " & X * ppx MsgBox texte End Sub
avec les api a part le do loop avec windowfrompoint il n'y a aucune solution
a part mon switch pas élégant oui mais fonctionne
si j'ai posé la question au tout début a savoir"y a t il un moyen de remplacer mon switch par api ou autre" c'est que j'avais déjà essayé plusieurs api qui me donnaient pareil que point toscreenpixels qui contrairement a ce que tu a cru longtemps est juste
j'ai juste poser la question au cas ou j'aurais éventuellement zapper une api ou autre qui m'aurais échappé
Re-désolé, patricktoulon, mais :
La détermination de la nature de ce que ce (fenêtre à part entière ou simple image) que l'on a à l'écran (avec aero actvé) n'a absolument rien à voir avec l'emplacement du userform (ou de son image), que cet emplacement soit une cellule de la feuille ou sur n'importe quoi d'autre !
Mélanger les genres ne sert ici rigoureusement à rien, sinon à s'égarer inutilement.
a bon!!?
et que fait ton depuis un moment avec windowsfrompoint ? qui a moins que nous ai trouvé une autre surprise est le seul a pouvoir nous donner ce décalage d'image dans un do loop
les api donnent la même chose que pointstoscreenpixels voila tout
que ce soit par le rectangle par setwindowpos
je cherche un peu dans GDI mais perso j'ai peu d'espoir
par contre j'ai fait une découverte avec pointstoscreenpixels je vais pas trop en parler je veux savoir de quoi il retourne
mais sache déjà que pour 2007 j'ai trouvé le moyen de calculer le coefficient exact avec pointstoscreenpixels sans passer ni par les api ni par le registre et pour tout les zooms
j'avoue y être allé a taton mais quand j'ai vu le chiffre final woahw!!!! je me suis dis puré je connais ce nombre toi aussi ainsi que tout le monde ayant participé a cette discussion d'ailleurs
Ouais ... ?
Bon.
J'ai peut-être une bonne nouvelle à la suite d'une petite découverte faite sur une fenêtre de userform sans aero (sous xp).
Il se peut que les relevés faits jusqu'à présent aient été faussés par la forme même du userform.
Je reviens plus tard (je fais une série de tests).
a bon!? maintenant si il est plutôt rectangle que carré ca change la donne ?
nan!!... je plaisante
de toute façon je suis persuadé que si et quand on trouvera ce sera un truc tout bête
Non, ce n'est pas cet aspect-là de la forme, qui peut avoir faussé nos tests antérieurs ;)Citation:
si il est plutôt rectangle que carré ca change la donne ?
A propos de ton "correctif", Patrick : j'espère qu'il n'est pas un pourcentage de la hauteur de la barre de titre (hauteur calculée en faisant la différence du height et du insideheight). Ce ne serait pas une bonne idée car dépendante de la création éventuelle par microsoft de nouveaux thèmes "débordant" différemment.
je me suis ampétrer dans des calculs et tous me ramène a ca sans execption
ma résolution est de 1920 en horizontal on le trouve avec les api et le registre ca il n'y a pas de soucis
mais qu'and est il vraiment ???
en fait on constate que si on va plus loin avec cetsystemmetric on trouve la largeur et hauteur max en pixel de votre écran et donc chez moi c'est 1938
maintenant faisons un calcul simple
1920-1938=-18
j'ai donc 18 pixel en moins dans ma résolution
que je vais divisé par mon coeff ptTopx (1.666.....)j'obtient donc -10.xxxxxxxxxxx
que je divise par 2 histoire de ne pas rendre les coté de mon écran jaloux hein !!
qu'est que j'obtiens
-5.xxxxxxxxxxx
que j'ajoute en positif a pointstoscreenpixels(cellule.left)
et j'ai mon userform en place
maintenant la question qui se pose
serait ce parce que le calcul se fait sur la vrai résolution et non celle adapter sur Windows
ou le calcul se fait sur la résolution Windows mais l'affichage se fait avec la vrai résolution
to be or not to be that's the question
Je pense personnellement qu'il ne s'agit là que d'une coïncidence, Patrick.Citation:
maintenant la question qui se pose
serait ce parce que le calcul se fait sur la vrai résolution et non celle adapter sur Windows
je sais pas mais c'est troublant le fait que le resultat de 1938/1920 que j'applique en division en pointstoscreenpixelx(cellule.left) donne le même résultat soit ajoute les 5 qui manque
Et si tu veux en avoir le coeur net : modifie donc la configuration en choisissant une autre résolution, de préférence avec un rapport Largeur/hauteur en pixels très différent.
Et reprends ensuite en modifiant également le dpi (en le mettant par exemple à 96 et sans oublier qu'il ne sera alors réellement pris en compte, lui, qu'après un redémarrage)
en attendant voici un pdf de toutes les constantes que j'utilise dans mes codes
regarde aussi le 32 ,60
en fait on a tout ici
Merci, mais j'ai (liste personnelle) ce qu'il faut en bien plus complet et par catégories ;)
Il ne me manque que ce qui "colle" avec certains composants de Excel/VBA (listbox, combobox, textbox, etc...) qui sont très différents de ceux de VB6 et autres outils de développement.
Revenons plutôt à nos moutons : As-tu fait des tests après modification des paramètres de configuration ?
et bien non ca correspond toujours j'ai toujours mes 18pixels
laisse moi le temps de revenir a la normal c'est impraticable sur mon ecrant en 1080*768:lol:
une horreur le machin
en resolution 1600*900
en resolution 1280*720Citation:
getsystemmetrics (0) 1600
getsystemmetrics (1) 900
getsystemmetrics (2) 21
getsystemmetrics (3) 21
getsystemmetrics (4) 27
getsystemmetrics (5) 1
getsystemmetrics (6) 1
getsystemmetrics (7) 3
getsystemmetrics (8) 3
getsystemmetrics (9) 21
getsystemmetrics (10) 21
getsystemmetrics (11) 40
getsystemmetrics (12) 40
getsystemmetrics (13) 32
getsystemmetrics (14) 32
getsystemmetrics (15) 25
getsystemmetrics (16) 1600
getsystemmetrics (17) 839
getsystemmetrics (18) 0
getsystemmetrics (19) 1
getsystemmetrics (20) 21
getsystemmetrics (21) 21
getsystemmetrics (22) 0
getsystemmetrics (23) 0
getsystemmetrics (24) 0
getsystemmetrics (25) 0
getsystemmetrics (26) 0
getsystemmetrics (27) 0
getsystemmetrics (28) 158
getsystemmetrics (29) 45
getsystemmetrics (30) 43
getsystemmetrics (31) 26
getsystemmetrics (32) 9
getsystemmetrics (33) 9
getsystemmetrics (34) 158
getsystemmetrics (35) 45
getsystemmetrics (36) 4
getsystemmetrics (37) 4
getsystemmetrics (38) 116
getsystemmetrics (39) 94
getsystemmetrics (40) 0
getsystemmetrics (41) 0
getsystemmetrics (42) 0
getsystemmetrics (43) 5
getsystemmetrics (44) 0
getsystemmetrics (45) 2
getsystemmetrics (46) 2
getsystemmetrics (47) 160
getsystemmetrics (48) 32
getsystemmetrics (49) 20
getsystemmetrics (50) 20
getsystemmetrics (51) 22
getsystemmetrics (52) 21
getsystemmetrics (53) 21
getsystemmetrics (54) 24
getsystemmetrics (55) 24
getsystemmetrics (56) 8
getsystemmetrics (57) 160
getsystemmetrics (58) 32
getsystemmetrics (59) 1612
getsystemmetrics (60) 912
getsystemmetrics (61) 1618
getsystemmetrics (62) 884
getsystemmetrics (63) 3
getsystemmetrics (64) 0
getsystemmetrics (65) 0
getsystemmetrics (66) 0
getsystemmetrics (67) 0
getsystemmetrics (68) 4
getsystemmetrics (69) 4
getsystemmetrics (70) 0
getsystemmetrics (71) 19
getsystemmetrics (72) 19
getsystemmetrics (73) 0
getsystemmetrics (74) 0
getsystemmetrics (75) 1
getsystemmetrics (76) 0
getsystemmetrics (77) 0
getsystemmetrics (78) 1600
getsystemmetrics (79) 900
getsystemmetrics (80) 1
getsystemmetrics (81) 1
getsystemmetrics (82) 1
getsystemmetrics (83) 1
getsystemmetrics (84) 1
getsystemmetrics (85) 4
getsystemmetrics (86) 0
getsystemmetrics (87) 1
getsystemmetrics (88) 0
getsystemmetrics (89) 0
getsystemmetrics (90) 0
getsystemmetrics (91) 0
getsystemmetrics (92) 0
getsystemmetrics (93) 640
getsystemmetrics (94) 0
getsystemmetrics (95) 1
getsystemmetrics (96) 0
getsystemmetrics (97) 0
getsystemmetrics (98) 0
getsystemmetrics (99) 0
getsystemmetrics (100) 0
quelque chose me dit qu'il y a a faire avec caCitation:
getsystemmetrics (0) 1280
getsystemmetrics (1) 720
getsystemmetrics (2) 21
getsystemmetrics (3) 21
getsystemmetrics (4) 27
getsystemmetrics (5) 1
getsystemmetrics (6) 1
getsystemmetrics (7) 3
getsystemmetrics (8) 3
getsystemmetrics (9) 21
getsystemmetrics (10) 21
getsystemmetrics (11) 40
getsystemmetrics (12) 40
getsystemmetrics (13) 32
getsystemmetrics (14) 32
getsystemmetrics (15) 25
getsystemmetrics (16) 1280
getsystemmetrics (17) 659
getsystemmetrics (18) 0
getsystemmetrics (19) 1
getsystemmetrics (20) 21
getsystemmetrics (21) 21
getsystemmetrics (22) 0
getsystemmetrics (23) 0
getsystemmetrics (24) 0
getsystemmetrics (25) 0
getsystemmetrics (26) 0
getsystemmetrics (27) 0
getsystemmetrics (28) 158
getsystemmetrics (29) 45
getsystemmetrics (30) 43
getsystemmetrics (31) 26
getsystemmetrics (32) 9
getsystemmetrics (33) 9
getsystemmetrics (34) 158
getsystemmetrics (35) 45
getsystemmetrics (36) 4
getsystemmetrics (37) 4
getsystemmetrics (38) 116
getsystemmetrics (39) 94
getsystemmetrics (40) 0
getsystemmetrics (41) 0
getsystemmetrics (42) 0
getsystemmetrics (43) 5
getsystemmetrics (44) 0
getsystemmetrics (45) 2
getsystemmetrics (46) 2
getsystemmetrics (47) 160
getsystemmetrics (48) 32
getsystemmetrics (49) 20
getsystemmetrics (50) 20
getsystemmetrics (51) 22
getsystemmetrics (52) 21
getsystemmetrics (53) 21
getsystemmetrics (54) 24
getsystemmetrics (55) 24
getsystemmetrics (56) 8
getsystemmetrics (57) 160
getsystemmetrics (58) 32
getsystemmetrics (59) 1292
getsystemmetrics (60) 732
getsystemmetrics (61) 1298
getsystemmetrics (62) 704
getsystemmetrics (63) 3
getsystemmetrics (64) 0
getsystemmetrics (65) 0
getsystemmetrics (66) 0
getsystemmetrics (67) 0
getsystemmetrics (68) 4
getsystemmetrics (69) 4
getsystemmetrics (70) 0
getsystemmetrics (71) 19
getsystemmetrics (72) 19
getsystemmetrics (73) 0
getsystemmetrics (74) 0
getsystemmetrics (75) 1
getsystemmetrics (76) 0
getsystemmetrics (77) 0
getsystemmetrics (78) 1280
getsystemmetrics (79) 720
getsystemmetrics (80) 1
getsystemmetrics (81) 1
getsystemmetrics (82) 1
getsystemmetrics (83) 1
getsystemmetrics (84) 1
getsystemmetrics (85) 4
getsystemmetrics (86) 0
getsystemmetrics (87) 1
getsystemmetrics (88) 0
getsystemmetrics (89) 0
getsystemmetrics (90) 0
getsystemmetrics (91) 0
getsystemmetrics (92) 0
getsystemmetrics (93) 640
getsystemmetrics (94) 0
getsystemmetrics (95) 1
getsystemmetrics (96) 0
getsystemmetrics (97) 0
getsystemmetrics (98) 0
getsystemmetrics (99) 0
getsystemmetrics (100) 0
je suis curieux de voir ce que ca donne sur ton pc
Code:
1
2
3
4
5
6 Sub testmetrics() For i = 0 To 100 Debug.Print "getsystemmetrics (" & i & ") " & GetSystemMetrics(i) Next End Sub
Alors oublie cette coincidence.
pas tout a fait mille excuses c'est 12 dans la 2 eme