comment obtenir de la souris cliquez sur les coordonnées en dehors de ma fenêtre en Java
J'ai besoin d'implémenter une classe, à l'aide de Swing, qui peut obtenir les coordonnées de la souris lorsque l'utilisateur clique n'importe où sur l'écran. si je voulais obtenir les coordonnées de la souris à l'intérieur de mon propre fenêtre, j'utiliserais un MouseListener
, mais je veux qu'il fonctionne même lorsque l'utilisateur clique en dehors de mon programme.
Je veux ma classe se comporter comme des KColorChooser: l'utilisateur clique sur le bouton de largage et il peut cliquer n'importe où sur l'écran pour obtenir la couleur de ce spot. mais je ne sais pas si c'est possible à l'aide de Java pur.
Vous devez vous connecter pour publier un commentaire.
Il est possible cependant limitée:
Ajouter un AWTEventListener pour les événements de focus. Tant que votre application a le focus avant que le bouton est cliqué, vous recevrez un accent perdu de l'événement. Requête pour la position du pointeur.
La limitation est que, bien sûr, votre application perd le focus. Donc, en fonction de ce que vous êtes finalement essayé d'atteindre cet objectif pourrait ne pas être utile.
Si vous ne voulez pas perdre le focus, puis vous aurez à prendre temporairement une capture d'écran de la totalité de l'écran et d'afficher dans un écran de remplissage de la fenêtre qui est à l'écoute pour un clic de souris, comme d'habitude.
La preuve de la première méthode:
Cliquant à l'extérieur de l'application produit:
Le deuxième point est à l'extérieur de l'application.
Oublier
GlassPane
, il y a un autre natif de 100% Java façon de faire qui fonctionne à la fois sur OS X et sur Windows.Java a toujours pris en charge translucidité pour son windows sur OS X et de Java, prend désormais en charge la translucidité pour son windows sur Windows aussi (depuis Java 1.6.0_10 ou alors, elle doit être vérifiée).
Donc, l'astuce est: en cliquant sur le "choisir une couleur" outil, vous créez une transparence presque sans bordure Java fenêtre couvrant la totalité de l'écran. Vous réglez son alpha à 10 (alpha va de 0 à 255). Que alpha est si faible que l'utilisateur ne remarque pas qu'il y a une très fine "presque transparent mais très très très translucide" sans frontières fenêtre couvrant la totalité de l'écran.
Maintenant, lorsque l'utilisateur clique sur votre "alpha fixé à 10 translucide sans frontières fenêtre" couvrant la totalité de l'écran, vous obtenez votre (x,y).
Jeter sans frontières Java fenêtre.
Utilisation
Robot
'sgetRgb(x,y)
et vous avez terminé.Pourquoi définir l'alpha de 10 et pas 0? Parce que sinon, les clics ne sont pas interceptés par Java, mais aller directement à l'OS (du moins c'est la façon dont il fonctionne pour un fait sur OS X). Il y a un seuil et je sais que c'est pas mis à '1', ni '2', c'est autour de 10 ou plus.
MODIFIER je viens de réaliser que vous connaissez avez besoin de choisir plusieurs couleurs, c'est plus délicat, mais qui peut encore être fait à l'aide de 100% Java. Vous pouvez soit vivre avec "légèrement" les couleurs (touchés par la "presque transparent", "invisible" de la couche) ou sur l'obtention d'un clic, vous devez supprimer le calque, la bonne couleur de pixel, et de remettre un "presque transparent" de la couche. Maintenant, bien sûr, c'est un diable d'un hack, mais il peut être fait en 100% Java.
Utilisation
p.x et p.y va vous donner des coordonnées à l'extérieur de votre fenêtre.
Ce n'est pas possible à l'aide de Java pur, depuis Java est seulement conscient de MouseEvents sur Windows appartenance à Java.
Ces événements sont dirigés vers la fenêtre qui a le focus, à partir de tous les événements sur le bureau, vous ne pouvez obtenir la position de la souris.
Comme l'a déjà montré par Keilly il est possible d'obtenir la position de la souris.
Vous devez inclure une natif lib
Je n'ai pas essayé moi-même, mais peut-être que vous pouvez créer un affichage plein écran, panneau transparent/cadre/etc, et ajouter un MouseListener pour que.
L'emplacement (x,y) et l'intervalle de temps
(d) entre chaque clic est fourni thru arguments de ligne de commande. Ici, c'est le
programme
Je n'ai pas assez de rep encore à laisser des commentaires, mais voici mes commentaires sur les autres techniques:
Utiliser une lib native: va fonctionner, mais il y a visiblement de la distribution des limitations
Utilisation GlassPane pour remplir tout l'écran: GlassPanes doivent être contenus dans une Fenêtre.
De créer une Fenêtre contenant une image de l'ordinateur de bureau et de remplir la totalité de l'écran: Va fonctionner, mais il va soudainement faire le bureau statique. Le curseur ne change pas, les animations ou des vidéos dans d'autres fenêtres ou de bureau va devenir étrangement statique.
Solution Alternative:
Un raffinement de l'écran de remplissage de la fenêtre, si vous utilisez Java 6u10 ou plus tard, est de rendre la fenêtre complètement transparent. Mettre cette fenêtre en face de tous les autres et écouter les clics de souris. Il a encore des défauts, tels que l'absence de changement de curseur, mais cela dépend de ce que vous voulez faire.
Basé sur SyntaxT3rr0r's réponse que j'ai créé un exemple de sélecteur de couleur en groovy, qui montre comment cela peut fonctionner.
Il est possible avec un peu d'astuce. Doit être de 100% cross-plateforme (testé sur Linux & Windows). En gros, vous créez un petit JWindow, faire "alwaysOnTop" et de la déplacer avec la souris à l'aide d'une minuterie.
Pour plus de détails, voir ma réponse ici.
Regard, je comprends que je suis 7 ans de retard...
C'est un re-make de Keilly de réponse, ce qui permet d'obtenir quand le bouton de la souris est cliqué, n'importe où. Le principal problème est que le plein écran jeux sont toujours floues, et il devient ennuyeux à manipuler.
Voici le code: