XL 2016 VBA - Alternative à AddressOf dans un module de classe / UserForm

Dudu2

XLDnaute Barbatruc
Bonjour,
Quelqu'un a-t-il déjà tenté ce challenge ?
Merci
 

fanch55

XLDnaute Barbatruc
Salut @Dudu2 et tous ceux qui suivent le forum .
Depuis quelques années, on peut également connecter un écran sans fil sur W10 ou W11 pourvu que l'écran soit sur le même réseau que le PC.
C'est ce que je fais parfois avec ma Tv chez moi ( avec un petit décalage temporel toutefois )
1699197098996.png


et malheureusement, le Xlm ne détecte pas ce 2ème type d'écran ... ( bon courage..... 😩 )
1699197206165.png
 

Dudu2

XLDnaute Barbatruc
Tout à fait , j'ai testé les 3 envois ...
Effectivement, je pense que la si méthode par Enum (l'API de base pour trouver les moniteurs) ne le détecte pas c'est parce que c'est une juxtaposition via le réseau et pas via une sortie câble de la carte graphique.
Mais c'est quand même étonnant !
Si par Enum Excel ne le trouve pas je n'ai aucune chance de le trouver par Scan. Encore que...

C'est donc un autre problème 😭 .
 

Dudu2

XLDnaute Barbatruc
@fanch55,
J'ai reproduit ta configuration avec ma TV.
1699201432493.png


En réalité la détection par Enum détecte bien la TV. Et c'est rassurant car c'est l'API !

1699201325020.png

1699201498908.png


Par contre mon algorithme par Scan ne la voit pas ! Et là je pige pas du tout.

Edit; MonitorFromPoint() ne rend un Handle = 0 dans la zone moniteur TV.
 
Dernière édition:

fanch55

XLDnaute Barbatruc
C'est un genre de connexion encore dilettante et très capricieux.
Pour refaire d'autres tests, je n'arrive plus à l'activer aujourd'hui, même en redémarrant le PC et/ou la TV .
De plus je n'arrive pas non plus à voir ma TV sur mes portables ( en W10 et W11 ) , c'est chi.....
Dès que j'aurai rétabli les connexions, je retente ...
 

Dudu2

XLDnaute Barbatruc
Alors merci @fanch55, tu m'as permis de trouver un bug idiot (comme tous les bugs !)

En Win64 hMonitor = MonitorFromPoint(Y * 2 ^ 32, Flag)
NON ! C'est hMonitor = MonitorFromPoint(Y * 2 ^ 32 + X, Flag)

Donc le fichier corrigé qui détecte bien la TV avec les 2 méthodes: ByEnum et ByScan !

Edit: petites simplifications des boucles dans le ByScan.
 

Pièces jointes

  • Moniteurs Monitors.xlsm
    47.5 KB · Affichages: 2
Dernière édition:

Dudu2

XLDnaute Barbatruc
Bonjour,
Toujours dans la perspective de détecter les juxtapositions d'écrans par les coins et donc déborder d'un pixel, se pose une question toute bête.

J'ai un écran 1920 x 1080 pixels.
Le RECT du rcMonitor récupéré dit Left = 0, Right = 1920 donc on calcule Width = 1920 - 0 = 1920..
Mais ne devrait-on pas calculer Width = 1920 - 0 + 1 = 1921 ?
Car si le 1er pixel à gauche est 0, le dernier pixel à droite devrait être 1919.
Quelque chose m'échappe dans ces RECT.
 

Dudu2

XLDnaute Barbatruc
D'ailleurs dans de cette image, on voit bien que le Right d'un Moniteur est égal au Left du Moniteur juxtaposé à droite.
Donc le Right et le Bottom d'un RECT indiquent des pixels qui sont hors du cadre d'un pixel.
Je ne comprends pas pourquoi c'est ainsi.

D'ailleurs l'algorithme de détection des moniteurs par Scan, détecte bien les juxtapositions en coins sans avoir à ajouter 1 au Right et au Bottom.

1699251963919.png
 

Dranreb

XLDnaute Barbatruc
Bonjour.
Ces chiffres ne comptent peut être pas les pixels mais plutôt les positions de leurs cotés = 1.
C'est comme lorsque je me calcule une image d'icône: Je la représente souvent en fond d'un graphique allant de 0 au nombre N de pixels de coté, et ces coordonnées représentent des valeurs logique de la géométrie du dessin. Pour calculer l'image je représente les pixels dans un tableau basé 1, surtout pas 0.
Mais je sais que la coordonnée dans le graphique du centre du pixel 1 est 0,5 et celle du dernier N - 0,5.
 
Dernière édition:

fanch55

XLDnaute Barbatruc
Alors merci @fanch55, tu m'as permis de trouver un bug idiot (comme tous les bugs !)
Donc le fichier corrigé qui détecte bien la TV avec les 2 méthodes: ByEnum et ByScan !
Après une nuit de repos, le Pc et la Tv se sont enfin re-découvert ...
Je pense que c'est dû à ma Tv Panasonic qui date de presque 20 ans et de sa fonction de mirroring .
M'enfin, je confirme, les 2 écrans sont bien reconnus que ce soit par byenum ou byscan et si on change le label dans le testuserform, le form se place bien au centre du bon écran .... 👍
 

fanch55

XLDnaute Barbatruc
Après une nuit de repos, le Pc et la Tv se sont enfin re-découvert ...
Je pense que c'est dû à ma Tv Panasonic qui date de presque 20 ans et de sa fonction de mirroring .
M'enfin, je confirme, les 2 écrans sont bien reconnus que ce soit par byenum ou byscan et si on change le label dans le testuserform, le form se place bien au centre du bon écran .... 👍
Un petit bémol cependant, le deuxième écran n'est découvert que si l'affichage est "étendu" et non "dupliqué" ...
 

Dudu2

XLDnaute Barbatruc
@fanch55,
Oui c'est normal qu'il n'y ait pas 2 moniteurs en dupliqué.

Concernant les infos des rectangles...
Si j'ai un moniteur 1 de 1920 x 1080 qui a à sa droite un moniteur 2 de 1000 x 800 les points:
(0, 0) appartient au moniteur 1
(1919, 0) appartient au moniteur 1
(1920, 0) appartient au moniteur 2

Donc il faut bien comprendre que les points faisant référence au Right et/ou au Bottom d'un Rectangle de moniteur ne font PAS partie du moniteur. Il sont 1 pixel au-delà.

Edit: Je crois d'ailleurs que c'est un principe général des Rectangles en VBA (GetWindowRect, GetClientRect, ...). Est-ce que c'est justifié par une simplicité de calcul de Width (Right - Left) et de Height (Bottom - Top) ?

Et c'est normal sur la base du calcul. Et si c'était nécessaire, l'expérience le démontre (voir fichier joint).
 

Pièces jointes

  • Monitor From Point.xlsm
    26.5 KB · Affichages: 0
Dernière édition:

Discussions similaires

Réponses
29
Affichages
920
Réponses
10
Affichages
247

Statistiques des forums

Discussions
312 215
Messages
2 086 329
Membres
103 182
dernier inscrit
moutassim.amine