Comment faire pour déplacer le curseur ou simuler les clics pour d'autres applications?
Je suis entrain de créer une application Windows en C# à l'aide de la Leap Motion Controller. Je suis le développement sur Windows 8 et Visual Studio 2010. J'utilise SetCursorPos
et mouse_event
de user32.dll
pour déplacer le curseur et de simuler les clics.
Je veux que le curseur soit déplacé quand dans n'importe quelle application. Quand je run/debug de Visual Studio, il ne fonctionne que lorsque dans l'application elle-même ou dans Visual Studio. Alors que dans d'autres applications de la souris ne se déplace pas et les clics ne fonctionnent pas, mais si j'essaie de déplacer le curseur avec la souris, il va revenir à la place qu'il occupait au. Lorsque fonctionner de manière autonome, il ne se déplace pas dans Visual Studio et de la souris peut être déplacé avec la souris, dans d'autres applications.
J'ai ce code pour utiliser SetCursorPos
et mouse_event
:
[DllImport("user32.dll")]
public static extern long SetCursorPos(int x, int y);
[DllImport("User32.Dll")]
public static extern void mouse_event(uint dwFlags, uint dx, uint dy, uint cButtons, uint dwExtraInfo);
public static void MouseClick(uint x, uint y) {
mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, x, y, 0, 0);
}
Dans ma classe de formulaire, j'ai la souris à l'emplacement stocké dans deux domaines. Dans un Timer
's tique-je définir la position du curseur et faire nécessaire clics comme ceci:
if (!frame.Hands.IsEmpty) {
Hand hand = frame.Hands.Leftmost;
if (!hand.Fingers.IsEmpty) {
//Get coordinates...
SetCursorPos(mousex, mousey);
}
}
foreach (Gesture gesture : gestures) {
if (gesture.Type == Gesture.GestureType.TYPESCREENTAP) {
MouseClick(mousex, mousey);
}
}
La if
déclarations sont pour le Saut de l'appareil; je veux déplacer la souris et faire d'autres choses seulement quand il y a une part d'obtenir les coordonnées.
Est-il même possible de déplacer le curseur ou simuler les clics de souris pour d'autres applications? Et si elle l'est, comment?
Vous devez vous connecter pour publier un commentaire.
Vous avez m'a incité à revoir certaines de mes automatisation code:
NativeMethods.cs - obtenu la plupart de cette de en ligne:
}
MouseInput.cs
Oui, vous voulez utiliser le "SendInput" de la fonction.
voir: SendInput ne fonctionne pas cliquez sur le bouton de souris, à moins que j'ai déplacer le curseur
Aussi,
http://www.pinvoke.net/default.aspx/user32.sendinput
et
http://www.pinvoke.net/default.aspx/Structures/INPUT.html
J'ai corrigé le premier hyper lien - voir le commentaire à propos de:
Il ya quelques choses que vous devriez considérer lors de l'utilisation de la SendInput fonction.
Si vous ne spécifiez pas le MOUSEEVENTF_ABSOLUTE drapeau alors dx et dy (MouseInputData structure) sont les coordonnées relatives à la position actuelle de la souris. Si vous ne spécifiez MOUSEEVENTF_ABSOLUTE alors dx et dy sont des coordonnées absolues entre 0 et 65535. Donc, si vos coordonnées x et y sont les coordonnées de l'écran, vous devez utiliser la fonction suivante pour calculer dx et dy:
et
http://msdn.microsoft.com/en-us/library/ms646310%28VS.85%29.aspx
SendInput
étaient correctes, mais la souris est allé aux coordonnées comme 10 fois plus petit). Aussi, ne fonctionne toujours pas dans d'autres applications, qui était à l'origine de problème.uiAccess="true"
dans le manifeste fait le curseur bloqué pour d'autres applications. Je vais probablement regarder dans mon Saut de code, comme le problème semble être là.J'ai réussi à résoudre le problème moi-même.
Il y avait deux problèmes. Le premier (et le principal), il fallait que le Saut de l'appareil n'était pas de l'envoi de cadres à ma demande quand il était à l'arrière-plan. Qui a été résolu par l'ajout de ce code à l'attention de l'auditeur
onConnect()
méthode, comme l'a suggéré ici:Le deuxième problème c'est que lors de l'exécution autonome de l'application n'ont pas accès à l'envoi de données d'entrée pour d'autres applications. J'ai suivi les instructions trouvées ici (faites défiler vers le bas, il y a d'infos sur
uiAccess
) et ici et signé de ma candidature, et ajouté à cela le manifeste: