Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Mausklick global simulieren (https://www.delphipraxis.net/27656-mausklick-global-simulieren.html)

the_seed 13. Aug 2004 16:06


Mausklick global simulieren
 
hi, habe noch nicht sehr viele themen darüber gefunden?
wie kann ich einen mausklick simulieren (->global) ?
muss ich da ein mousehook inst. oder gibts da noch andre wege?

SirThornberry 13. Aug 2004 16:21

Re: Mausklick global simulieren
 
geht ganz einfach mit
Delphi-Quellcode:
  mouse_event(MOUSEEVENTF_LEFTDOWN, x, y, 0, 0);
  mouse_event(MOUSEEVENTF_LEFTUP, x, y, 0, 0);

Robert Marquardt 13. Aug 2004 16:31

Re: Mausklick global simulieren
 
Das macht aber nur Sinn wenn das Programm nicht selbst im Vordergrund ist, da es sonst den Mausklick selber bekommt.
Entsprechend gibt es noch keybd_event bzw die neuere Funktion SendInput.

Tubos 13. Aug 2004 18:19

Re: Mausklick global simulieren
 
Ich habe mal einen C++-Code geschrieben, wo ich SendInput verwende (rauf und runter von linker und rechter maustaste).
Es ist nicht besonders einfach weil man ein kompliziertes Array füllen muss.
Hier der original-Code mit globalen Arrays zur Performancesteigerung:
Code:
#include <windows.h>
#include <winable.h> // bin mir nicht sicher ob man winable wirklich braucht oder ob das für etwas anderes war...ausprobieren...
INPUT runter,rauf, rechtsrunter, rechtsrauf; // mit runter und rauf ist die linke maustaste gemeint

void ldown(void); // linke maustaste runter
void lup(void); // linke maustaste rauf
void rdown(void); // rechte maustaste runter
void rup(void); // rechte maustaste rauf

...
...
...

// Beim Programmstart die Arrays mit Werten füllen:
   runter.mi.dx=0;
   runter.mi.dy=0;
   runter.mi.mouseData=0;
   runter.mi.dwFlags=MOUSEEVENTF_LEFTDOWN;
   runter.mi.dwExtraInfo=0;
   runter.mi.time=0;
   rauf.mi.dx=0;
   rauf.mi.dy=0;
   rauf.mi.mouseData=0;
   rauf.mi.dwFlags=MOUSEEVENTF_LEFTUP;
   rauf.mi.dwExtraInfo=0;
   rauf.mi.time=0;
   rechtsrunter.mi.dx=0;
   rechtsrunter.mi.dy=0;
   rechtsrunter.mi.mouseData=0;
   rechtsrunter.mi.dwFlags=MOUSEEVENTF_RIGHTDOWN;
   rechtsrunter.mi.dwExtraInfo=0;
   rechtsrunter.mi.time=0;
   rechtsrauf.mi.dx=0;
   rechtsrauf.mi.dy=0;
   rechtsrauf.mi.mouseData=0;
   rechtsrauf.mi.dwFlags=MOUSEEVENTF_RIGHTUP;
   rechtsrauf.mi.dwExtraInfo=0;
   rechtsrauf.mi.time=0;

...
...
...


// Da die Arrays bereits gefüllt sind, brauchen wir nur noch funktionen die SendInput aufrufen:

void ldown(void) // maustaste runter
{
   SendInput(1,&runter,sizeof(runter));
}

void lup(void) // maustaste rauf
{
   SendInput(1,&rauf,sizeof(rauf));
}

void rdown(void) // rechte maustaste runter
{
   SendInput(1,&rechtsrauf,sizeof(rechtsrauf));
}

void rup(void) // rechte maustaste rauf
{
   SendInput(1,&rechtsrunter,sizeof(rechtsrunter));
}
Getestet mit Visual C++ 6.0 Autorenversion.

Habe leider keine Zeit, den Code in Delphi zu übersetzen.
Dürfte nicht besonders schwer sein, vielleicht kann das ja ein anderer machen...oder ich ein wenig später...

Wenn du z.B. einen linken Mausklick simulieren willst, musst du nacheinander ldown und lup aufrufen.

Tubos

the_seed 13. Aug 2004 18:34

Re: Mausklick global simulieren
 
ich will ein programm schreiben dass im hintergrund läuft und in regelmässigne zeitabständen einen mausklick simuliert bei bestimmten koordinaten durchführt fenster nicht bestimmt.
braucge ich dazu nen hook oder ist das ohne möglich... der og. befehl funktioniert nicht bzw nur im eigenen fenster...

SirThornberry 13. Aug 2004 18:41

Re: Mausklick global simulieren
 
du brauchst dazu keinen hook!!!
Delphi-Quellcode:
mouse_event(MOUSEEVENTF_LEFTDOWN, x, y, 0, 0);
mouse_event(MOUSEEVENTF_LEFTUP, x, y, 0, 0);
funktioniert ohne

the_seed 13. Aug 2004 18:49

Re: Mausklick global simulieren
 
Zitat:

Zitat von SirThornberry
du brauchst dazu keinen hook!!!

das wollte ich ja wissen !!!
nur funktioniert die methode nicht wenn ich zb. nen mausklick simulieren will
x=52 y=726 koordinbaten des startbuttons bei ner auflösung von 1024x768 (bei mir)
tut sich gar nix...

SirThornberry 13. Aug 2004 18:53

Re: Mausklick global simulieren
 
führst du die Methode in einem OnClick von einem Button aus? Dann gehts nicht weil das mit den KlickMessages des Buttons vermicht wird. In meinem Trojaner den ich mal geschrieben hab funktioniert die Variante wunderbar

the_seed 13. Aug 2004 19:11

Re: Mausklick global simulieren
 
Zitat:

Zitat von SirThornberry
führst du die Methode in einem OnClick von einem Button aus? Dann gehts nicht weil das mit den KlickMessages des Buttons vermicht wird. In meinem Trojaner den ich mal geschrieben hab funktioniert die Variante wunderbar

nee hab nen timer benutzt... geht trotzdem nicht !

Robert Marquardt 13. Aug 2004 19:26

Re: Mausklick global simulieren
 
Zitat:

Zitat von SirThornberry
In meinem Trojaner den ich mal geschrieben hab funktioniert die Variante wunderbar

Erschiessen den Kerl! ;-)

Robert Marquardt 13. Aug 2004 19:29

Re: Mausklick global simulieren
 
Ich habe auch mal eine Tray-Applikation geschrieben die mit keybd_event und mouse_event Tasten generiert.
Funktioniert prima. http://www.claw.com.au zeigt das Geraet dazu (damit klar ist das das kein Trojaner war) ;-)

teebee 13. Aug 2004 20:12

Re: Mausklick global simulieren
 
Das Problem ist, dass die Funktion keine normalen Bildschirmkoordinaten erwartet, sondern den Bildschirm in x- und y-Richtung in 65535 Einheiten unterteilt:
Zitat:

Zitat von MSDN
If MOUSEEVENTF_ABSOLUTE value is specified, dx and dy contain normalized absolute coordinates between 0 and 65,535. The event procedure maps these coordinates onto the display surface. Coordinate (0,0) maps onto the upper-left corner of the display surface, (65535,65535) maps onto the lower-right corner.

Folgendes funktioniert:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
 Timer1.Enabled := True;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
Var x, y: Integer;
begin
 Timer1.Enabled := False;
 // gewünschte Position in Bildschirmkoordinaten
 x := 50;
 y := 760;
 // noch umrechnen
 x := 65535 Div Screen.Width*x;
 y := 65535 Div Screen.Height*y;
 // Maus bewegen und klicken, nur klicken geht nicht...
 mouse_event(MOUSEEVENTF_MOVE Or MOUSEEVENTF_LEFTDOWN Or MOUSEEVENTF_ABSOLUTE,x,y,0,0);
 mouse_event(MOUSEEVENTF_MOVE Or MOUSEEVENTF_LEFTUP Or MOUSEEVENTF_ABSOLUTE,x,y,0,0);
end;
Gruß, teebee

nailor 13. Aug 2004 20:15

Re: Mausklick global simulieren
 
nee, ich hab auch schon damit gearbeitet und kann mich an sowas nicht erinnern. was absolute hieß, war auch absolut!

edit: scheinst recht zu haben. aber irgendwie kann ich mich an was anderes erinnern... ??

Robert Marquardt 14. Aug 2004 06:33

Re: Mausklick global simulieren
 
Vom absolute Modus sollte man die Finger lassen. Windows mag solche Geraete nicht sonderlich.
Dein Fehler ist mit der Funktion auch die Position des Cursors setzen zu wollen.
Dafuer ist die Win32-Funktion SetCursorPos weit besser geeignet.

Es ist ein haeufiger Fehler Maus und Cursor gleichzusetzen. Die Maus ist ein Eingabegeraet waehrend
der Cursor ein Konstrukt des Betriebssystems ist. Die Daten der Maus dienen zur Steuerung des Cursors.
mouse_event ist das API-Aequivalent einer Maus. Die Cursorposition aber ist fuer die Maus irrelevant.

teebee 14. Aug 2004 11:31

Re: Mausklick global simulieren
 
Zitat:

Zitat von Robert Marquardt
Vom absolute Modus sollte man die Finger lassen. Windows mag solche Geraete nicht sonderlich.

Und wieso? Mein Beispiel funktioniert doch... Lässt man das Flag weg, wird doch die zum letzten Klick relative Position gewählt.
Zitat:

Zitat von Robert Marquardt
Dein Fehler ist mit der Funktion auch die Position des Cursors setzen zu wollen.
...
Die Cursorposition aber ist fuer die Maus irrelevant.

Anscheinend ja doch nicht..? Wenn ich nur das Klicken simulieren will, ohne zu bewegen, geht das Startmenü jedenfalls nicht auf. Wie ginge es denn, ohne die Position zu verändern?

Gruß, teebee

Robert Marquardt 14. Aug 2004 18:02

Re: Mausklick global simulieren
 
Zitat:

Zitat von teebee
Anscheinend ja doch nicht..? Wenn ich nur das Klicken simulieren will, ohne zu bewegen, geht das Startmenü jedenfalls nicht auf. Wie ginge es denn, ohne die Position zu verändern?
Gruß, teebee

Ich habe nicht gesagt das du die Position des Cursors nicht setzen sollst, sondern das du es nicht ueber die Maus machen sollst. Maus und Cursor sind nicht das selbe. Windows hat den einen oder anderen Fehler wenn es absolute Mauseingaben verarbeitet, besonders wenn auch relative Mauseingaben vorhanden sind.

Setze mit SetCursorPos die Position des Cursors und generiere mit mouse_event-Aufrufen einen Klick.

teebee 14. Aug 2004 18:50

Re: Mausklick global simulieren
 
Zitat:

Zitat von Robert Marquardt
Setze mit SetCursorPos die Position des Cursors und generiere mit mouse_event-Aufrufen einen Klick.

Is recht. Geht eh einfacher :wink:
Gruß, teebee


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:58 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz