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
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
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 ?
MPi²
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) ?
Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .
****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...
Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.
oui c'est ça
Bien.
Petite expérience :
- un userform et ce code :
Lance le userform
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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
Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .
****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...
Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.
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
Coucou, les zamis
Testé, re-testé et re-re-testé ! Mon code ne se "trompe" pas ... (et pour cause !)
Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .
****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...
Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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à.
Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .
****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...
Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.
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.
Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .
****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...
Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.
+1
trop fort
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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).
Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .
****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...
Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.
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
mes fichiers dans les contributions:
mail avec CDO en vba et mail avec CDO en vbs dans un HTA
survol des bouton dans userform
prendre un cliché d'un range
si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
et n'oublie pas de voter
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).
Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .
****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...
Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.
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 cloonerieDans 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
mes fichiers dans les contributions:
mail avec CDO en vba et mail avec CDO en vbs dans un HTA
survol des bouton dans userform
prendre un cliché d'un range
si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
et n'oublie pas de voter
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager