Bonjour,
Je cherche un composant ou une méthode pour obtenir le handle d'une fenêtre (n'importe quelle appli ouverte) en pointant dessus !
un peu comme dans cette appli
Pièce jointe 223559
Version imprimable
Bonjour,
Je cherche un composant ou une méthode pour obtenir le handle d'une fenêtre (n'importe quelle appli ouverte) en pointant dessus !
un peu comme dans cette appli
Pièce jointe 223559
Bonjour,
Qu'Est-ce que tu entends par composant ?
Tu cherches quelque chose que tu peux utiliser à partir d'Excel (Application) ou d'un de tes programmes ?
Oui un composant pour mettre sur un Userform excel et en cliquant dessus je pourrai pointer l'appli qui m'intéresse pour obtenir son windows handle .
Par exemple je veux récupérer le handle d'une autre session de Excel
Bonjour
Peux-tu s'il te plait être plus précis ?
Veux-tu dire extraire le handle d'une fenêtre sur laquelle tu mets ton curseur ? (si oui : facile)
ou
Autre chose (et quoi) ?
oui c'est ça
Bien.
Petite expérience :
- un userform et ce code :
Lance le userformCode:
1
2
3
4
5
6
7
8
9
10
11
12
13 Private Type POINTAPI X As Long Y As Long End Type Private Declare Function WindowFromPoint Lib "user32" (ByVal xPoint As Long, ByVal yPoint As Long) As Long Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long Private Sub UserForm_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) Dim Pt As POINTAPI GetCursorPos Pt MsgBox "cette fenêtre a pour handle : " & WindowFromPoint(Pt.X, Pt.Y) End Sub
Click où tu veux sur ce userform et garde enfoncé le bouton de ta souris
Bouton gardé enfoncé, rends-toi où tu veux (la fenêtre que tu veux) et libère le bouton --->> regarde
Autre manière (somme toute identique) si tu préfère :
un label label1 ajouté et -->>
Tu clique du droit, garde enfoncé et te "balades" où tu veux. Regarde ce qui se passe dans le label.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14 Private Type POINTAPI X As Long Y As Long End Type Private Declare Function WindowFromPoint Lib "user32" (ByVal xPoint As Long, ByVal yPoint As Long) As Long Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long Private Sub UserForm_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) If Button <> 2 Then Exit Sub ' j'ai choisi ici le bouton droit (mais ce n'est qu'un choix) Dim Pt As POINTAPI GetCursorPos Pt Label1.Caption = WindowFromPoint(Pt.X, Pt.Y) End Sub
Merci pour ce code,
mais en fait le déplacement reste dans le formulaire,
J'ai besoin de trouver le Handle d'une FENETRE PARENT comme WORD OU OUTLOOK.
Bonjour,
c'est pas parce que le userform est modal que du coup t'es bloqué pour changer de fenêtre parente ?
en passant par un userform non modal, tu peux probablement changer "d'application" et pointer sur word ou autre ?
Non ca ne change rien.
J'ai trouvé une solution avec une dll
http://www.codeproject.com/Articles/...e-Mouse-Events
mais je préférerai un code entierement dans Excel ou avec des composants standards
Quand j'ai testé la proposition de unparia, j'avais justement passé le userform en non modal
suivant "l'endroit" où je relâchais le clic souris, le numéro renvoyé changeait. y compris si je relâchait le clic sur un fenêtre word.
il était identique pour chaque "relâchement" effectué au même endroit, et j'ai donc dû en déduire à tort que c'était ce que tu cherchais :oops:
Coucou, les zamis
Testé, re-testé et re-re-testé ! Mon code ne se "trompe" pas ... (et pour cause !)
Effectivement cela fonctionne, je l'utilisais mal car il faut au départ cliquer sur une zone vide du formulaire et j'avais un label trop gros.
un petit ajout le nom de la fenetre
et une option que l'userform soit toujours visible
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
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 Private Type POINTAPI X As Long Y As Long End Type Private Declare Function WindowFromPoint Lib "user32" (ByVal xPoint As Long, ByVal yPoint As Long) As Long Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" _ (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" ( _ ByVal lpClassName As String, _ ByVal lpWindowName As String) As Long Private 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 Const HWND_TOPMOST = -1 Const HWND_NOTOPMOST = -2 Const SWP_NOMOVE = &H2 Const SWP_NOSIZE = &H1 '* The GetCursorPos function retrieves the cursors position, in screen coordinates. Function GetWindowTitle(CoordX As Long, CoordY As Long) As String Dim strTitle As String strTitle = String(255, Chr$(0)) GetWindowText WindowFromPoint(CoordX, CoordY), strTitle, 255 strTitle = Left$(strTitle, InStr(strTitle, Chr$(0)) - 1) GetWindowTitle = strTitle End Function Private Sub UserForm_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) If Button <> 2 Then Exit Sub ' j'ai choisi ici le bouton droit (mais ce n'est qu'un choix) Dim Pt As POINTAPI GetCursorPos Pt Label1.Caption = WindowFromPoint(Pt.X, Pt.Y) Label2.Caption = GetWindowTitle(Pt.X, Pt.Y) End Sub Private Sub UserForm_Initialize() 'pour que l'userform soit toujours visible mlHwnd = FindWindow("ThunderDFrame", Me.Caption) 'Change to match your userforms caption Do While mlHwnd = 0 mlHwnd = FindWindow("ThunderDFrame", Me.Caption) 'Change to match your userforms caption DoEvents Loop 'Set topmost SetWindowPos mlHwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE End Sub
Tu as l'as l'essentiel, maintenant.
A savoir : déterminer le handle d'une fenêtre sous le curseur à partir des coordonnées du curseur.
On en fait ensuite ce que l'on veut et comme on le veut. Y compris (mais pas uniquement) en utilisant Application.Ontime (pourquoi pas ?) et s'affranchir ainsi des évènements du userform.
Voilà. Le reste n'est que conception, à partir de là.
Merci Unparia,
Encore une chose comme trouver le Handle de l'application parente ?
Parente de quelle fenêtre ?
Donne un exemple.
Après réflexion,je ne pense pas que tu cherches à extraire le handle de là où tu pars (cela, tu sais sûrement déjà le faire), mais celui d'une fenêtre qui contiendrait un contrôle (externe, donc), sur lequel tu mettrais ton curseur.
Si tel est le cas, les fonctions GetAncestor et GetParent de la librairie user32 de l'Api de Windows sont clairement ta solution.
+1
trop fort
Code:
1
2
3
4
5
6
7
8
9
10 Public Declare Function GetAncestor Lib "user32.dll" ( _ ByVal hwnd As Long, _ ByVal gaFlags As Long) As Long Const GA_ROOTOWNER As Long = 3& Sub getappli() AppHWnd = GetAncestor(UserFormHWnd, GA_ROOTOWNER) end sub
Bien.
Problème objet de cette discussion résolu ?
(une partie de pêche m'attend, maintenant).
re
Bonjour a tous
oliv intéressante ton idée
je me suis donc amusé a faire le mien
comme je ne voulais pas faire une boucle perpétuelle j'utilise le keydown de l'usf
il suffit de loader le userform et de déplacer la souris dans l'écran sans toucher au bouton de la bestiole
et taper la touche "X"
exemple fichier joint
Bonjour patricktoulon
J'ai déjà eu l'occasion de parler de cette manière (utilisation de la position du curseur) de détermination du handle d'une fenêtre.
Le reste (la méthode utilisée pour ce qui touche la position du curseur) est secondaire et dépend surtout de la finalité recherchée. Dans certain cas de figure, il arrive même que l'on ne déplace absolument pas le curseur mais que l'on parcoure, pixel par pixel, la totalité de l'écran jusqu'à y trouver quelque-chose de particulier révélateur de ce que l'on est aux coordonnées intéressantes et on lance alors la fonction WindowFromPoint en lui passant directement ces coordonnées (celle de la boucle, là où on l'arrête).
Tu vois pourquoi j'ai mis l'accent sur cette fonction seule et que j'ai parlé de "conception" pour les autres aspects.
Ceci étant dit :
- j'évite personnellement l'utilisation d'un évènement clavier alors que je suis sur mon userform (multiples raisons). On peut très bien s'y prendre autrement, également avec le clavier et sans boucle et sans évènement clavier du userform. Mais (une autre fois) on traite là autre chose que ce qui était demandé, à savoir : extraction du handle de la fenêtre "pointée" (quelle que soit, donc, la méthode mise en oeuvre pour pointer). Et dans le cas où l'on met en oeuvre un balayage que j'ai cité au-dessus, on ne "pointe" même pas.
- comme je le dis dans ma premère phrase, j'ai déjà eu l'occasion d'exposer ici de genre de mécanisme. Si la finalité, toutefois, est la même que celle exposée à l'époque (robotisation d'une application externe) : garder à l'esprit que toutes ces manoeuvres auront l'effet d'un coup d'épée dans l'eau si le créateur de l'appli considérée à prévu des barrières (qui peuvent être variées, voire en outre conjuguées). ;)
Bonsoir unparia
alors la!!: utiliser cette conception est a mon gout pire que les autres sachant que je bosse sur un écran tv parcourir pixel par pixel c'est de la cloonerieCitation:
Dans certain cas de figure, il arrive même que l'on ne déplace absolument pas le curseur mais que l'on parcoure, pixel par pixel, la totalité de l'écran jusqu'à y trouver quelque-chose de particulier révélateur de ce que l'on est aux coordonnées intéressantes et on lance alors la fonction WindowFromPoint en lui passant directement ces coordonnées (celle de la boucle, là où on l'arrête).
surtout sachant que l'on peut lister les fenêtres affichées a l'écran comme je l'ai démontré dans la discutions web téléchargement. a partir de la les apis windowfrompoint et autre sont complètement inutiles