![]() |
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? |
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); |
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. |
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:
Getestet mit Visual C++ 6.0 Autorenversion.
#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)); } 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 |
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... |
Re: Mausklick global simulieren
du brauchst dazu keinen hook!!!
Delphi-Quellcode:
funktioniert ohne
mouse_event(MOUSEEVENTF_LEFTDOWN, x, y, 0, 0);
mouse_event(MOUSEEVENTF_LEFTUP, x, y, 0, 0); |
Re: Mausklick global simulieren
Zitat:
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... |
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
|
Re: Mausklick global simulieren
Zitat:
|
Re: Mausklick global simulieren
Zitat:
|
Re: Mausklick global simulieren
Ich habe auch mal eine Tray-Applikation geschrieben die mit keybd_event und mouse_event Tasten generiert.
Funktioniert prima. ![]() |
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:
Delphi-Quellcode:
Gruß, teebee
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; |
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... ?? |
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. |
Re: Mausklick global simulieren
Zitat:
Zitat:
Gruß, teebee |
Re: Mausklick global simulieren
Zitat:
Setze mit SetCursorPos die Position des Cursors und generiere mit mouse_event-Aufrufen einen Klick. |
Re: Mausklick global simulieren
Zitat:
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