Laden...

Mausklick im fremden Fenster simulieren

Erstellt von Barbara vor 15 Jahren Letzter Beitrag vor 15 Jahren 6.090 Views
B
Barbara Themenstarter:in
116 Beiträge seit 2006
vor 15 Jahren
Mausklick im fremden Fenster simulieren

Hallo Zusammen,

und zwar komm ich einfach bei folgendem Beispiel nicht weiter:

Ich in einem fremden Fenster eine Mausbewegung und einen Mausklick simulieren.

Folgendes: Das ganze muss in einem Fenster, dass im Hintergrund ist, lauffähig sein und soll die eigene Maus nicht bewegen sondern das ganze nur simulieren.

Die Mausbewegung Simulation funktioniert auch soweit, nur kommt der Klick nicht an der richtigen Stelle an 🙁

Ich sehe, dass Bewegung simuliert wurde, da mein Fremdprogramm die Farbe bei einem mousemove wechselt. Aber es zeigt keinen klick an.

Wenn ich nun meinen "richtigen" desktop mauszeiger über das programm fenster bewege (auch wenn es dabei im hintergrund ist) und ein MausKlick simuliert wird, zeigt mein fremdprogramm das an.

Ich hoffe man kann verstehen was ich meine...
Anbei der Beispiel code


             [DllImport("user32.dll", CharSet = CharSet.Auto)]
        public static extern int SendMessage(IntPtr hwnd, uint wMsg,
            IntPtr wParam,
            IntPtr lParam);  

           private const uint WM_RBUTTONDOWN   = 0x0204;
            private const uint WM_RBUTTONUP     = 0x0205;
            private const uint WM_MOUSEMOVE     = 0x0200;


  void Simulate()
{


 SendMessage(handle, WM_MOUSEMOVE, (IntPtr)0, MakeLParam(x,y));
                  Thread.Sleep(10);
      SendMessage(wowhandle, WM_LBUTTONDOWN, 0, 0);
                  SendMessage(wowhandle, WM_LBUTTONUP, 0, 0);

}

    IntPtr MakeLParam(int LoWord, int HiWord)
             {
                   return (IntPtr) ((HiWord << 16) | (LoWord & 0xffff));
             }

Danke euch <3 😉

2.921 Beiträge seit 2005
vor 15 Jahren

Vielleicht reicht das schon als Antwort:

Mauszeiger kontrollieren (Move, Click)

Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.

B
Barbara Themenstarter:in
116 Beiträge seit 2006
vor 15 Jahren

Danke für die Antwort, aber leider hilft mir das nicht weiter.

Die Funktion aus dem oben genannte Thread bewegt meinen eigentlichen Desktop Mauszeiger.

Ich möchte jedoch nur einen Click an einer anderen Stelle simulieren ohne den Zeiger zu bewegen.

Ich kenn auch ein Programm, dass eben solche Click simulieren kann und in C# net 2.0 geschrieben ist.
Nur leider habe ich zum dem Programm keinen Sourcecode.

2.921 Beiträge seit 2005
vor 15 Jahren

Dann hast du mind. 2 Möglichkeiten:

  1. Merke Dir die Position des Mauszeigers.
  2. Beweg den Mauszeiger an die Stelle des Klicks.
  3. Führe den Klick aus.
  4. Beweg den Mauszeiger zurück.

oder nimm folgenden Pseudo-Code.


invoke SetCursorPos,x,y
invoke WindowFromPoint,x,y; // point= x,y koordinaten
mov hWnd,eax
invoke SendMessage, hWnd,WM_LBUTTONDOWN,0,0
invoke SendMessage, hWnd,WM_LBUTTONUP,0,0

Die Signaturen kannst Du aus Pinvoke.net entnehmen.

Ich hoffe das hilft, wenn nicht, kann ich dir auch gerne ein Beispiel schicken.

Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.

309 Beiträge seit 2007
vor 15 Jahren

Die Signaturen kannst Du aus Pinvoke.net entnehmen.

Ich hoffe das hilft, wenn nicht, kann ich dir auch gerne ein Beispiel schicken.

Schickst du es mir liebguck

Mfg Hajoseb

**"Zufall ist das Pseudonym Gottes, wenn er nicht selbst unterschreiben will.” **
Anatole France

B
Barbara Themenstarter:in
116 Beiträge seit 2006
vor 15 Jahren

Nun das Problem ist wie gesagt, dass der Click auch im Hintergrund ausführbar sein sollte.

Bedeutet ich bin grade im Internet am surfen und möchte in ein Fenster klicken, dass sich hinter meinem Browserfenster befindet.

Ich weis, dass es möglich ist, da ich bereits ein Programm mit dieses Fähigkeit gesehen habe.

Mit der Methode die du mir vorgeschlagen hast, geht der Klick aber ins Browserfenster 🙁

2.921 Beiträge seit 2005
vor 15 Jahren

Ja WindowFromPoint ermittelt das Fenster an der aktuellen Mausposition.
Dann müsstest Du also nur die entsprechende SendMessage an das richtige Fenster senden.

EDIT: Beschreib doch noch mal genauer was der Zweck des Programms ist. Warum du das genau so haben willst, ich glaube ich sehe in diesem Fall sonst die Gefahr, dass noch mehr Vorschläge geschickt wedern, die einfach nicht das machen was du gerne erreichen möchtest.

Nach dem nochmaligen Durchlesen verstehe ich es so:

Der Benutzer (oder die Simulation?! was denn nun) klickt ein Fenster an. Das aber eigentlich im Vordergrund liegt. Jetzt wird der Klick abgefangen und geht NICHT(!) (oder zusätzlich?!)i ns eigentlich geklickte Fenster sondern in das (oder mehrere Fenster?!) direkt dahinter, die sich überlagern?!

Wie meinst Du das jetzt genau?

Wenn das geklärt ist, können wir Dir sicher helfen, deine Funktion so hinzubekommen, wie Du sie gerne haben möchtest.

Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.