Wie um den cursor zu bewegen oder zu simulieren, Klicks für andere Anwendungen?
Ich bin erstellen einer C# - Windows-Anwendung mit der Leap Motion Controller. Ich entwickle auf Windows 8 und Visual Studio 2010. Ich benutze SetCursorPos
und mouse_event
aus user32.dll
um den cursor zu bewegen und Klick simulieren.
Ich soll der cursor bewegt werden, wenn Sie in einer beliebigen Anwendung. Wenn ich ausführen/Debuggen von Visual Studio funktioniert es nur, wenn in der Anwendung selbst oder in Visual Studio. Wenn in anderen Programmen die Maus nicht bewegen und die Klicks, die nicht arbeiten, aber wenn ich versuche, Sie zu bewegen Sie den cursor mit der echten Maus geht es zurück zu dem Ort, es war. Beim laufen standalone, es bewegt sich nicht in Visual Studio und mit der Maus verschoben werden können, die mit der realen Maus in anderen Anwendungen.
Ich habe diesen code zu verwenden SetCursorPos
und 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);
}
In meiner form-Klasse habe ich die Maus Standort gespeichert in zwei Felder. In einem Timer
's tick-ich setze die cursor-position und tun notwendig Klicks so:
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);
}
}
Den if
Aussagen sind für das Leap-Gerät; ich will die Maus zu bewegen und andere Sachen nur, wenn es eine hand, um die Koordinaten.
Ist es sogar möglich, um den cursor zu bewegen oder Mausklicks zu simulieren, die für andere Anwendungen? Und wenn ja, wie?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Du hast mich inspiriert, umgestalten, einige meiner automation code:
NativeMethods.cs - bekam die meisten dieser von online:
}
MouseInput.cs
Ja, Sie wollen verwenden Sie die "SendInput" - Funktion.
finden Sie unter: SendInput nicht durchführen, klicken Sie auf Maus-Taste, wenn ich den cursor bewegen
Auch,
http://www.pinvoke.net/default.aspx/user32.sendinput
und
http://www.pinvoke.net/default.aspx/Structures/INPUT.html
Habe ich behoben, durch das erste hyper-link - siehe den Kommentar über:
Gibt es ein paar Dinge, die Sie berücksichtigen sollten, wenn über die SendInput-Funktion.
Wenn Sie nicht angeben der MOUSEEVENTF_ABSOLUTE-flag dann dx und dy (MouseInputData Struktur) sind die relativen Koordinaten der aktuellen Mausposition. Wenn Sie angeben, MOUSEEVENTF_ABSOLUTE dann dx und dy sind die Koordinaten zwischen 0 und 65535. Also, wenn Sie Ihre x-und y-Koordinaten sind Bildschirmkoordinaten verwenden Sie die folgende Funktion zur Berechnung von dx und dy:
und
http://msdn.microsoft.com/en-us/library/ms646310%28VS.85%29.aspx
SendInput
waren richtig, aber die Maus ging auf die Koordinaten, die etwa 10-mal kleiner). Auch noch nicht in anderen Anwendungen arbeiten, das war das ursprüngliche problem.uiAccess="true"
im manifest gemacht, der cursor stecken, die für andere Anwendungen. Ich werde wahrscheinlich schauen Sie in meine Sprung-code, das problem scheint da zu sein.Habe ich es geschafft das problem zu lösen mich selbst.
Gab es zwei Probleme. Der erste (und wichtigste) war, dass die Sprung-Gerät war nicht senden von frames zu meiner Anwendung, wenn es in den hintergrund. Das war behoben, durch das hinzufügen dieser code, um den Hörer
onConnect()
Methode, wie vorgeschlagen,hier:Das zweite problem war, dass beim ausführen von standalone-Anwendung hat keinen Zugriff zum senden Eingang in andere Anwendungen. Ich folgte den Anweisungen gefunden hier (nach unten scrollen, da gibt es info über
uiAccess
) und hier und unterschrieb meinen Antrag und fügte hinzu, das zum manifest: