![]() |
Emulierter Mausklick bugt
Hey,
Ich versuche einen Mausklick zu emulieren, dafür gibts ja Mouse_Events. Die funktionieren auch Prima in einer einzelnen Anwendung (meine Testanwendung um sie zu testen), die sonst nix tut. Dazu lasse ich mir n Screenshot generieren, in ein Image laden, und wenn ich nu iwo aufs Image klicke, springt der Mauszeiger auch dorthin und klickt. Das habe ich dann auch in ein weiteres Programm eingebaut, einen Remote Desktop Viewer. Dort tut sich allerdings leider nix. Wenn ich das Springen und Klicken des Mauszeigers steppe (F7) funktioniert es. Aber sobald ich es normal durchlaufen lasse tut sich nix. Nur wenn ich das Programm auf dem zu betrachtenden PC als Admin starte funktioniert es ganz normal.
Delphi-Quellcode:
und SetCursorPos(x,y); mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0); mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
Delphi-Quellcode:
habe ich bisher dafür probiert. Auch ProcessMessage für 20-500ms zwischen SetCursorPos und den Mouse_events haben nicht geholfen.
Inp.Itype := INPUT_MOUSE;
Inp.mi.dwFlags := MOUSEEVENTF_LEFTDOWN or MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_MOVE; Inp.mi.dx := round(xPos * (65535 / Screen.Width)); Inp.mi.dy := round(yPos * (65535 / Screen.Height)); Inp.mi.time := 0; Inp.mi.dwExtraInfo := 0; SendInput(1, Inp, SizeOf(Inp)); Inp.Itype := INPUT_MOUSE; Inp.mi.dwFlags := MOUSEEVENTF_LEFTUP or MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_MOVE; Inp.mi.dx := round(xPos * (65535 / Screen.Width)); Inp.mi.dy := round(yPos * (65535 / Screen.Height)); Inp.mi.time := 0; Inp.mi.dwExtraInfo := 0; SendInput(1, Inp, SizeOf(Inp)); Vielleicht kann mir ja jemand helfen oder hat eine andere Alternative die ich dafür benutzen kann. Ich benutze D7 / Win7. Auf Vista gibs jedoch das selbe Verhalten. mfG Stephan |
AW: Emulierter Mausklick bugt
Bei mir hat das bisher immer wunderbar funktioniert. Allerdings habe ich niemals das Mouse-Down und das Mouse-Up direkt hintereinander gesendet. Probiere einfach mal ob das ganze funktioniert wenn du es mit einer realistischen Zeitdifferenz ausführst.
|
AW: Emulierter Mausklick bugt
----falscher thread *peinlich*---
|
AW: Emulierter Mausklick bugt
Danke für deine schnelle Antwort. Was verstehst du unter "realistischer" Zeitdifferenz? Wie gesagt, hab schon alle möglichen Werte zwischen 20 und 500ms zwischen den Mouse_events mitm Application.ProcessMessage "gefüllt". Und das direkt hintereinander senden funktioniert. Meine TestApp macht ja nichts anderes.
Hier mal der Code der TestApp, mit der es einwandfrei funktioniert.
Delphi-Quellcode:
Wie gesagt, funktionieren tut es in dem moment nicht, wenn ich den Befehl zum setzen der Mausposition und dann klicken an den Remote-PC schicke (ausser wenn das Programm aufm RemotePC als Admin ausgeführt wird, oder ich es via Delphi einzeln durchsteppe).
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls; type TForm1 = class(TForm) Image1: TImage; Button1: TButton; Label1: TLabel; Label2: TLabel; Label3: TLabel; Label4: TLabel; procedure Button1Click(Sender: TObject); procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); procedure Image1Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; w,h:integer; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin Image1.Picture.LoadFromFile('C:\Users\RaZoR\Desktop\Unbenannt.bmp'); end; procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin Label1.Caption:='X: '+inttostr(x); w:=x; Label2.Caption:='Y: '+inttostr(y); h:=y; end; procedure TForm1.Image1Click(Sender: TObject); var xFactor:real; yFactor:real; MousePoint:TPoint; xstor,ystor:integer; xRelation,yRelation:real; begin xFactor:=Image1.Picture.Width / Image1.Width; yFactor:=Image1.Picture.Height / Image1.Height; xRelation:=Screen.Width / Image1.Picture.Width; yRelation:=Screen.Height / Image1.Picture.Height; Label3.Caption:='XFaktor: '+floattostr(xfactor); Label4.Caption:='yFaktor: '+floattostr(yfactor); GetCursorPos(MousePoint); xStor:=MousePoint.X; yStor:=MousePoint.Y; SetCursorPos(Round(w*xFactor*xRelation),Round(h*yFactor*yRelation)); mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0); mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0); SetCursorPos(xStor,yStor); end; end. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:35 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-2025 by Thomas Breitkreuz