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 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
|
Option Explicit
Declare Function GetWindow Lib "user32" (ByVal hwnd As Long, ByVal wCmd As Long) As Long
Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
Declare Function GetWindowRect Lib "user32" (ByVal hwnd As Long, lpRect As RECT) As Long
Declare Function GetCursorPos Lib "user32" (lpPoint As POINT_) As Long
Type POINT_
X As Long
Y As Long
End Type
Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
Dim point As POINT_, coord As RECT, coord2 As RECT, nomclasse As String * 200
Dim ruban As Long, leleft As Long, mintop As Long, maxtop As Long, minleft As Long, maxright As Long, posy As Long, posx As Long
Dim pointeur
Sub recherche_du_rectanglegrille()
'recherche de la fenetre de la page active avec l'api findwindow
pointeur = FindWindow("XLMAIN", vbNullString)
pointeur = GetWindow(pointeur, 5)
Do
'on cherche le handle de la grille
DoEvents
GetClassName pointeur, nomclasse, 250
If LCase(Left(nomclasse, 6)) = "xldesk" Then Exit Do 'on sort de la boucle si le text de la fenetre est celui du bureau "desktop"
pointeur = GetWindow(pointeur, 2)
'on créé un rectangle virtuel '(tu ne le verra pas rassurre toi)ayant les dimentions de la grille(a1 a la derniere a droite que tu vois)
Call GetWindowRect(pointeur, coord2)
Loop
ruban = coord2.Top 'donc la hauteur du ruban c'est le top de la grille
leleft = coord2.Left ' pareil pour le left de la grille
'on determine le minimum et le maximum corespondant au chape rectangle 1 *4/3 pour des dimentions en pixels bien que c'est une formule aproximative cela peut changer selon les ecrans
'son top
mintop = ActiveSheet.Shapes("Rectangle 1").Top * 4 / 3
' son bottom
maxtop = ActiveSheet.Shapes("Rectangle 1").Top * 4 / 3 + ActiveSheet.Shapes("Rectangle 1").Height * 4 / 3
'son left
minleft = ActiveSheet.Shapes("Rectangle 1").Left * 4 / 3
'son right
maxright = ActiveSheet.Shapes("Rectangle 1").Left * 4 / 3 + ActiveSheet.Shapes("Rectangle 1").Width * 4 / 3
Do
WaitMessage 'en attente d'un message (en l'occurence dans le cas présent si j'ai bien compris "nothing ou range")
DoEvents 'permet au reste du fichier de fonctionner
GetCursorPos point 'trouve les coordonnées du curseur
posy = point.Y - ruban - 20 'les coordonnées de la souris partent du haut de l'ecran on va donc enlever a y la hauteur du ruban - la formulabar
posx = point.X - leleft - 20 - 5 'c'est apeu pres pareil pour le left
DoEvents
'maintenant en comparant la position de la souris avec les 4 mesures
If posy > mintop And posy < maxtop And posx > minleft And posx < maxright Then
DoEvents
'si la souris est dans ce rectangle formé par les mesures il est rouge
ActiveSheet.Shapes("rectangle 1").Fill.ForeColor.RGB = (vbRed)
Else
DoEvents
'sinon il est blanc
ActiveSheet.Shapes("Rectangle 1").Fill.ForeColor.RGB = (vbBlue)
End If
Loop While tourne = True 'la boucle tournera tant que tu n'a pas recliqué sur le bouton
End Sub |
Partager