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

  • Initiateur de la discussion Initiateur de la discussion Dudu2
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

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
 
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 😭 .
 
@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:
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 ...
 
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

Dernière édition:
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.
 
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
 
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:
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 .... 👍
 
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é" ...
 
@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

Dernière édition:
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
11
Affichages
437
Réponses
2
Affichages
312
  • Question Question
Microsoft 365 affichage userform
Réponses
4
Affichages
365
Retour