Entwickler-Ecke

Basistechnologien - Simulieren von Mauseingaben


Overspeed - Mi 09.03.11 21:00
Titel: Simulieren von Mauseingaben
Hallo ich bin NeuCoder und komme einfach nicht weiter...

wie im Code beschrieben möchte ich in meiner Windows Form Anwendung

nach dem Kompilieren durch

die Taste F9 auf der Tastatur drücken und loslassen um damit Links Klicken der Maus aktivieren...


Desweiteren Suche ich eine Methode um das Maus klicken wieder zu stoppen....



C#-Quelltext
1:
2:
3:
4:
5:
void form_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyData == Keys.F9) // <- Wenn die Taste F9 gedrückt wurde...
                this.( ... );         // ....dann ... soll er hier Links Klick der Maus ausführen 
        }


Sorry bin relativ neu...

Moderiert von user profile iconChristian S.: C#-Tags hinzugefügt


Yogu - Mi 09.03.11 21:53

Hallo und :welcome:, user profile iconOverspeed!

Was soll denn genau passieren, wenn der Benutzer F9 drückt bzw. was passiert bei einem Linksklick? Ein Klick auf ein leeres Fenster bewirkt an sich ja nichts, also wirst du das wohl auch nicht wollen. Möchtest du, dass ein Button angeklickt wird? Oder soll der Klick in einem anderen Fenster durchgeführt werden?

Grüße,
Yogu


Overspeed - Mi 09.03.11 22:46

user profile iconYogu hat folgendes geschrieben Zum zitierten Posting springen:
Hallo und :welcome:, user profile iconOverspeed!

Was soll denn genau passieren, wenn der Benutzer F9 drückt bzw. was passiert bei einem Linksklick? Ein Klick auf ein leeres Fenster bewirkt an sich ja nichts, also wirst du das wohl auch nicht wollen. Möchtest du, dass ein Button angeklickt wird? Oder soll der Klick in einem anderen Fenster durchgeführt werden?

Grüße,
Yogu


Ja also es soll ein Links Klick in einem anderen Fenster ausgeführt werden,

die Form dient nur zur Ausgabe sozusagen.

Danke für die Willkommensgrüße :=)


Yogu - Do 10.03.11 00:19

Gehört das Fenster, auf das geklickt werden soll, zu deiner Anwendung oder zu einer anderen? Wenn letzteres der Fall ist, woher weißt du, wo genau hingeklickt werden soll? Stehen die relativen Koordinaten, also der Abstand vom Rand des Fensters zum Klickpunkt, als fixe Zahlen fest? Oder soll auf eine spezielle Schaltfläche geklickt werden? Dann schau dir mal das Programm WinSpy [http://www.catch22.net/software/winspy] an. Wenn du dort auf More klickst, kannst du dich durch Doppelklicks durch die Hierarchie der Steuerelemente durcharbeiten. Kommst du so bis zur Schaltfläche, kann sie auf diese Weise auch mit C# ausfindig gemacht werden.

Es ist nicht ganz einfach, aber meistens doch machbar. Allerdings gibt es viele verschiedene Möglichkeiten - deshalb stelle ich so viele Fragen. ;)


Overspeed - Do 10.03.11 00:39

user profile iconYogu hat folgendes geschrieben Zum zitierten Posting springen:
Gehört das Fenster, auf das geklickt werden soll, zu deiner Anwendung oder zu einer anderen? Wenn letzteres der Fall ist, woher weißt du, wo genau hingeklickt werden soll? Stehen die relativen Koordinaten, also der Abstand vom Rand des Fensters zum Klickpunkt, als fixe Zahlen fest? Oder soll auf eine spezielle Schaltfläche geklickt werden? Dann schau dir mal das Programm WinSpy [http://www.catch22.net/software/winspy] an. Wenn du dort auf More klickst, kannst du dich durch Doppelklicks durch die Hierarchie der Steuerelemente durcharbeiten. Kommst du so bis zur Schaltfläche, kann sie auf diese Weise auch mit C# ausfindig gemacht werden.

Es ist nicht ganz einfach, aber meistens doch machbar. Allerdings gibt es viele verschiedene Möglichkeiten - deshalb stelle ich so viele Fragen. ;)


Das Fenster gehört zu einer anderen Anwendung und ist 1024x786.

Von der Sache her ist es egal wo er klickt er soll ganz einfach klicken den

Cursor bewege ich manuell in das Fenster.


Overspeed - Do 10.03.11 18:27

Simulieren von Mauseingaben

Die beste Möglichkeit, Mauseingaben zu simulieren, ist ein Aufruf der OnEreignisname-Methode, die das gewünschte Mausereignis auslöst. Diese Möglichkeit besteht normalerweise nur bei benutzerdefinierten Steuerelementen und Formularen, da die Methoden, die Ereignisse auslösen, geschützt sind und außerhalb des Steuerelements oder Formulars nicht aufgerufen werden können. Die folgenden Schritte veranschaulichen beispielsweise, wie das Klicken mit der rechten Maustaste in Code simuliert wird.
So klicken Sie programmgesteuert mit der rechten Maustaste

1. Erstellen Sie ein MouseEventArgs, dessen Button-Eigenschaft auf den MouseButtons.Right-Wert festgelegt ist.

2. Rufen Sie die OnMouseClick-Methode mit diesem MouseEventArgs als Argument auf.

Weitere Informationen zu benutzerdefinierten Steuerelementen finden Sie unter Entwickeln von Windows Forms-Steuerelementen zur Entwurfszeit.

Mauseingaben können auch auf andere Weise simuliert werden. Beispielsweise können Sie programmgesteuert eine Steuerelementeigenschaft festlegen, die einen Zustand darstellt, der normalerweise per Mauseingabe festgelegt wird (z. B. die Checked-Eigenschaft des CheckBox-Steuerelements). Sie können aber auch direkt den Delegaten aufrufen, der mit dem Ereignis verknüpft ist, das Sie simulieren möchten.

Quelle: http://msdn.microsoft.com/de-de/library/ms171548%28v=VS.90%29.aspx
-----------------------------------------------------------------------------------------------------------------

Das sollte es eigentlich sein nur steige ich da nicht durch><


Th69 - Do 10.03.11 18:35

Hallo overspeed,

der von dir zitierte Text gilt nur für Ereignisse innerhalb der eigenen Anwendung.

Zuersteinmal mußt du uns sagen, um was für ein externes Programm es sich handelt. Bei Spielen, welche auf DirectX basieren, kann man nicht direkt die Mauseingaben simulieren, da diese direkt mit der Hardware (bzw. dem Treiber) kommunizieren (DirectInput).

Nur bei einem normalen Windows-Programm kannst du mittels der WinAPI-Funktionen SendMessage bzw. PostMessage Botschaften (z.B. Maus oder Tastaturereignisse) verschicken.

Aber ehrlich gesprochen: für einen Programmieranfänger ist das viel zu hoch. Außerdem ist dieses direkt mit C# (bzw. dem .NET-Framework) nicht machbar, sondern du müßtest auf P/Invoke zurückgreifen.

Solange dir diese Begriffe nichts sagen, dann nimm lieber ersteinmal Abstand davon und suche dir ein einfacheres Projekt zum Programmieren aus (was auch wirklich nur mit C# bzw. den .NET-Methoden umsetzbar ist).


Yogu - Do 10.03.11 18:48

Schau dir mal folgenden Code an:


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
 // Die absoluten Bildschirmkoordinaten des Mauszeigers ermitteln
Point mousePosition = Control.MousePosition;

// Das Steuerelement, das sich unter der Maus befindet, ermitteln
IntPtr handle = WinAPI.WindowFromPoint(mousePosition);

// Die absoluten Bildschirmkoordinaten des Steuerelements ermitteln
WinAPI.RECT rect;
WinAPI.GetWindowRect(handle, out rect);

// Die Koordinaten des Mauszeigers relativ zum Steuerelement berechnen
short relativeX = (short)(mousePosition.X - rect.Left);
short relativeY = (short)(mousePosition.Y - rect.Top);

// Aus diesen Koordinaten wird der sogenannte "lParam"-Parameter der Windows Message berechnet
// Dabei beschreibt die x-Koordinate die niederwertigen 16 Bit, die y-Koordinate die höherwertitgen 16 Bit.
IntPtr lParam = (IntPtr)((relativeX & 0xFFFF) | ((relativeY & 0xFFFF) << 16));

// Einen Mausklick durch Drücken und Loslassen simulieren
WinAPI.SendMessage(handle, WinAPI.WM_LBUTTONDOWN, IntPtr.Zero, lParam);
WinAPI.SendMessage(handle, WinAPI.WM_LBUTTONUP, IntPtr.Zero, lParam);

Ich hoffe, die Kommentare helfen dir, den Quelltext zu verstehen. Sonst frag einfach nochmal nach. Es ist vielleicht auch ganz gut, wenn du testweise Teile, wie z.B. lParam weglässt (und durch 0) ersetzt). Ich kann nicht garantieren, dass der Klick in jedem Fall ankommt, da verschiedene Programme unterschiedlich Mausereignisse abfangen.

Für die Zugriffe auf die WinAPI benötigst du noch folgende Klasse. Einfach eine neue Klasse hinzufügen und diesen Code dort einbauen:


C#-Quelltext
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:
internal static class WinAPI {
    /// <summary>
    /// Sucht das Fenster, das sich unter den angegebenen Koordinatne befindet
    /// </summary>
    /// <param name="point">Die absoluten Bildschirmkoordinaten</param>
    /// <returns>Das Fenster-Handle oder <c>0</c>, falls kein Fenster gefunden wurde</returns>
    [System.Runtime.InteropServices.DllImport("user32")]
    public static extern IntPtr WindowFromPoint(Point point); 

    /// <summary>
    /// Sendet eine Windows Message an ein Fenster
    /// </summary>
    /// <param name="handle">Das Handle des Fensters, das die Windowsa Message empfangen soll</param>
    /// <param name="message">Der Code der zu sendenden Windows Message</param>
    /// <param name="wParam">Der linke Parameter</param>
    /// <param name="lParam">Der rechte Parameter</param>
    [System.Runtime.InteropServices.DllImport("user32")]
    public static extern IntPtr SendMessage(IntPtr handle, uint message, IntPtr wParam, IntPtr lParam);
    
    /// <summary>
    /// Ermittelt die absoluten Bildschirmkoordinaten des Rechtecks, das das Steurelement umfasst
    /// </summary>
    /// <param name="handle">Das Handle des Fensters</param>
    /// <param name="rect">Eine Referenz auf ein WinAPI.RECT, in das die Koordinaten gespeichert werden sollen</param>
    [System.Runtime.InteropServices.DllImport("user32")]
    [return: System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.Bool)]
    public static extern void GetWindowRect(IntPtr handle, out RECT rect);

    /// <summary>
    /// Der Code der Windows Message, die gesendet wird, wenn die linke Maustaste gedrückt wird
    /// </summary>
    public const uint WM_LBUTTONDOWN = 0x0201;

    /// <summary>
    /// Der Code der Windows Message, die gesendet wird, wenn die linke Maustaste losgelassen wird
    /// </summary>
    public const uint WM_LBUTTONUP = 0x0202;

    [System.Runtime.InteropServices.StructLayout(System.Runtime.InteropServices.LayoutKind.Sequential)]
    public struct RECT {
      public int Left;        // x position of upper-left corner
      public int Top;         // y position of upper-left corner
      public int Right;       // x position of lower-right corner
      public int Bottom;      // y position of lower-right corner
    }
}


user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
Nur bei einem normalen Windows-Programm kannst du mittels der WinAPI-Funktionen SendMessage bzw. PostMessage Botschaften (z.B. Maus oder Tastaturereignisse) verschicken.

Das sollte für die meisten Programme außer Spielen gelten. Wie gesagt, mit einigen Einschränkungen.

user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
Aber ehrlich gesprochen: für einen Programmieranfänger ist das viel zu hoch.

Manchmal kommt man eben nicht darum herum. Und wozu gibt es Foren? ;)

user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
Außerdem ist dieses direkt mit C# (bzw. dem .NET-Framework) nicht machbar, sondern du müßtest auf P/Invoke zurückgreifen.

Stimmt nicht, das ist problemlos machbar. Allerdings natürlich nur unter Verwendung von Windows-eigenen Bibliotheken, wie z.B. die user32. Die Plattformunabhängigkeit ist dadurch nicht mehr gegeben.

Edit: Quelltext geändert


Th69 - Do 10.03.11 18:58

Hallo Yogu,

genau deine Lösung habe ich ja gemeint. Und das Einbinden mittels [DllImport] nennt man eben P/Invoke: Platform Invoke Tutorial [http://msdn.microsoft.com/en-us/library/aa288468%28v=vs.71%29.aspx] :D

Trotzdem wird Overspeed diesen Code nicht verstehen ;-)


Yogu - Do 10.03.11 19:02

user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
genau deine Lösung habe ich ja gemeint. Und das Einbinden mittels [DllImport] nennt man eben P/Invoke: Platform Invoke Tutorial [http://msdn.microsoft.com/en-us/library/aa288468%28v=vs.71%29.aspx] :D

Sorry, den Begriff kannte ich noch nicht.


Th69 - Do 10.03.11 19:10

Hi Yogu,

woher hast du denn sonst den Code wenn nicht von http://pinvoke.net ? :lol:


Yogu - Do 10.03.11 19:37

user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
woher hast du denn sonst den Code wenn nicht von http://pinvoke.net ? :lol:

Ganz nette Quelle, ich hab auch noch ein paar Fehler damit beheben können. Ich hab mich bei der MSDN bedient.


Overspeed - Do 10.03.11 20:40

Es handelt sich um ein Spiel das soweit ich weiß mit JavaScript programmiert wurde.

Die Linksklick Funktion soll es mir erleichtern nicht ständig klicken zu müssen....

Dank dir für deine Hilfe Yogu nur weiß ich nicht wo ich dieses code-fragment einfügen soll...

Ich vermisse auch wo steh das wenn die Taste F9 (Beispiel) gedrückt wurde das Linksklicken der Maus anktiviert wird....

Vielleicht doch bissle viel für den Anfang aber so nach den Motto:"Geht nicht, gibts nicht"^^


Yogu - Fr 11.03.11 01:04

user profile iconOverspeed hat folgendes geschrieben Zum zitierten Posting springen:
Es handelt sich um ein Spiel das soweit ich weiß mit JavaScript programmiert wurde.

Es läuft also im Browser? Dann gibt es viel bessere Methoden, sich einzumischen. Stichwort: Suche bei Google USERSCRIPTS

user profile iconOverspeed hat folgendes geschrieben Zum zitierten Posting springen:
Dank dir für deine Hilfe Yogu nur weiß ich nicht wo ich dieses code-fragment einfügen soll...

Ich vermisse auch wo steh das wenn die Taste F9 (Beispiel) gedrückt wurde das Linksklicken der Maus anktiviert wird....

Vielleicht doch bissle viel für den Anfang aber so nach den Motto:"Geht nicht, gibts nicht"^^

Ja, du solltest dich erst einmal in C# einarbeiten. Ich würde dir dafür das Galileo Openbook Visual C# 2010 [http://openbook.galileocomputing.de/visual_csharp_2010] empfehlen.

Wenn das Programm im Hintergrund läuft und das Spiel stattdessen aktiviert ist, wird es nochmal schwieriger.


Overspeed - Fr 11.03.11 04:23

<.< ich komme nur mit guten Nachrichten oder?^^

Das Spiel wird aus einem Webbrowser gestartet wobei das Spiel auf dem PC liegt

der Anbieter hat den Rest was so dazu gehört auf seinen Servern auf welches dann

der Webstarter zugreift.

Also solches Programm wie ich bauen möchte gibt es aber die Leute die sowas gebaut haben oder

die Knowlegde haben halten sich bedeckt..

Das Programm welches ich bauen möchte nennen wir es mal "Linksklicker-Programm"

soll im hintergrund laufen, wobei die form also exe. ruhig als symbol minimiert laufen kann.


jaenicke - Fr 11.03.11 06:43

Ich frage mich allerdings, ob das Programm mit den Regeln des Anbieters konform ist...

Denn wenn nicht, ist deine Frage nicht mit den Forenregeln konform...


Overspeed - Fr 11.03.11 13:34

na das ist ja quatsch was hat das forum mit dem spielanbieter zutun?


jaenicke - Fr 11.03.11 14:26

Scherzprogramme, Hacks, Bots und andere den Nutzungsbedingungen eines Anbieters entgegenlaufenden Programme werden hier natürlich nicht unterstützt, siehe Forenregeln.

*nach Moderatoren für ein offizielles Statement Ausschau hält* :mrgreen:


Overspeed - Fr 11.03.11 14:28

user profile iconYogu hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconOverspeed hat folgendes geschrieben Zum zitierten Posting springen:
Es handelt sich um ein Spiel das soweit ich weiß mit JavaScript programmiert wurde.

Es läuft also im Browser? Dann gibt es viel bessere Methoden, sich einzumischen. Stichwort: Suche bei Google USERSCRIPTS

user profile iconOverspeed hat folgendes geschrieben Zum zitierten Posting springen:
Dank dir für deine Hilfe Yogu nur weiß ich nicht wo ich dieses code-fragment einfügen soll...

Ich vermisse auch wo steh das wenn die Taste F9 (Beispiel) gedrückt wurde das Linksklicken der Maus anktiviert wird....

Vielleicht doch bissle viel für den Anfang aber so nach den Motto:"Geht nicht, gibts nicht"^^

Ja, du solltest dich erst einmal in C# einarbeiten. Ich würde dir dafür das Galileo Openbook Visual C# 2010 [http://openbook.galileocomputing.de/visual_csharp_2010] empfehlen.

Wenn das Programm im Hintergrund läuft und das Spiel stattdessen aktiviert ist, wird es nochmal schwieriger.


Das Spiel läuft als normales Programm also auf einer Windows Plattform gestartet wird es aber via Browser.

Dank dir für den Link :p die Quelle kannte ich schon.

Ich mach das programmieren erst seit eine Weile und hab bestimmt schon alles durchgelesen,

ich schätz mal es ist einfach zuviel und ich brauch Zeit um das mal sacken zulassen damit

man dann sinn und zweck versteht :P


Overspeed - Fr 11.03.11 14:30

user profile iconYogu hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconOverspeed hat folgendes geschrieben Zum zitierten Posting springen:
Es handelt sich um ein Spiel das soweit ich weiß mit JavaScript programmiert wurde.

Es läuft also im Browser? Dann gibt es viel bessere Methoden, sich einzumischen. Stichwort: Suche bei Google USERSCRIPTS

user profile iconOverspeed hat folgendes geschrieben Zum zitierten Posting springen:
Dank dir für deine Hilfe Yogu nur weiß ich nicht wo ich dieses code-fragment einfügen soll...

Ich vermisse auch wo steh das wenn die Taste F9 (Beispiel) gedrückt wurde das Linksklicken der Maus anktiviert wird....

Vielleicht doch bissle viel für den Anfang aber so nach den Motto:"Geht nicht, gibts nicht"^^

Ja, du solltest dich erst einmal in C# einarbeiten. Ich würde dir dafür das Galileo Openbook Visual C# 2010 [http://openbook.galileocomputing.de/visual_csharp_2010] empfehlen.

Wenn das Programm im Hintergrund läuft und das Spiel stattdessen aktiviert ist, wird es nochmal schwieriger.



user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Scherzprogramme, Hacks, Bots und andere den Nutzungsbedingungen eines Anbieters entgegenlaufenden Programme werden hier natürlich nicht unterstützt, siehe Forenregeln.

*nach Moderatoren für ein offizielles Statement Ausschau hält* :mrgreen:


Na das ist mir Klar ich will ja hier kein Hack oder desweiteren bauen.

Es soll als Hilfe gedacht sein...

Hast mich bestimmt falsch verstanden.


Kha - Fr 11.03.11 17:07

Nein, wir haben durchaus verstanden, dass du ein Hilfsprogramm für ein Browserspiel schreiben willst. Zeige uns also bitte die AGB, die ein solches nicht verbieten.


Overspeed - Fr 11.03.11 19:01

user profile iconKha hat folgendes geschrieben Zum zitierten Posting springen:
Nein, wir haben durchaus verstanden, dass du ein Hilfsprogramm für ein Browserspiel schreiben willst. Zeige uns also bitte die AGB, die ein solches nicht verbieten.


Ja, "ihr" habt bzw. du hast es falsch verstanden.

Es ist kein Browserspiel wird nur durch einen Webstarter gestartet...

Die Plattform ist also Windows-Konform und nicht Browser-Konform.


Kha - Fr 11.03.11 19:14

Dann ersetzte meinetwegen "Hilfsprogramm für ein Browserspiel" durch "Hilfsprogramm für ein Onlinespiel", ändert das etwas :nixweiss: ?


Overspeed - Fr 11.03.11 21:11

user profile iconKha hat folgendes geschrieben Zum zitierten Posting springen:
Dann ersetzte meinetwegen "Hilfsprogramm für ein Browserspiel" durch "Hilfsprogramm für ein Onlinespiel", ändert das etwas :nixweiss: ?


Ein Unterschied ist also da :P

Also im ernst mir liegt fern da irgendwelche hacks oder so zubauen.

Hilfsprogramm für Onlinespiel wäre dann der Ausdruck ja.